From e6c5c0389628b8e3071a4513cd6c64b3b0b97bc6 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 3 Nov 2017 16:04:59 +0000 Subject: [PATCH] Remove rdctype namespace. Rename rdctype::str -> rdcstr, rdcarray, etc * Since these types are more prevalent than originally designed, it makes more sense to remove the namespace for ease of typing/naming. * Also add a specialised type 'bytebuf' for an array of bytes. * This makes mapping easier to SWIG since there's no special casing for namespaced arrays. Especially so for nested cases like rdctype::array -> rdcarray --- qrenderdoc/Code/CaptureContext.cpp | 6 +- qrenderdoc/Code/CaptureContext.h | 21 ++-- .../Code/Interface/CommonPipelineState.cpp | 4 +- .../Code/Interface/PersistantConfig.cpp | 4 +- qrenderdoc/Code/Interface/QRDInterface.h | 12 +- qrenderdoc/Code/ReplayManager.cpp | 14 +-- qrenderdoc/Code/pyrenderdoc/pyconversion.h | 68 ++++++----- qrenderdoc/Code/pyrenderdoc/pyconversion.i | 2 +- qrenderdoc/Code/pyrenderdoc/renderdoc.i | 54 ++++----- qrenderdoc/Code/qrenderdoc.cpp | 2 +- qrenderdoc/Windows/APIInspector.cpp | 6 +- qrenderdoc/Windows/APIInspector.h | 2 +- qrenderdoc/Windows/BufferViewer.cpp | 12 +- .../Windows/ConstantBufferPreviewer.cpp | 19 ++-- qrenderdoc/Windows/ConstantBufferPreviewer.h | 12 +- qrenderdoc/Windows/Dialogs/CaptureDialog.cpp | 12 +- qrenderdoc/Windows/Dialogs/LiveCapture.cpp | 7 +- qrenderdoc/Windows/Dialogs/LiveCapture.h | 2 +- .../Windows/Dialogs/VirtualFileDialog.cpp | 79 +++++++------ qrenderdoc/Windows/EventBrowser.cpp | 5 +- qrenderdoc/Windows/EventBrowser.h | 6 +- qrenderdoc/Windows/MainWindow.cpp | 4 +- .../Windows/PerformanceCounterViewer.cpp | 4 +- .../D3D11PipelineStateViewer.cpp | 12 +- .../PipelineState/D3D11PipelineStateViewer.h | 3 +- .../D3D12PipelineStateViewer.cpp | 20 ++-- .../PipelineState/D3D12PipelineStateViewer.h | 3 +- .../PipelineState/GLPipelineStateViewer.cpp | 2 +- .../PipelineState/GLPipelineStateViewer.h | 3 +- .../PipelineState/PipelineStateViewer.cpp | 6 +- .../PipelineState/PipelineStateViewer.h | 2 +- .../VulkanPipelineStateViewer.cpp | 8 +- .../PipelineState/VulkanPipelineStateViewer.h | 3 +- qrenderdoc/Windows/PixelHistoryView.cpp | 4 +- qrenderdoc/Windows/PixelHistoryView.h | 2 +- qrenderdoc/Windows/PythonShell.cpp | 14 +-- qrenderdoc/Windows/ShaderViewer.cpp | 19 ++-- qrenderdoc/Windows/ShaderViewer.h | 2 +- qrenderdoc/Windows/StatisticsViewer.cpp | 4 +- qrenderdoc/Windows/TextureViewer.cpp | 22 ++-- qrenderdoc/Windows/TextureViewer.h | 7 +- qrenderdoc/Windows/TimelineBar.cpp | 4 +- qrenderdoc/Windows/TimelineBar.h | 2 +- renderdoc/3rdparty/catch/catch.cpp | 4 +- renderdoc/api/replay/basic_types.h | 70 ++++++------ renderdoc/api/replay/control_types.h | 12 +- renderdoc/api/replay/d3d11_pipestate.h | 34 +++--- renderdoc/api/replay/d3d12_pipestate.h | 36 +++--- renderdoc/api/replay/data_types.h | 56 ++++----- renderdoc/api/replay/gl_pipestate.h | 34 +++--- renderdoc/api/replay/renderdoc_replay.h | 107 +++++++++--------- renderdoc/api/replay/shader_types.h | 68 +++++------ renderdoc/api/replay/vk_pipestate.h | 40 +++---- renderdoc/core/android.cpp | 6 +- renderdoc/core/remote_server.cpp | 31 +++-- renderdoc/core/target_control.cpp | 2 +- renderdoc/driver/d3d11/d3d11_analyse.cpp | 2 +- renderdoc/driver/d3d11/d3d11_context.cpp | 2 +- renderdoc/driver/d3d12/d3d12_replay.cpp | 2 +- renderdoc/driver/d3d12/d3d12_replay.h | 2 +- renderdoc/driver/gl/gl_replay.cpp | 3 +- renderdoc/driver/gl/gl_replay.h | 2 +- renderdoc/driver/gl/gl_shader_refl.cpp | 24 ++-- .../driver/shaders/dxbc/dxbc_reflect.cpp | 3 +- .../shaders/spirv/spirv_disassemble.cpp | 6 +- renderdoc/driver/vulkan/vk_core.cpp | 4 +- renderdoc/driver/vulkan/vk_replay.cpp | 4 +- renderdoc/driver/vulkan/vk_replay.h | 2 +- renderdoc/os/os_specific.h | 7 +- renderdoc/os/posix/posix_process.cpp | 4 +- renderdoc/os/win32/sys_win32_hooks.cpp | 4 +- renderdoc/os/win32/win32_process.cpp | 4 +- renderdoc/renderdoc.natvis | 6 +- renderdoc/replay/basic_types_tests.cpp | 30 ++--- renderdoc/replay/capture_file.cpp | 14 +-- renderdoc/replay/entry_points.cpp | 24 ++-- renderdoc/replay/replay_controller.cpp | 65 +++++------ renderdoc/replay/replay_controller.h | 56 +++++---- renderdoc/replay/replay_driver.cpp | 2 +- renderdoc/replay/replay_driver.h | 4 +- renderdoc/replay/replay_output.cpp | 14 +-- renderdoc/serialise/serialiser.h | 67 ++++++++++- renderdoccmd/renderdoccmd.cpp | 22 ++-- renderdoccmd/renderdoccmd_linux.cpp | 12 +- 84 files changed, 711 insertions(+), 679 deletions(-) diff --git a/qrenderdoc/Code/CaptureContext.cpp b/qrenderdoc/Code/CaptureContext.cpp index 38f9e92b6..52edbf2dd 100644 --- a/qrenderdoc/Code/CaptureContext.cpp +++ b/qrenderdoc/Code/CaptureContext.cpp @@ -373,7 +373,7 @@ bool CaptureContext::PassEquivalent(const DrawcallDescription &a, const Drawcall return false; } -bool CaptureContext::ContainsMarker(const rdctype::array &draws) +bool CaptureContext::ContainsMarker(const rdcarray &draws) { bool ret = false; @@ -392,7 +392,7 @@ bool CaptureContext::ContainsMarker(const rdctype::array &d void CaptureContext::AddFakeProfileMarkers() { - rdctype::array &draws = m_Drawcalls; + rdcarray &draws = m_Drawcalls; if(!Config().EventBrowser_AddFake) return; @@ -583,7 +583,7 @@ void CaptureContext::SetEventID(const QVector &exclude, uint32_t s } } -void CaptureContext::AddMessages(const rdctype::array &msgs) +void CaptureContext::AddMessages(const rdcarray &msgs) { m_UnreadMessageCount += msgs.count(); for(const DebugMessage &msg : msgs) diff --git a/qrenderdoc/Code/CaptureContext.h b/qrenderdoc/Code/CaptureContext.h index 42b25e28f..56cfae48c 100644 --- a/qrenderdoc/Code/CaptureContext.h +++ b/qrenderdoc/Code/CaptureContext.h @@ -108,11 +108,11 @@ public: const DrawcallDescription *CurDrawcall() override { return GetDrawcall(CurEvent()); } const DrawcallDescription *GetFirstDrawcall() override { return m_FirstDrawcall; }; const DrawcallDescription *GetLastDrawcall() override { return m_LastDrawcall; }; - const rdctype::array &CurDrawcalls() override { return m_Drawcalls; } + const rdcarray &CurDrawcalls() override { return m_Drawcalls; } TextureDescription *GetTexture(ResourceId id) override { return m_Textures[id]; } - const rdctype::array &GetTextures() override { return m_TextureList; } + const rdcarray &GetTextures() override { return m_TextureList; } BufferDescription *GetBuffer(ResourceId id) override { return m_Buffers[id]; } - const rdctype::array &GetBuffers() override { return m_BufferList; } + const rdcarray &GetBuffers() override { return m_BufferList; } const DrawcallDescription *GetDrawcall(uint32_t eventID) override { return GetDrawcall(m_Drawcalls, eventID); @@ -124,7 +124,7 @@ public: const QVector &DebugMessages() override { return m_DebugMessages; } int UnreadMessageCount() override { return m_UnreadMessageCount; } void MarkMessagesRead() override { m_UnreadMessageCount = 0; } - void AddMessages(const rdctype::array &msgs) override; + void AddMessages(const rdcarray &msgs) override; IMainWindow *GetMainWindow() override; IEventBrowser *GetEventBrowser() override; @@ -216,7 +216,7 @@ private: int m_UnreadMessageCount = 0; bool PassEquivalent(const DrawcallDescription &a, const DrawcallDescription &b); - bool ContainsMarker(const rdctype::array &m_Drawcalls); + bool ContainsMarker(const rdcarray &m_Drawcalls); void AddFakeProfileMarkers(); float m_LoadProgress = 0.0f; @@ -229,8 +229,7 @@ private: uint32_t m_SelectedEventID; uint32_t m_EventID; - const DrawcallDescription *GetDrawcall(const rdctype::array &draws, - uint32_t eventID) + const DrawcallDescription *GetDrawcall(const rdcarray &draws, uint32_t eventID) { for(const DrawcallDescription &d : draws) { @@ -250,7 +249,7 @@ private: void setupDockWindow(QWidget *shad); - rdctype::array m_Drawcalls; + rdcarray m_Drawcalls; APIProperties m_APIProps; FrameDescription m_FrameInfo; @@ -258,11 +257,11 @@ private: DrawcallDescription *m_LastDrawcall = NULL; QMap m_Textures; - rdctype::array m_TextureList; + rdcarray m_TextureList; QMap m_Buffers; - rdctype::array m_BufferList; + rdcarray m_BufferList; - rdctype::array m_WinSystems; + rdcarray m_WinSystems; WindowingSystem m_CurWinSystem; diff --git a/qrenderdoc/Code/Interface/CommonPipelineState.cpp b/qrenderdoc/Code/Interface/CommonPipelineState.cpp index 28a127927..127ee40c8 100644 --- a/qrenderdoc/Code/Interface/CommonPipelineState.cpp +++ b/qrenderdoc/Code/Interface/CommonPipelineState.cpp @@ -700,7 +700,7 @@ QVector CommonPipelineState::GetVertexInputs() if(m_D3D11->m_IA.Bytecode != NULL) { - rdctype::array &sig = m_D3D11->m_IA.Bytecode->InputSig; + rdcarray &sig = m_D3D11->m_IA.Bytecode->InputSig; for(int ia = 0; ia < sig.count(); ia++) { if(!semName.compare(sig[ia].semanticName, Qt::CaseInsensitive) && @@ -757,7 +757,7 @@ QVector CommonPipelineState::GetVertexInputs() if(m_D3D12->m_VS.ShaderDetails != NULL) { - rdctype::array &sig = m_D3D12->m_VS.ShaderDetails->InputSig; + rdcarray &sig = m_D3D12->m_VS.ShaderDetails->InputSig; for(int ia = 0; ia < sig.count(); ia++) { if(!semName.compare(sig[ia].semanticName, Qt::CaseInsensitive) && diff --git a/qrenderdoc/Code/Interface/PersistantConfig.cpp b/qrenderdoc/Code/Interface/PersistantConfig.cpp index e61c760de..3ba4cb4b8 100644 --- a/qrenderdoc/Code/Interface/PersistantConfig.cpp +++ b/qrenderdoc/Code/Interface/PersistantConfig.cpp @@ -193,7 +193,7 @@ void PersistantConfig::AddAndroidHosts() SetConfigSetting(lit("Android_AutoPushLayerToApp"), Android_AutoPushLayerToApp ? lit("1") : lit("0")); - rdctype::str androidHosts; + rdcstr androidHosts; RENDERDOC_EnumerateAndroidDevices(&androidHosts); for(const QString &hostName : QString(androidHosts).split(QLatin1Char(','), QString::SkipEmptyParts)) @@ -206,7 +206,7 @@ void PersistantConfig::AddAndroidHosts() host = new RemoteHost(); host->Hostname = hostName; - rdctype::str friendly; + rdcstr friendly; RENDERDOC_GetAndroidFriendlyName(hostName.toUtf8().data(), friendly); host->FriendlyName = friendly; // Just a command to display in the GUI and allow Launch() to be called. diff --git a/qrenderdoc/Code/Interface/QRDInterface.h b/qrenderdoc/Code/Interface/QRDInterface.h index f4b801d53..acc71e7e1 100644 --- a/qrenderdoc/Code/Interface/QRDInterface.h +++ b/qrenderdoc/Code/Interface/QRDInterface.h @@ -529,7 +529,7 @@ struct IPixelHistoryView :param list history: A list of :class:`~renderdoc.PixelModification` events to display. )"); - virtual void SetHistory(const rdctype::array &history) = 0; + virtual void SetHistory(const rdcarray &history) = 0; protected: IPixelHistoryView() = default; @@ -598,7 +598,7 @@ in UI side structures. This manager controls and serialises access to the underl struct IReplayManager { typedef std::function InvokeCallback; - typedef std::function &)> DirectoryBrowseCallback; + typedef std::function &)> DirectoryBrowseCallback; DOCUMENT(R"(Delete a capture file, whether local or remote. @@ -1005,7 +1005,7 @@ more information for how this differs. :return: The root drawcalls. :rtype: ``list`` of :class:`~renderdoc.DrawcallDescription` )"); - virtual const rdctype::array &CurDrawcalls() = 0; + virtual const rdcarray &CurDrawcalls() = 0; DOCUMENT(R"(Retrieve the information about a particular texture. @@ -1020,7 +1020,7 @@ more information for how this differs. :return: The list of textures. :rtype: ``list`` of :class:`~renderdoc.TextureDescription` )"); - virtual const rdctype::array &GetTextures() = 0; + virtual const rdcarray &GetTextures() = 0; DOCUMENT(R"(Retrieve the information about a particular buffer. @@ -1035,7 +1035,7 @@ more information for how this differs. :return: The list of buffers. :rtype: ``list`` of :class:`~renderdoc.BufferDescription` )"); - virtual const rdctype::array &GetBuffers() = 0; + virtual const rdcarray &GetBuffers() = 0; DOCUMENT(R"(Retrieve the information about a drawcall at a given :data:`EID `. @@ -1090,7 +1090,7 @@ as well as messages generated during replay and analysis. :param list msgs: A list of :class:`~renderdoc.DebugMessage` to add. )"); - virtual void AddMessages(const rdctype::array &msgs) = 0; + virtual void AddMessages(const rdcarray &msgs) = 0; DOCUMENT(R"(Retrieve the current singleton :class:`MainWindow`. diff --git a/qrenderdoc/Code/ReplayManager.cpp b/qrenderdoc/Code/ReplayManager.cpp index b474a2113..93dd88361 100644 --- a/qrenderdoc/Code/ReplayManager.cpp +++ b/qrenderdoc/Code/ReplayManager.cpp @@ -91,8 +91,8 @@ QStringList ReplayManager::GetRemoteSupport() { QMutexLocker autolock(&m_RemoteLock); - rdctype::array supported = m_Remote->RemoteSupportedReplays(); - for(rdctype::str &s : supported) + rdcarray supported = m_Remote->RemoteSupportedReplays(); + for(rdcstr &s : supported) ret << s; } @@ -107,7 +107,7 @@ void ReplayManager::GetHomeFolder(bool synchronous, DirectoryBrowseCallback cb) if(IsRunning() && m_Thread->isCurrentThread()) { auto lambda = [cb, this](IReplayController *r) { - cb(m_Remote->GetHomeFolder().c_str(), rdctype::array()); + cb(m_Remote->GetHomeFolder().c_str(), rdcarray()); }; if(synchronous) @@ -117,14 +117,14 @@ void ReplayManager::GetHomeFolder(bool synchronous, DirectoryBrowseCallback cb) return; } - rdctype::str home; + rdcstr home; { QMutexLocker autolock(&m_RemoteLock); home = m_Remote->GetHomeFolder(); } - cb(home.c_str(), rdctype::array()); + cb(home.c_str(), rdcarray()); } void ReplayManager::ListFolder(QString path, bool synchronous, DirectoryBrowseCallback cb) @@ -147,7 +147,7 @@ void ReplayManager::ListFolder(QString path, bool synchronous, DirectoryBrowseCa return; } - rdctype::array contents; + rdcarray contents; // prevent pings while fetching remote FS data { @@ -360,7 +360,7 @@ uint32_t ReplayManager::ExecuteAndInject(const QString &exe, const QString &work const QList &env, const QString &logfile, CaptureOptions opts) { - rdctype::array envList = env.toVector().toStdVector(); + rdcarray envList = env.toVector().toStdVector(); uint32_t ret = 0; diff --git a/qrenderdoc/Code/pyrenderdoc/pyconversion.h b/qrenderdoc/Code/pyrenderdoc/pyconversion.h index 1a617362b..1ded1dffb 100644 --- a/qrenderdoc/Code/pyrenderdoc/pyconversion.h +++ b/qrenderdoc/Code/pyrenderdoc/pyconversion.h @@ -305,9 +305,9 @@ struct TypeConversion // specialisation for pair template -struct TypeConversion, false> +struct TypeConversion, false> { - static int ConvertFromPy(PyObject *in, rdctype::pair &out, int *failIdx) + static int ConvertFromPy(PyObject *in, rdcpair &out, int *failIdx) { if(!PyTuple_Check(in)) return SWIG_TypeError; @@ -338,12 +338,12 @@ struct TypeConversion, false> return ret; } - static int ConvertFromPy(PyObject *in, rdctype::pair &out) + static int ConvertFromPy(PyObject *in, rdcpair &out) { return ConvertFromPy(in, out, NULL); } - static PyObject *ConvertToPy(const rdctype::pair &in, int *failIdx) + static PyObject *ConvertToPy(const rdcpair &in, int *failIdx) { PyObject *first = TypeConversion::ConvertToPy(in.first); if(!first) @@ -371,16 +371,16 @@ struct TypeConversion, false> return ret; } - static PyObject *ConvertToPy(const rdctype::pair &in) { return ConvertToPy(in, NULL); } + static PyObject *ConvertToPy(const rdcpair &in) { return ConvertToPy(in, NULL); } }; -// specialisation for array +// specialisation for bytebuf template <> -struct TypeConversion, false> +struct TypeConversion { // we add some extra parameters so the typemaps for array can use these to get // nicer failure error messages out with the index that failed - static int ConvertFromPy(PyObject *in, rdctype::array &out, int *failIdx) + static int ConvertFromPy(PyObject *in, bytebuf &out, int *failIdx) { if(!PyBytes_Check(in)) return SWIG_TypeError; @@ -393,32 +393,41 @@ struct TypeConversion, false> return SWIG_OK; } - static int ConvertFromPy(PyObject *in, rdctype::array &out) - { - return ConvertFromPy(in, out, NULL); - } - - static PyObject *ConvertToPyInPlace(PyObject *list, const rdctype::array &in, int *failIdx) + static int ConvertFromPy(PyObject *in, bytebuf &out) { return ConvertFromPy(in, out, NULL); } + static PyObject *ConvertToPyInPlace(PyObject *list, const bytebuf &in, int *failIdx) { // can't modify bytes objects return SWIG_Py_Void(); } - static PyObject *ConvertToPy(const rdctype::array &in, int *failIdx) + static PyObject *ConvertToPy(const bytebuf &in, int *failIdx) { return PyBytes_FromStringAndSize((const char *)in.data(), (Py_ssize_t)in.size()); } - static PyObject *ConvertToPy(const rdctype::array &in) { return ConvertToPy(in, NULL); } + static PyObject *ConvertToPy(const bytebuf &in) { return ConvertToPy(in, NULL); } }; // specialisation for array template -struct TypeConversion, false> +struct TypeConversion, false> { + static swig_type_info *GetTypeInfo() + { + static swig_type_info *cached_type_info = NULL; + static std::string typeName = std::string("rdcarray < ") + TypeName() + " > *"; + + if(cached_type_info) + return cached_type_info; + + cached_type_info = SWIG_TypeQuery(typeName.c_str()); + + return cached_type_info; + } + // we add some extra parameters so the typemaps for array can use these to get // nicer failure error messages out with the index that failed - static int ConvertFromPy(PyObject *in, rdctype::array &out, int *failIdx) + static int ConvertFromPy(PyObject *in, rdcarray &out, int *failIdx) { if(!PyList_Check(in)) return SWIG_TypeError; @@ -439,11 +448,8 @@ struct TypeConversion, false> return SWIG_OK; } - static int ConvertFromPy(PyObject *in, rdctype::array &out) - { - return ConvertFromPy(in, out, NULL); - } - static PyObject *ConvertToPyInPlace(PyObject *list, const rdctype::array &in, int *failIdx) + static int ConvertFromPy(PyObject *in, rdcarray &out) { return ConvertFromPy(in, out, NULL); } + static PyObject *ConvertToPyInPlace(PyObject *list, const rdcarray &in, int *failIdx) { for(int i = 0; i < in.count(); i++) { @@ -465,7 +471,7 @@ struct TypeConversion, false> return list; } - static PyObject *ConvertToPy(const rdctype::array &in, int *failIdx) + static PyObject *ConvertToPy(const rdcarray &in, int *failIdx) { PyObject *list = PyList_New(0); if(!list) @@ -480,12 +486,12 @@ struct TypeConversion, false> return ret; } - static PyObject *ConvertToPy(const rdctype::array &in) { return ConvertToPy(in, NULL); } + static PyObject *ConvertToPy(const rdcarray &in) { return ConvertToPy(in, NULL); } }; // specialisation for string template <> -struct TypeConversion +struct TypeConversion { static swig_type_info *GetTypeInfo() { @@ -494,12 +500,12 @@ struct TypeConversion if(cached_type_info) return cached_type_info; - cached_type_info = SWIG_TypeQuery("rdctype::str *"); + cached_type_info = SWIG_TypeQuery("rdcstr *"); return cached_type_info; } - static int ConvertFromPy(PyObject *in, rdctype::str &out) + static int ConvertFromPy(PyObject *in, rdcstr &out) { if(PyUnicode_Check(in)) { @@ -531,7 +537,7 @@ struct TypeConversion if(!type_info) return SWIG_ERROR; - rdctype::str *ptr = NULL; + rdcstr *ptr = NULL; int res = SWIG_ConvertPtr(in, (void **)&ptr, type_info, 0); if(SWIG_IsOK(res)) out = *ptr; @@ -539,7 +545,7 @@ struct TypeConversion return res; } - static PyObject *ConvertToPy(const rdctype::str &in) + static PyObject *ConvertToPy(const rdcstr &in) { return PyUnicode_FromStringAndSize(in.c_str(), in.size()); } @@ -1089,4 +1095,4 @@ template inline typename std::remove_pointer::type &indirect(T &ptr) { return pointer_unwrap::indirect(ptr); -} \ No newline at end of file +} diff --git a/qrenderdoc/Code/pyrenderdoc/pyconversion.i b/qrenderdoc/Code/pyrenderdoc/pyconversion.i index be03fd06e..d913b907b 100644 --- a/qrenderdoc/Code/pyrenderdoc/pyconversion.i +++ b/qrenderdoc/Code/pyrenderdoc/pyconversion.i @@ -120,4 +120,4 @@ CONTAINER_TYPEMAPS_VARIANT(ContainerType) CONTAINER_TYPEMAPS_VARIANT(ContainerType *) CONTAINER_TYPEMAPS_VARIANT(ContainerType &) -%enddef \ No newline at end of file +%enddef diff --git a/qrenderdoc/Code/pyrenderdoc/renderdoc.i b/qrenderdoc/Code/pyrenderdoc/renderdoc.i index 7cc83b4b0..5c9c77cb3 100644 --- a/qrenderdoc/Code/pyrenderdoc/renderdoc.i +++ b/qrenderdoc/Code/pyrenderdoc/renderdoc.i @@ -15,7 +15,7 @@ #define DOCUMENT3(text1, text2, text3) %feature("docstring") text1 text2 text3 #define DOCUMENT4(text1, text2, text3, text4) %feature("docstring") text1 text2 text3 text4 -// ignore warning about base class rdctype::array methods in rdctype::str +// ignore warning about base class rdcarray methods in rdcstr #pragma SWIG nowarn=401 // ignore warning about redundant declaration of typedef (byte) @@ -50,10 +50,10 @@ %include "pyconversion.i" -SIMPLE_TYPEMAPS(rdctype::str) +SIMPLE_TYPEMAPS(rdcstr) -CONTAINER_TYPEMAPS(rdctype::array) -CONTAINER_TYPEMAPS(rdctype::pair) +CONTAINER_TYPEMAPS(rdcarray) +CONTAINER_TYPEMAPS(rdcpair) FIXED_ARRAY_TYPEMAPS(ResourceId) FIXED_ARRAY_TYPEMAPS(double) @@ -78,29 +78,29 @@ FIXED_ARRAY_TYPEMAPS(uint16_t) // ignore some operators SWIG doesn't have to worry about // ignore array members -%ignore rdctype::array::array; -%ignore rdctype::array::begin; -%ignore rdctype::array::end; -%ignore rdctype::array::front; -%ignore rdctype::array::back; -%ignore rdctype::array::data; -%ignore rdctype::array::assign; -%ignore rdctype::array::insert; -%ignore rdctype::array::erase; -%ignore rdctype::array::count; -%ignore rdctype::array::capacity; -%ignore rdctype::array::size; -%ignore rdctype::array::byteSize; -%ignore rdctype::array::empty; -%ignore rdctype::array::isEmpty; -%ignore rdctype::array::resize; -%ignore rdctype::array::reserve; -%ignore rdctype::array::swap; -%ignore rdctype::array::push_back; -%ignore rdctype::array::operator=; -%ignore rdctype::array::operator[]; -%ignore rdctype::str::operator=; -%ignore rdctype::str::operator std::string; +%ignore rdcarray::rdcarray; +%ignore rdcarray::begin; +%ignore rdcarray::end; +%ignore rdcarray::front; +%ignore rdcarray::back; +%ignore rdcarray::data; +%ignore rdcarray::assign; +%ignore rdcarray::insert; +%ignore rdcarray::erase; +%ignore rdcarray::count; +%ignore rdcarray::capacity; +%ignore rdcarray::size; +%ignore rdcarray::byteSize; +%ignore rdcarray::empty; +%ignore rdcarray::isEmpty; +%ignore rdcarray::resize; +%ignore rdcarray::reserve; +%ignore rdcarray::swap; +%ignore rdcarray::push_back; +%ignore rdcarray::operator=; +%ignore rdcarray::operator[]; +%ignore rdcstr::operator=; +%ignore rdcstr::operator std::string; // add __str__ functions %feature("python:tp_str") ResourceId "resid_str"; diff --git a/qrenderdoc/Code/qrenderdoc.cpp b/qrenderdoc/Code/qrenderdoc.cpp index 0464a48f2..15bbcd26d 100644 --- a/qrenderdoc/Code/qrenderdoc.cpp +++ b/qrenderdoc/Code/qrenderdoc.cpp @@ -226,7 +226,7 @@ int main(int argc, char *argv[]) #if defined(RENDERDOC_PLATFORM_LINUX) env.xlibDisplay = QX11Info::display(); #endif - RENDERDOC_InitGlobalEnv(env, rdctype::array()); + RENDERDOC_InitGlobalEnv(env, rdcarray()); } { diff --git a/qrenderdoc/Windows/APIInspector.cpp b/qrenderdoc/Windows/APIInspector.cpp index 79fed2086..c0f365ea4 100644 --- a/qrenderdoc/Windows/APIInspector.cpp +++ b/qrenderdoc/Windows/APIInspector.cpp @@ -73,7 +73,7 @@ void APIInspector::OnSelectedEventChanged(uint32_t eventID) fillAPIView(); } -void APIInspector::addCallstack(rdctype::array calls) +void APIInspector::addCallstack(rdcarray calls) { ui->callstack->setUpdatesEnabled(false); ui->callstack->clear(); @@ -84,7 +84,7 @@ void APIInspector::addCallstack(rdctype::array calls) } else { - for(rdctype::str &s : calls) + for(rdcstr &s : calls) ui->callstack->addItem(s); } ui->callstack->setUpdatesEnabled(true); @@ -102,7 +102,7 @@ void APIInspector::on_apiEvents_itemSelectionChanged() if(!ev.callstack.isEmpty()) { m_Ctx.Replay().AsyncInvoke([this, ev](IReplayController *r) { - rdctype::array trace = r->GetResolve(ev.callstack); + rdcarray trace = r->GetResolve(ev.callstack); GUIInvoke::call([this, trace]() { addCallstack(trace); }); }); diff --git a/qrenderdoc/Windows/APIInspector.h b/qrenderdoc/Windows/APIInspector.h index 62d2c6858..98217c48c 100644 --- a/qrenderdoc/Windows/APIInspector.h +++ b/qrenderdoc/Windows/APIInspector.h @@ -55,6 +55,6 @@ private: Ui::APIInspector *ui; ICaptureContext &m_Ctx; - void addCallstack(rdctype::array calls); + void addCallstack(rdcarray calls); void fillAPIView(); }; diff --git a/qrenderdoc/Windows/BufferViewer.cpp b/qrenderdoc/Windows/BufferViewer.cpp index d09e5e3e5..cf7df637f 100644 --- a/qrenderdoc/Windows/BufferViewer.cpp +++ b/qrenderdoc/Windows/BufferViewer.cpp @@ -1420,7 +1420,7 @@ void BufferViewer::OnEventChanged(uint32_t eventID) else { buf = new BufferData; - rdctype::array data; + bytebuf data; if(m_IsBuffer) { uint64_t len = m_ByteSize; @@ -1507,7 +1507,7 @@ void BufferViewer::RT_FetchMeshData(IReplayController *r) QVector vbs = m_Ctx.CurPipelineState().GetVBuffers(); - rdctype::array idata; + bytebuf idata; if(ib.first != ResourceId() && draw && (draw->flags & DrawFlags::UseIBuffer)) idata = r->GetBufferData(ib.first, ib.second + draw->indexOffset * draw->indexByteWidth, draw->numIndices * draw->indexByteWidth); @@ -1621,8 +1621,8 @@ void BufferViewer::RT_FetchMeshData(IReplayController *r) BufferData *buf = new BufferData; if(used) { - rdctype::array bufdata = r->GetBufferData( - vb.Buffer, vb.ByteOffset + offset * vb.ByteStride, (maxIdx + 1) * vb.ByteStride); + bytebuf bufdata = r->GetBufferData(vb.Buffer, vb.ByteOffset + offset * vb.ByteStride, + (maxIdx + 1) * vb.ByteStride); buf->data = new byte[bufdata.size()]; memcpy(buf->data, bufdata.data(), bufdata.size()); @@ -1680,7 +1680,7 @@ void BufferViewer::RT_FetchMeshData(IReplayController *r) if(m_PostVS.buf != ResourceId()) { BufferData *postvs = new BufferData; - rdctype::array bufdata = r->GetBufferData(m_PostVS.buf, m_PostVS.offset, 0); + bytebuf bufdata = r->GetBufferData(m_PostVS.buf, m_PostVS.offset, 0); postvs->data = new byte[bufdata.size()]; memcpy(postvs->data, bufdata.data(), bufdata.size()); @@ -1701,7 +1701,7 @@ void BufferViewer::RT_FetchMeshData(IReplayController *r) if(m_PostGS.buf != ResourceId()) { BufferData *postgs = new BufferData; - rdctype::array bufdata = r->GetBufferData(m_PostGS.buf, m_PostGS.offset, 0); + bytebuf bufdata = r->GetBufferData(m_PostGS.buf, m_PostGS.offset, 0); postgs->data = new byte[bufdata.size()]; memcpy(postgs->data, bufdata.data(), bufdata.size()); diff --git a/qrenderdoc/Windows/ConstantBufferPreviewer.cpp b/qrenderdoc/Windows/ConstantBufferPreviewer.cpp index 800c3c7a9..f68bc896e 100644 --- a/qrenderdoc/Windows/ConstantBufferPreviewer.cpp +++ b/qrenderdoc/Windows/ConstantBufferPreviewer.cpp @@ -126,15 +126,15 @@ void ConstantBufferPreviewer::OnEventChanged(uint32_t eventID) if(!m_formatOverride.empty()) { m_Ctx.Replay().AsyncInvoke([this, offs, size](IReplayController *r) { - rdctype::array data = r->GetBufferData(m_cbuffer, offs, size); - rdctype::array vars = applyFormatOverride(data); + bytebuf data = r->GetBufferData(m_cbuffer, offs, size); + rdcarray vars = applyFormatOverride(data); GUIInvoke::call([this, vars] { setVariables(vars); }); }); } else { m_Ctx.Replay().AsyncInvoke([this, entryPoint, offs](IReplayController *r) { - rdctype::array vars = r->GetCBufferVariableContents( + rdcarray vars = r->GetCBufferVariableContents( m_shader, entryPoint.toUtf8().data(), m_slot, m_cbuffer, offs); GUIInvoke::call([this, vars] { setVariables(vars); }); }); @@ -226,7 +226,7 @@ void ConstantBufferPreviewer::processFormat(const QString &format) } void ConstantBufferPreviewer::addVariables(RDTreeWidgetItem *root, - const rdctype::array &vars) + const rdcarray &vars) { for(const ShaderVariable &v : vars) { @@ -247,8 +247,8 @@ void ConstantBufferPreviewer::addVariables(RDTreeWidgetItem *root, } bool ConstantBufferPreviewer::updateVariables(RDTreeWidgetItem *root, - const rdctype::array &prevVars, - const rdctype::array &newVars) + const rdcarray &prevVars, + const rdcarray &newVars) { // mismatched child count? can't update if(prevVars.size() != newVars.size()) @@ -293,7 +293,7 @@ bool ConstantBufferPreviewer::updateVariables(RDTreeWidgetItem *root, return true; } -void ConstantBufferPreviewer::setVariables(const rdctype::array &vars) +void ConstantBufferPreviewer::setVariables(const rdcarray &vars) { ui->variables->beginUpdate(); @@ -364,8 +364,7 @@ void ConstantBufferPreviewer::updateLabels() setWindowTitle(title); } -rdctype::array ConstantBufferPreviewer::applyFormatOverride( - const rdctype::array &bytes) +rdcarray ConstantBufferPreviewer::applyFormatOverride(const bytebuf &bytes) { QVector variables; @@ -377,7 +376,7 @@ rdctype::array ConstantBufferPreviewer::applyFormatOverride( variables[i] = m_formatOverride[i].GetShaderVar(b, bytes.end()); } - rdctype::array ret; + rdcarray ret; ret = variables.toStdVector(); return ret; } diff --git a/qrenderdoc/Windows/ConstantBufferPreviewer.h b/qrenderdoc/Windows/ConstantBufferPreviewer.h index a9db464de..0b61f645a 100644 --- a/qrenderdoc/Windows/ConstantBufferPreviewer.h +++ b/qrenderdoc/Windows/ConstantBufferPreviewer.h @@ -75,15 +75,15 @@ private: void exportCSV(QTextStream &ts, const QString &prefix, RDTreeWidgetItem *item); - rdctype::array applyFormatOverride(const rdctype::array &data); + rdcarray applyFormatOverride(const bytebuf &data); - void addVariables(RDTreeWidgetItem *root, const rdctype::array &vars); - void setVariables(const rdctype::array &vars); + void addVariables(RDTreeWidgetItem *root, const rdcarray &vars); + void setVariables(const rdcarray &vars); - rdctype::array m_Vars; + rdcarray m_Vars; - bool updateVariables(RDTreeWidgetItem *root, const rdctype::array &prevVars, - const rdctype::array &newVars); + bool updateVariables(RDTreeWidgetItem *root, const rdcarray &prevVars, + const rdcarray &newVars); void updateLabels(); diff --git a/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp b/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp index ba535d66b..daac1ce28 100644 --- a/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp +++ b/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp @@ -281,8 +281,8 @@ void CaptureDialog::vulkanLayerWarn_mouseClick() QString caption = tr("Configure Vulkan layer settings in registry?"); VulkanLayerFlags flags = VulkanLayerFlags::NoFlags; - rdctype::array myJSONs; - rdctype::array otherJSONs; + rdcarray myJSONs; + rdcarray otherJSONs; RENDERDOC_NeedVulkanLayerRegistration(&flags, &myJSONs, &otherJSONs); @@ -299,7 +299,7 @@ void CaptureDialog::vulkanLayerWarn_mouseClick() tr("There is an unfixable problem with your vulkan layer configuration. Please consult the " "RenderDoc documentation, or package/distribution documentation on linux\n\n"); - for(const rdctype::str &j : otherJSONs) + for(const rdcstr &j : otherJSONs) msg += j + lit("\n"); RDDialog::critical(this, tr("Unfixable vulkan layer configuration"), msg); @@ -336,7 +336,7 @@ void CaptureDialog::vulkanLayerWarn_mouseClick() if(hasOtherJSON) { - for(const rdctype::str &j : otherJSONs) + for(const rdcstr &j : otherJSONs) msg += (updateAllowed ? tr("Unregister/update: %1\n") : tr("Unregister: %1\n")).arg(j); msg += lit("\n"); @@ -346,13 +346,13 @@ void CaptureDialog::vulkanLayerWarn_mouseClick() { if(registerAll) { - for(const rdctype::str &j : myJSONs) + for(const rdcstr &j : myJSONs) msg += (updateAllowed ? tr("Register/update: %1\n") : tr("Register: %1\n")).arg(j); } else { msg += updateAllowed ? tr("Register one of:\n") : tr("Register/update one of:\n"); - for(const rdctype::str &j : myJSONs) + for(const rdcstr &j : myJSONs) msg += tr(" -- %1\n").arg(j); } diff --git a/qrenderdoc/Windows/Dialogs/LiveCapture.cpp b/qrenderdoc/Windows/Dialogs/LiveCapture.cpp index f58a6744a..0ba308b36 100644 --- a/qrenderdoc/Windows/Dialogs/LiveCapture.cpp +++ b/qrenderdoc/Windows/Dialogs/LiveCapture.cpp @@ -891,9 +891,8 @@ void LiveCapture::captureCopied(uint32_t ID, const QString &localPath) } void LiveCapture::captureAdded(uint32_t ID, const QString &executable, const QString &api, - const rdctype::array &thumbnail, int32_t thumbWidth, - int32_t thumbHeight, QDateTime timestamp, const QString &path, - bool local) + const bytebuf &thumbnail, int32_t thumbWidth, int32_t thumbHeight, + QDateTime timestamp, const QString &path, bool local) { CaptureLog *log = new CaptureLog(); log->remoteID = ID; @@ -1101,7 +1100,7 @@ void LiveCapture::connectionThreadEntry() uint32_t capID = msg.NewCapture.ID; QDateTime timestamp = QDateTime(QDate(1970, 1, 1), QTime(0, 0, 0)); timestamp = timestamp.addSecs(msg.NewCapture.timestamp).toLocalTime(); - rdctype::array thumb = msg.NewCapture.thumbnail; + bytebuf thumb = msg.NewCapture.thumbnail; int32_t thumbWidth = msg.NewCapture.thumbWidth; int32_t thumbHeight = msg.NewCapture.thumbHeight; QString path = msg.NewCapture.path; diff --git a/qrenderdoc/Windows/Dialogs/LiveCapture.h b/qrenderdoc/Windows/Dialogs/LiveCapture.h index 9467442d1..c66627e50 100644 --- a/qrenderdoc/Windows/Dialogs/LiveCapture.h +++ b/qrenderdoc/Windows/Dialogs/LiveCapture.h @@ -122,7 +122,7 @@ private: void connectionThreadEntry(); void captureCopied(uint32_t ID, const QString &localPath); void captureAdded(uint32_t ID, const QString &executable, const QString &api, - const rdctype::array &thumbnail, int32_t thumbWidth, int32_t thumbHeight, + const bytebuf &thumbnail, int32_t thumbWidth, int32_t thumbHeight, QDateTime timestamp, const QString &path, bool local); void connectionClosed(); diff --git a/qrenderdoc/Windows/Dialogs/VirtualFileDialog.cpp b/qrenderdoc/Windows/Dialogs/VirtualFileDialog.cpp index 0066cf0ee..2961db526 100644 --- a/qrenderdoc/Windows/Dialogs/VirtualFileDialog.cpp +++ b/qrenderdoc/Windows/Dialogs/VirtualFileDialog.cpp @@ -55,8 +55,7 @@ public: makeIconStates(exeIcon, Pixmaps::page_white_code(parent)); makeIconStates(dirIcon, Pixmaps::folder(parent)); - Renderer.GetHomeFolder(true, [this](const rdctype::str &path, - const rdctype::array &files) { + Renderer.GetHomeFolder(true, [this](const rdcstr &path, const rdcarray &files) { QString homeDir = path; if(QChar(QLatin1Char(path[0])).isLetter() && path[1] == ':') @@ -64,19 +63,19 @@ public: NTPaths = true; // NT paths - Renderer.ListFolder(lit("/"), true, [this, homeDir](const rdctype::str &path, - const rdctype::array &files) { - for(int i = 0; i < files.count(); i++) - { - FSNode *node = new FSNode(); - node->parent = NULL; - node->parentIndex = i; - node->file = files[i]; - roots.push_back(node); + Renderer.ListFolder(lit("/"), true, + [this, homeDir](const rdcstr &path, const rdcarray &files) { + for(int i = 0; i < files.count(); i++) + { + FSNode *node = new FSNode(); + node->parent = NULL; + node->parentIndex = i; + node->file = files[i]; + roots.push_back(node); - home = indexForPath(homeDir); - } - }); + home = indexForPath(homeDir); + } + }); } else { @@ -449,37 +448,37 @@ private: if(!(node->file.flags & PathProperty::Directory)) return; - Renderer.ListFolder(makePath(node), true, [this, node](const rdctype::str &path, - const rdctype::array &files) { + Renderer.ListFolder( + makePath(node), true, [this, node](const rdcstr &path, const rdcarray &files) { - if(files.count() == 1 && (files[0].flags & PathProperty::ErrorAccessDenied)) - { - node->file.flags |= PathProperty::ErrorAccessDenied; - return; - } + if(files.count() == 1 && (files[0].flags & PathProperty::ErrorAccessDenied)) + { + node->file.flags |= PathProperty::ErrorAccessDenied; + return; + } - QVector sortedFiles; - sortedFiles.reserve(files.count()); - for(const PathEntry &f : files) - sortedFiles.push_back(f); + QVector sortedFiles; + sortedFiles.reserve(files.count()); + for(const PathEntry &f : files) + sortedFiles.push_back(f); - qSort(sortedFiles.begin(), sortedFiles.end(), [](const PathEntry &a, const PathEntry &b) { - // sort greater than so that files with the flag are sorted before those without - if((a.flags & PathProperty::Directory) != (b.flags & PathProperty::Directory)) - return (a.flags & PathProperty::Directory) > (b.flags & PathProperty::Directory); + qSort(sortedFiles.begin(), sortedFiles.end(), [](const PathEntry &a, const PathEntry &b) { + // sort greater than so that files with the flag are sorted before those without + if((a.flags & PathProperty::Directory) != (b.flags & PathProperty::Directory)) + return (a.flags & PathProperty::Directory) > (b.flags & PathProperty::Directory); - return strcmp(a.filename.c_str(), b.filename.c_str()) < 0; - }); + return strcmp(a.filename.c_str(), b.filename.c_str()) < 0; + }); - for(int i = 0; i < sortedFiles.count(); i++) - { - FSNode *child = new FSNode(); - child->parent = node; - child->parentIndex = i; - child->file = sortedFiles[i]; - node->children.push_back(child); - } - }); + for(int i = 0; i < sortedFiles.count(); i++) + { + FSNode *child = new FSNode(); + child->parent = node; + child->parentIndex = i; + child->file = sortedFiles[i]; + node->children.push_back(child); + } + }); } }; diff --git a/qrenderdoc/Windows/EventBrowser.cpp b/qrenderdoc/Windows/EventBrowser.cpp index abc3de5f0..31e08b6a8 100644 --- a/qrenderdoc/Windows/EventBrowser.cpp +++ b/qrenderdoc/Windows/EventBrowser.cpp @@ -224,7 +224,7 @@ void EventBrowser::OnEventChanged(uint32_t eventID) } QPair EventBrowser::AddDrawcalls(RDTreeWidgetItem *parent, - const rdctype::array &draws) + const rdcarray &draws) { uint lastEID = 0, lastDraw = 0; @@ -282,8 +282,7 @@ QPair EventBrowser::AddDrawcalls(RDTreeWidgetItem *parent, return qMakePair(lastEID, lastDraw); } -void EventBrowser::SetDrawcallTimes(RDTreeWidgetItem *node, - const rdctype::array &results) +void EventBrowser::SetDrawcallTimes(RDTreeWidgetItem *node, const rdcarray &results) { if(node == NULL) return; diff --git a/qrenderdoc/Windows/EventBrowser.h b/qrenderdoc/Windows/EventBrowser.h index cc3501a20..c6bd49c36 100644 --- a/qrenderdoc/Windows/EventBrowser.h +++ b/qrenderdoc/Windows/EventBrowser.h @@ -96,8 +96,8 @@ public slots: private: QPair AddDrawcalls(RDTreeWidgetItem *parent, - const rdctype::array &draws); - void SetDrawcallTimes(RDTreeWidgetItem *node, const rdctype::array &results); + const rdcarray &draws); + void SetDrawcallTimes(RDTreeWidgetItem *node, const rdcarray &results); void ExpandNode(RDTreeWidgetItem *node); @@ -129,7 +129,7 @@ private: TimeUnit m_TimeUnit = TimeUnit::Count; - rdctype::array m_Times; + rdcarray m_Times; QTimer *m_FindHighlight; diff --git a/qrenderdoc/Windows/MainWindow.cpp b/qrenderdoc/Windows/MainWindow.cpp index a7fab9c6a..89bfdecc5 100644 --- a/qrenderdoc/Windows/MainWindow.cpp +++ b/qrenderdoc/Windows/MainWindow.cpp @@ -347,7 +347,7 @@ void MainWindow::OnInjectTrigger(uint32_t PID, const QList envList = env.toVector().toStdVector(); + rdcarray envList = env.toVector().toStdVector(); LambdaThread *th = new LambdaThread([this, PID, envList, name, opts, callback]() { QString logfile = m_Ctx.TempLogFilename(name); @@ -1001,7 +1001,7 @@ void MainWindow::messageCheck() if(m_Ctx.LogLoaded()) { m_Ctx.Replay().AsyncInvoke([this](IReplayController *r) { - rdctype::array msgs = r->GetDebugMessages(); + rdcarray msgs = r->GetDebugMessages(); bool disconnected = false; diff --git a/qrenderdoc/Windows/PerformanceCounterViewer.cpp b/qrenderdoc/Windows/PerformanceCounterViewer.cpp index cfea0e210..637a6a4e8 100644 --- a/qrenderdoc/Windows/PerformanceCounterViewer.cpp +++ b/qrenderdoc/Windows/PerformanceCounterViewer.cpp @@ -188,7 +188,7 @@ void PerformanceCounterViewer::CaptureCounters() bool done = false; m_Ctx.Replay().AsyncInvoke([this, &done](IReplayController *controller) -> void { - rdctype::array counters; + rdcarray counters; counters.resize(m_SelectedCounters.size()); QMap counterDescriptions; @@ -205,7 +205,7 @@ void PerformanceCounterViewer::CaptureCounters() counterIndex.insert((GPUCounter)m_SelectedCounters[i], i); } - const rdctype::array results = controller->FetchCounters(counters); + const rdcarray results = controller->FetchCounters(counters); GUIInvoke::call([this, results, counterDescriptions, counterIndex]() -> void { ui->counterResults->clear(); diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp index 104a5c714..88412d6c9 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp @@ -1164,8 +1164,8 @@ void D3D11PipelineStateViewer::setState() } { - const rdctype::array &IA = state.m_IA.Bytecode->InputSig; - const rdctype::array &VS = state.m_VS.ShaderDetails->InputSig; + const rdcarray &IA = state.m_IA.Bytecode->InputSig; + const rdcarray &VS = state.m_VS.ShaderDetails->InputSig; int count = qMin(IA.count(), VS.count()); @@ -1766,7 +1766,7 @@ void D3D11PipelineStateViewer::setState() } QString D3D11PipelineStateViewer::formatMembers(int indent, const QString &nameprefix, - const rdctype::array &vars) + const rdcarray &vars) { QString indentstr(indent * 4, QLatin1Char(' ')); @@ -1919,9 +1919,9 @@ void D3D11PipelineStateViewer::resource_itemActivated(RDTreeWidgetItem *item, in if(stage->ShaderDetails) { - const rdctype::array &resArray = - view.type == D3D11ViewTag::SRV ? stage->ShaderDetails->ReadOnlyResources - : stage->ShaderDetails->ReadWriteResources; + const rdcarray &resArray = view.type == D3D11ViewTag::SRV + ? stage->ShaderDetails->ReadOnlyResources + : stage->ShaderDetails->ReadWriteResources; for(const ShaderResource &res : resArray) { diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h index 38c059699..04225985b 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h @@ -105,8 +105,7 @@ private: void setEmptyRow(RDTreeWidgetItem *node); void highlightIABind(int slot); - QString formatMembers(int indent, const QString &nameprefix, - const rdctype::array &vars); + QString formatMembers(int indent, const QString &nameprefix, const rdcarray &vars); const D3D11Pipe::Shader *stageForSender(QWidget *widget); bool HasImportantViewParams(const D3D11Pipe::View &view, TextureDescription *tex); diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp index 0eedf66f5..6d16d62b6 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp @@ -631,9 +631,9 @@ void D3D12PipelineStateViewer::addResourceRow(const D3D12ViewTag &view, if(stage && stage->ShaderDetails) { - const rdctype::array &binds = uav ? stage->BindpointMapping.ReadWriteResources - : stage->BindpointMapping.ReadOnlyResources; - const rdctype::array &res = + const rdcarray &binds = uav ? stage->BindpointMapping.ReadWriteResources + : stage->BindpointMapping.ReadOnlyResources; + const rdcarray &res = uav ? stage->ShaderDetails->ReadWriteResources : stage->ShaderDetails->ReadOnlyResources; for(int i = 0; i < binds.count(); i++) { @@ -1645,7 +1645,7 @@ void D3D12PipelineStateViewer::setState() } QString D3D12PipelineStateViewer::formatMembers(int indent, const QString &nameprefix, - const rdctype::array &vars) + const rdcarray &vars) { QString indentstr(indent * 4, QLatin1Char(' ')); @@ -1765,13 +1765,13 @@ void D3D12PipelineStateViewer::resource_itemActivated(RDTreeWidgetItem *item, in if(stage->ShaderDetails) { - const rdctype::array &resArray = - view.space == D3D12ViewTag::SRV ? stage->ShaderDetails->ReadOnlyResources - : stage->ShaderDetails->ReadWriteResources; + const rdcarray &resArray = view.space == D3D12ViewTag::SRV + ? stage->ShaderDetails->ReadOnlyResources + : stage->ShaderDetails->ReadWriteResources; - const rdctype::array &bindArray = - view.space == D3D12ViewTag::SRV ? stage->BindpointMapping.ReadOnlyResources - : stage->BindpointMapping.ReadOnlyResources; + const rdcarray &bindArray = view.space == D3D12ViewTag::SRV + ? stage->BindpointMapping.ReadOnlyResources + : stage->BindpointMapping.ReadOnlyResources; for(int i = 0; i < bindArray.count(); i++) { diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h index bf3f76a7f..94c9828fa 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h @@ -95,8 +95,7 @@ private: void setEmptyRow(RDTreeWidgetItem *node); void highlightIABind(int slot); - QString formatMembers(int indent, const QString &nameprefix, - const rdctype::array &vars); + QString formatMembers(int indent, const QString &nameprefix, const rdcarray &vars); const D3D12Pipe::Shader *stageForSender(QWidget *widget); bool HasImportantViewParams(const D3D12Pipe::View &view, TextureDescription *tex); diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp index 67ab5a597..a841edf75 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp @@ -1916,7 +1916,7 @@ void GLPipelineStateViewer::setState() } QString GLPipelineStateViewer::formatMembers(int indent, const QString &nameprefix, - const rdctype::array &vars) + const rdcarray &vars) { QString indentstr(indent * 4, QLatin1Char(' ')); diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h index 743c894b0..c22938c13 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h @@ -101,8 +101,7 @@ private: void setEmptyRow(RDTreeWidgetItem *node); void highlightIABind(int slot); - QString formatMembers(int indent, const QString &nameprefix, - const rdctype::array &vars); + QString formatMembers(int indent, const QString &nameprefix, const rdcarray &vars); const GLPipe::Shader *stageForSender(QWidget *widget); bool showNode(bool usedSlot, bool filledSlot); diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp index a6939d10f..0201752ec 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp @@ -570,7 +570,7 @@ bool PipelineStateViewer::PrepareShaderEditing(const ShaderReflection *shaderDet } void PipelineStateViewer::MakeShaderVariablesHLSL(bool cbufferContents, - const rdctype::array &vars, + const rdcarray &vars, QString &struct_contents, QString &struct_defs) { for(const ShaderConstant &v : vars) @@ -628,7 +628,7 @@ QString PipelineStateViewer::GenerateHLSLStub(const ShaderReflection *shaderDeta for(int i = 0; i < 2; i++) { - const rdctype::array &resources = + const rdcarray &resources = (i == 0 ? shaderDetails->ReadOnlyResources : shaderDetails->ReadWriteResources); for(const ShaderResource &res : resources) { @@ -822,7 +822,7 @@ void PipelineStateViewer::EditShader(ShaderStage shaderType, ResourceId id, // with our edited one ctx->Replay().AsyncInvoke([ctx, entryFunc, compileSource, shaderType, id, shaderDetails, viewer](IReplayController *r) { - rdctype::str errs; + rdcstr errs; const ShaderCompileFlags &flags = shaderDetails->DebugInfo.compileFlags; diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h index 416cb46cb..304eb7f61 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h @@ -84,7 +84,7 @@ private: Ui::PipelineStateViewer *ui; ICaptureContext &m_Ctx; - void MakeShaderVariablesHLSL(bool cbufferContents, const rdctype::array &vars, + void MakeShaderVariablesHLSL(bool cbufferContents, const rdcarray &vars, QString &struct_contents, QString &struct_defs); QPixmap m_TopoPixmaps[(int)Topology::PatchList + 1]; diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 266f3272c..5926820c4 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -753,7 +753,7 @@ void VulkanPipelineStateViewer::addResourceRow(ShaderReflection *shaderDetails, } } - const rdctype::array *slotBinds = NULL; + const rdcarray *slotBinds = NULL; BindType bindType = BindType::Unknown; ShaderStageMask stageBits = ShaderStageMask::Unknown; @@ -1113,7 +1113,7 @@ void VulkanPipelineStateViewer::addConstantBlockRow(ShaderReflection *shaderDeta slot = ~0U; } - const rdctype::array *slotBinds = NULL; + const rdcarray *slotBinds = NULL; BindType bindType = BindType::ConstantBuffer; ShaderStageMask stageBits = ShaderStageMask::Unknown; @@ -1999,7 +1999,7 @@ void VulkanPipelineStateViewer::setState() } QString VulkanPipelineStateViewer::formatMembers(int indent, const QString &nameprefix, - const rdctype::array &vars) + const rdcarray &vars) { QString indentstr(indent * 4, QLatin1Char(' ')); @@ -2352,7 +2352,7 @@ void VulkanPipelineStateViewer::shaderEdit_clicked() { m_Ctx.Replay().AsyncInvoke( [this, stage, pipe, shaderDetails, entryFunc, mainfile](IReplayController *r) { - rdctype::str disasm = r->DisassembleShader(pipe, shaderDetails, ""); + rdcstr disasm = r->DisassembleShader(pipe, shaderDetails, ""); GUIInvoke::call([this, stage, shaderDetails, entryFunc, mainfile, disasm]() { QStringMap fileMap; diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h index 764f123bc..0e31dd5f2 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h @@ -104,8 +104,7 @@ private: void setEmptyRow(RDTreeWidgetItem *node); void highlightIABind(int slot); - QString formatMembers(int indent, const QString &nameprefix, - const rdctype::array &vars); + QString formatMembers(int indent, const QString &nameprefix, const rdcarray &vars); const VKPipe::Shader *stageForSender(QWidget *widget); QString disassembleSPIRV(const ShaderReflection *shaderDetails); diff --git a/qrenderdoc/Windows/PixelHistoryView.cpp b/qrenderdoc/Windows/PixelHistoryView.cpp index edb3db9a8..aa31c4fbb 100644 --- a/qrenderdoc/Windows/PixelHistoryView.cpp +++ b/qrenderdoc/Windows/PixelHistoryView.cpp @@ -70,7 +70,7 @@ public: } } - void setHistory(const rdctype::array &history) + void setHistory(const rdcarray &history) { m_ModList.reserve(history.count()); for(const PixelModification &h : history) @@ -653,7 +653,7 @@ void PixelHistoryView::OnLogfileClosed() ToolWindowManager::closeToolWindow(this); } -void PixelHistoryView::SetHistory(const rdctype::array &history) +void PixelHistoryView::SetHistory(const rdcarray &history) { m_Model->setHistory(history); diff --git a/qrenderdoc/Windows/PixelHistoryView.h b/qrenderdoc/Windows/PixelHistoryView.h index 0c1f1842e..da96140f5 100644 --- a/qrenderdoc/Windows/PixelHistoryView.h +++ b/qrenderdoc/Windows/PixelHistoryView.h @@ -46,7 +46,7 @@ public: // IPixelHistoryView QWidget *Widget() override { return this; } - void SetHistory(const rdctype::array &history) override; + void SetHistory(const rdcarray &history) override; // ILogViewerForm void OnLogfileLoaded() override; diff --git a/qrenderdoc/Windows/PythonShell.cpp b/qrenderdoc/Windows/PythonShell.cpp index 9e26d4b35..e7e36ecdf 100644 --- a/qrenderdoc/Windows/PythonShell.cpp +++ b/qrenderdoc/Windows/PythonShell.cpp @@ -73,20 +73,14 @@ struct CaptureContextInvoker : ICaptureContext return m_Ctx.GetFirstDrawcall(); } virtual const DrawcallDescription *GetLastDrawcall() override { return m_Ctx.GetLastDrawcall(); } - virtual const rdctype::array &CurDrawcalls() override + virtual const rdcarray &CurDrawcalls() override { return m_Ctx.CurDrawcalls(); } virtual TextureDescription *GetTexture(ResourceId id) override { return m_Ctx.GetTexture(id); } - virtual const rdctype::array &GetTextures() override - { - return m_Ctx.GetTextures(); - } + virtual const rdcarray &GetTextures() override { return m_Ctx.GetTextures(); } virtual BufferDescription *GetBuffer(ResourceId id) override { return m_Ctx.GetBuffer(id); } - virtual const rdctype::array &GetBuffers() override - { - return m_Ctx.GetBuffers(); - } + virtual const rdcarray &GetBuffers() override { return m_Ctx.GetBuffers(); } virtual const DrawcallDescription *GetDrawcall(uint32_t eventID) override { return m_Ctx.GetDrawcall(eventID); @@ -166,7 +160,7 @@ struct CaptureContextInvoker : ICaptureContext { InvokeVoidFunction(&ICaptureContext::RemoveLogViewer, viewer); } - virtual void AddMessages(const rdctype::array &msgs) override + virtual void AddMessages(const rdcarray &msgs) override { InvokeVoidFunction(&ICaptureContext::AddMessages, msgs); } diff --git a/qrenderdoc/Windows/ShaderViewer.cpp b/qrenderdoc/Windows/ShaderViewer.cpp index b604531bb..ba301b1ac 100644 --- a/qrenderdoc/Windows/ShaderViewer.cpp +++ b/qrenderdoc/Windows/ShaderViewer.cpp @@ -307,13 +307,13 @@ void ShaderViewer::debugShader(const ShaderBindpointMapping *bind, const ShaderR if(shader) { m_Ctx.Replay().AsyncInvoke([this](IReplayController *r) { - rdctype::array targets = r->GetDisassemblyTargets(); + rdcarray targets = r->GetDisassemblyTargets(); - rdctype::str disasm = r->DisassembleShader(m_Pipeline, m_ShaderDetails, ""); + rdcstr disasm = r->DisassembleShader(m_Pipeline, m_ShaderDetails, ""); GUIInvoke::call([this, targets, disasm]() { QStringList targetNames; - for(const rdctype::str &t : targets) + for(const rdcstr &t : targets) targetNames << t; m_DisassemblyType->addItems(targetNames); @@ -831,7 +831,7 @@ void ShaderViewer::disassemble_typeChanged(int index) QByteArray target = m_DisassemblyType->currentText().toUtf8(); m_Ctx.Replay().AsyncInvoke([this, target](IReplayController *r) { - rdctype::str disasm = r->DisassembleShader(m_Pipeline, m_ShaderDetails, target.data()); + rdcstr disasm = r->DisassembleShader(m_Pipeline, m_ShaderDetails, target.data()); GUIInvoke::call([this, disasm]() { m_DisassemblyView->setReadOnly(false); @@ -1360,7 +1360,7 @@ void ShaderViewer::updateDebugging() arrIndex = -1; } - const rdctype::array *vars = GetVariableList(varCat, arrIndex); + const rdcarray *vars = GetVariableList(varCat, arrIndex); ok = false; int regindex = regidx.toInt(&ok); @@ -1896,7 +1896,7 @@ void ShaderViewer::disasm_tooltipHide(int x, int y) void ShaderViewer::showVariableTooltip(VariableCategory varCat, int varIdx, int arrayIdx) { - const rdctype::array *vars = GetVariableList(varCat, arrayIdx); + const rdcarray *vars = GetVariableList(varCat, arrayIdx); if(!vars || varIdx < 0 || varIdx >= vars->count()) { @@ -1912,10 +1912,9 @@ void ShaderViewer::showVariableTooltip(VariableCategory varCat, int varIdx, int updateVariableTooltip(); } -const rdctype::array *ShaderViewer::GetVariableList(VariableCategory varCat, - int arrayIdx) +const rdcarray *ShaderViewer::GetVariableList(VariableCategory varCat, int arrayIdx) { - const rdctype::array *vars = NULL; + const rdcarray *vars = NULL; if(!m_Trace || m_CurrentStep < 0 || m_CurrentStep >= m_Trace->states.count()) return vars; @@ -1977,7 +1976,7 @@ void ShaderViewer::updateVariableTooltip() if(m_TooltipVarIdx < 0) return; - const rdctype::array *vars = GetVariableList(m_TooltipVarCat, m_TooltipArrayIdx); + const rdcarray *vars = GetVariableList(m_TooltipVarCat, m_TooltipArrayIdx); const ShaderVariable &var = (*vars)[m_TooltipVarIdx]; QString text = QFormatStr("
%1\n").arg(var.name);
diff --git a/qrenderdoc/Windows/ShaderViewer.h b/qrenderdoc/Windows/ShaderViewer.h
index 29ca98b35..f0dbd2235 100644
--- a/qrenderdoc/Windows/ShaderViewer.h
+++ b/qrenderdoc/Windows/ShaderViewer.h
@@ -155,7 +155,7 @@ private:
 
   bool eventFilter(QObject *watched, QEvent *event) override;
 
-  const rdctype::array *GetVariableList(VariableCategory varCat, int arrayIdx);
+  const rdcarray *GetVariableList(VariableCategory varCat, int arrayIdx);
   void getRegisterFromWord(const QString &text, VariableCategory &varCat, int &varIdx, int &arrayIdx);
 
   void showVariableTooltip(VariableCategory varCat, int varIdx, int arrayIdx);
diff --git a/qrenderdoc/Windows/StatisticsViewer.cpp b/qrenderdoc/Windows/StatisticsViewer.cpp
index f4a6481b0..5227836b4 100644
--- a/qrenderdoc/Windows/StatisticsViewer.cpp
+++ b/qrenderdoc/Windows/StatisticsViewer.cpp
@@ -67,7 +67,7 @@ QString CountOrEmpty(uint32_t count)
     return QFormatStr("(%1)").arg(count);
 }
 
-QString CreateSimpleIntegerHistogram(const QString &legend, const rdctype::array &array)
+QString CreateSimpleIntegerHistogram(const QString &legend, const rdcarray &array)
 {
   uint32_t maxCount = 0;
   int maxWithValue = 0;
@@ -684,7 +684,7 @@ void StatisticsViewer::AppendAPICallSummary()
 
 void StatisticsViewer::GenerateReport()
 {
-  const rdctype::array &curDraws = m_Ctx.CurDrawcalls();
+  const rdcarray &curDraws = m_Ctx.CurDrawcalls();
 
   uint32_t drawCount = 0;
   uint32_t dispatchCount = 0;
diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp
index e95418eee..dc7565bf6 100644
--- a/qrenderdoc/Windows/TextureViewer.cpp
+++ b/qrenderdoc/Windows/TextureViewer.cpp
@@ -338,7 +338,7 @@ public:
   }
   void reset(FilterType type, const QString &filter, ICaptureContext &ctx)
   {
-    const rdctype::array src = ctx.GetTextures();
+    const rdcarray src = ctx.GetTextures();
 
     texs.clear();
     texs.reserve(src.count());
@@ -734,8 +734,8 @@ void TextureViewer::RT_UpdateVisualRange(IReplayController *)
       m_TexDisplay.Blue && fmt.compCount > 2, m_TexDisplay.Alpha && fmt.compCount > 3,
   };
 
-  rdctype::array histogram = m_Output->GetHistogram(
-      ui->rangeHistogram->rangeMin(), ui->rangeHistogram->rangeMax(), channels);
+  rdcarray histogram = m_Output->GetHistogram(ui->rangeHistogram->rangeMin(),
+                                                        ui->rangeHistogram->rangeMax(), channels);
 
   if(!histogram.empty())
   {
@@ -1799,7 +1799,7 @@ void TextureViewer::AddResourceUsageEntry(QMenu &menu, uint32_t start, uint32_t
   menu.addAction(item);
 }
 
-void TextureViewer::OpenResourceContextMenu(ResourceId id, const rdctype::array &usage)
+void TextureViewer::OpenResourceContextMenu(ResourceId id, const rdcarray &usage)
 {
   QMenu contextMenu(this);
 
@@ -1991,8 +1991,8 @@ void TextureViewer::InitResourcePreview(ResourcePreview *prev, ResourceId id, Co
 }
 
 void TextureViewer::InitStageResourcePreviews(ShaderStage stage,
-                                              const rdctype::array &resourceDetails,
-                                              const rdctype::array &mapping,
+                                              const rdcarray &resourceDetails,
+                                              const rdcarray &mapping,
                                               QMap> &ResList,
                                               ThumbnailStrip *prevs, int &prevIndex, bool copy,
                                               bool rw)
@@ -2132,7 +2132,7 @@ void TextureViewer::thumb_clicked(QMouseEvent *e)
     if(id == ResourceId() && follow == m_Following)
       id = m_TexDisplay.texid;
 
-    rdctype::array empty;
+    rdcarray empty;
 
     if(id == ResourceId())
     {
@@ -2141,7 +2141,7 @@ void TextureViewer::thumb_clicked(QMouseEvent *e)
     else
     {
       m_Ctx.Replay().AsyncInvoke([this, id](IReplayController *r) {
-        rdctype::array usage = r->GetUsage(id);
+        rdcarray usage = r->GetUsage(id);
 
         GUIInvoke::call([this, id, usage]() { OpenResourceContextMenu(id, usage); });
       });
@@ -2664,7 +2664,7 @@ void TextureViewer::OnEventChanged(uint32_t eventID)
     count = 1;
   }
 
-  const rdctype::array empty;
+  const rdcarray empty;
 
   // display resources used for all stages
   for(int i = 0; i < count; i++)
@@ -3449,7 +3449,7 @@ void TextureViewer::on_pixelHistory_clicked()
   LambdaThread *thread = new LambdaThread([this, texptr, x, y, hist]() {
     QThread::msleep(150);
     m_Ctx.Replay().AsyncInvoke([this, texptr, x, y, hist](IReplayController *r) {
-      rdctype::array history =
+      rdcarray history =
           r->PixelHistory(texptr->ID, (uint32_t)x, (int32_t)y, m_TexDisplay.sliceFace,
                           m_TexDisplay.mip, m_TexDisplay.sampleIdx, m_TexDisplay.typeHint);
 
@@ -3593,7 +3593,7 @@ void TextureViewer::reloadCustomShaders(const QString &filter)
         m_CustomShaders[key] = ResourceId();
         m_CustomShadersBusy.push_back(key);
         m_Ctx.Replay().AsyncInvoke([this, fn, key, source](IReplayController *r) {
-          rdctype::str errors;
+          rdcstr errors;
 
           ResourceId id;
           std::tie(id, errors) = r->BuildCustomShader("main", source.toUtf8().data(),
diff --git a/qrenderdoc/Windows/TextureViewer.h b/qrenderdoc/Windows/TextureViewer.h
index cc79baa3d..76cf368a9 100644
--- a/qrenderdoc/Windows/TextureViewer.h
+++ b/qrenderdoc/Windows/TextureViewer.h
@@ -229,14 +229,13 @@ private:
   void InitResourcePreview(ResourcePreview *prev, ResourceId id, CompType typeHint, bool force,
                            Following &follow, const QString &bindName, const QString &slotName);
 
-  void InitStageResourcePreviews(ShaderStage stage,
-                                 const rdctype::array &resourceDetails,
-                                 const rdctype::array &mapping,
+  void InitStageResourcePreviews(ShaderStage stage, const rdcarray &resourceDetails,
+                                 const rdcarray &mapping,
                                  QMap> &ResList,
                                  ThumbnailStrip *prevs, int &prevIndex, bool copy, bool rw);
 
   void AddResourceUsageEntry(QMenu &menu, uint32_t start, uint32_t end, ResourceUsage usage);
-  void OpenResourceContextMenu(ResourceId id, const rdctype::array &usage);
+  void OpenResourceContextMenu(ResourceId id, const rdcarray &usage);
 
   void AutoFitRange();
   void rangePoint_Update();
diff --git a/qrenderdoc/Windows/TimelineBar.cpp b/qrenderdoc/Windows/TimelineBar.cpp
index 18634a53f..6f01e0846 100644
--- a/qrenderdoc/Windows/TimelineBar.cpp
+++ b/qrenderdoc/Windows/TimelineBar.cpp
@@ -86,7 +86,7 @@ void TimelineBar::HighlightResourceUsage(ResourceId id)
     m_UsageTarget = buf->name;
 
   m_Ctx.Replay().AsyncInvoke([this, id](IReplayController *r) {
-    rdctype::array usage = r->GetUsage(id);
+    rdcarray usage = r->GetUsage(id);
 
     GUIInvoke::call([this, usage]() {
       for(const EventUsage &u : usage)
@@ -928,7 +928,7 @@ qreal TimelineBar::offsetOf(uint32_t eid)
 }
 
 uint32_t TimelineBar::processDraws(QVector &markers, QVector &draws,
-                                   const rdctype::array &curDraws)
+                                   const rdcarray &curDraws)
 {
   uint32_t maxEID = 0;
 
diff --git a/qrenderdoc/Windows/TimelineBar.h b/qrenderdoc/Windows/TimelineBar.h
index 11566b3c4..bc808db5e 100644
--- a/qrenderdoc/Windows/TimelineBar.h
+++ b/qrenderdoc/Windows/TimelineBar.h
@@ -108,7 +108,7 @@ private:
   uint32_t eventAt(qreal x);
   qreal offsetOf(uint32_t eid);
   uint32_t processDraws(QVector &markers, QVector &draws,
-                        const rdctype::array &curDraws);
+                        const rdcarray &curDraws);
   void paintMarkers(QPainter &p, const QVector &markers, const QVector &draws,
                     QRectF markerRect);
   Marker *findMarker(QVector &markers, QRectF markerRect, QPointF pos);
diff --git a/renderdoc/3rdparty/catch/catch.cpp b/renderdoc/3rdparty/catch/catch.cpp
index 3bf2f946f..b9df8c7e0 100644
--- a/renderdoc/3rdparty/catch/catch.cpp
+++ b/renderdoc/3rdparty/catch/catch.cpp
@@ -275,8 +275,8 @@ std::ostream &clog()
 }
 }
 
-extern "C" RENDERDOC_API int RENDERDOC_CC
-RENDERDOC_RunUnitTests(const rdctype::str &command, const rdctype::array &args)
+extern "C" RENDERDOC_API int RENDERDOC_CC RENDERDOC_RunUnitTests(const rdcstr &command,
+                                                                 const rdcarray &args)
 {
   LogOutputter logbuf;
   std::ostream logstream(&logbuf);
diff --git a/renderdoc/api/replay/basic_types.h b/renderdoc/api/replay/basic_types.h
index eaec4621b..e0fd53b69 100644
--- a/renderdoc/api/replay/basic_types.h
+++ b/renderdoc/api/replay/basic_types.h
@@ -52,10 +52,8 @@ typedef uint8_t byte;
 
 // here we define our own data structures that are ABI compatible between modules, as STL is not
 // safe to pass a module boundary.
-namespace rdctype
-{
 template 
-struct pair
+struct rdcpair
 {
   A first;
   B second;
@@ -64,9 +62,9 @@ struct pair
 };
 
 template 
-pair make_pair(const A &a, const B &b)
+rdcpair make_rdcpair(const A &a, const B &b)
 {
-  pair ret;
+  rdcpair ret;
   ret.first = a;
   ret.second = b;
   return ret;
@@ -92,7 +90,7 @@ struct null_terminator
 };
 
 template 
-struct array
+struct rdcarray
 {
 protected:
   T *elems;
@@ -127,8 +125,8 @@ protected:
 public:
   typedef T value_type;
 
-  array() : elems(NULL), allocatedCount(0), usedCount(0) {}
-  ~array()
+  rdcarray() : elems(NULL), allocatedCount(0), usedCount(0) {}
+  ~rdcarray()
   {
     // clear will destruct the actual elements still existing
     clear();
@@ -335,7 +333,7 @@ public:
   {
     insert(offs, in.begin(), in.size());
   }
-  inline void insert(size_t offs, const array &in) { insert(offs, in.data(), in.size()); }
+  inline void insert(size_t offs, const rdcarray &in) { insert(offs, in.data(), in.size()); }
   inline void insert(size_t offs, const T &in) { insert(offs, &in, 1); }
   void erase(size_t offs, size_t count = 1)
   {
@@ -365,32 +363,32 @@ public:
   }
   /////////////////////////////////////////////////////////////////
   // constructors that just forward to assign
-  array(const T *in, size_t count)
+  rdcarray(const T *in, size_t count)
   {
     elems = NULL;
     allocatedCount = usedCount = 0;
     assign(in, count);
   }
-  array(const std::vector &in)
+  rdcarray(const std::vector &in)
   {
     elems = NULL;
     allocatedCount = usedCount = 0;
     assign(in);
   }
-  array(const std::initializer_list &in)
+  rdcarray(const std::initializer_list &in)
   {
     elems = NULL;
     allocatedCount = usedCount = 0;
     assign(in);
   }
-  array(const array &in)
+  rdcarray(const rdcarray &in)
   {
     elems = NULL;
     allocatedCount = usedCount = 0;
     assign(in);
   }
 
-  inline void swap(array &other)
+  inline void swap(rdcarray &other)
   {
     std::swap(elems, other.elems);
     std::swap(allocatedCount, other.allocatedCount);
@@ -400,10 +398,10 @@ public:
   // assign forwards to operator =
   inline void assign(const std::vector &in) { *this = in; }
   inline void assign(const std::initializer_list &in) { *this = in; }
-  inline void assign(const array &in) { *this = in; }
+  inline void assign(const rdcarray &in) { *this = in; }
   /////////////////////////////////////////////////////////////////
   // assignment operators
-  array &operator=(const std::vector &in)
+  rdcarray &operator=(const std::vector &in)
   {
     // make sure we have enough space, allocating more if needed
     reserve(in.size());
@@ -422,7 +420,7 @@ public:
     return *this;
   }
 
-  array &operator=(const std::initializer_list &in)
+  rdcarray &operator=(const std::initializer_list &in)
   {
     // make sure we have enough space, allocating more if needed
     reserve(in.size());
@@ -445,7 +443,7 @@ public:
     return *this;
   }
 
-  array &operator=(const array &in)
+  rdcarray &operator=(const rdcarray &in)
   {
     // do nothing if we're self-assigning
     if(this == &in)
@@ -485,14 +483,14 @@ public:
   }
 
 #if defined(RENDERDOC_QT_COMPAT)
-  array(const QList &in)
+  rdcarray(const QList &in)
   {
     elems = NULL;
     allocatedCount = usedCount = 0;
     assign(in);
   }
   inline void assign(const QList &in) { *this = in; }
-  array &operator=(const QList &in)
+  rdcarray &operator=(const QList &in)
   {
     // make sure we have enough space, allocating more if needed
     reserve(in.size());
@@ -509,14 +507,14 @@ public:
     return *this;
   }
 
-  array(const QVector &in)
+  rdcarray(const QVector &in)
   {
     elems = NULL;
     allocatedCount = usedCount = 0;
     assign(in);
   }
   inline void assign(const QVector &in) { *this = in; }
-  array &operator=(const QVector &in)
+  rdcarray &operator=(const QVector &in)
   {
     // make sure we have enough space, allocating more if needed
     reserve(in.size());
@@ -536,20 +534,20 @@ public:
 };
 
 DOCUMENT("");
-struct str : public rdctype::array
+struct rdcstr : public rdcarray
 {
   // extra string constructors
-  str() : rdctype::array() {}
-  str(const str &in) : rdctype::array() { assign(in); }
-  str(const std::string &in) : rdctype::array() { assign(in.c_str(), in.size()); }
-  str(const char *const in) : rdctype::array() { assign(in, strlen(in)); }
+  rdcstr() : rdcarray() {}
+  rdcstr(const rdcstr &in) : rdcarray() { assign(in); }
+  rdcstr(const std::string &in) : rdcarray() { assign(in.c_str(), in.size()); }
+  rdcstr(const char *const in) : rdcarray() { assign(in, strlen(in)); }
   // extra string assignment
-  str &operator=(const std::string &in)
+  rdcstr &operator=(const std::string &in)
   {
     assign(in.c_str(), in.size());
     return *this;
   }
-  str &operator=(const char *const in)
+  rdcstr &operator=(const char *const in)
   {
     assign(in, strlen(in));
     return *this;
@@ -573,18 +571,18 @@ struct str : public rdctype::array
     return !strcmp(elems, o);
   }
   bool operator==(const std::string &o) const { return o == elems; }
-  bool operator==(const str &o) const { return *this == (const char *const)o.elems; }
+  bool operator==(const rdcstr &o) const { return *this == (const char *const)o.elems; }
   bool operator!=(const char *const o) const { return !(*this == o); }
   bool operator!=(const std::string &o) const { return !(*this == o); }
-  bool operator!=(const str &o) const { return !(*this == o); }
+  bool operator!=(const rdcstr &o) const { return !(*this == o); }
   // define ordering operators
-  bool operator<(const str &o) const { return strcmp(elems, o.elems) < 0; }
-  bool operator>(const str &o) const { return strcmp(elems, o.elems) > 0; }
+  bool operator<(const rdcstr &o) const { return strcmp(elems, o.elems) < 0; }
+  bool operator>(const rdcstr &o) const { return strcmp(elems, o.elems) > 0; }
 };
 
 DOCUMENT("");
-struct bytebuf : public rdctype::array
+struct bytebuf : public rdcarray
 {
+  bytebuf() : rdcarray() {}
+  bytebuf(const std::vector &in) : rdcarray(in) {}
 };
-
-};    // namespace rdctype
diff --git a/renderdoc/api/replay/control_types.h b/renderdoc/api/replay/control_types.h
index df8001b22..9b68a2820 100644
--- a/renderdoc/api/replay/control_types.h
+++ b/renderdoc/api/replay/control_types.h
@@ -414,13 +414,13 @@ struct NewCaptureData
   DOCUMENT("The time the capture was created, as a unix timestamp in UTC.");
   uint64_t timestamp;
   DOCUMENT("The raw bytes that contain the capture thumbnail, as RGB8 data.");
-  rdctype::array thumbnail;
+  bytebuf thumbnail;
   DOCUMENT("The width of the image contained in :data:`thumbnail`.");
   int32_t thumbWidth;
   DOCUMENT("The height of the image contained in :data:`thumbnail`.");
   int32_t thumbHeight;
   DOCUMENT("The local path on the target system where the capture is saved.");
-  rdctype::str path;
+  rdcstr path;
   DOCUMENT("``True`` if the target is running on the local system.");
   bool local;
 };
@@ -431,7 +431,7 @@ DOCUMENT("Information about the API that the target has begun using.");
 struct RegisterAPIData
 {
   DOCUMENT("The name of the new API.");
-  rdctype::str APIName;
+  rdcstr APIName;
 };
 
 DECLARE_REFLECTION_STRUCT(RegisterAPIData);
@@ -440,7 +440,7 @@ DOCUMENT("Information about why the target is busy.");
 struct BusyData
 {
   DOCUMENT("The name of the client currently connected to the target.");
-  rdctype::str ClientName;
+  rdcstr ClientName;
 };
 
 DECLARE_REFLECTION_STRUCT(BusyData);
@@ -488,9 +488,9 @@ struct EnvironmentModification
   DOCUMENT("The :class:`separator ` to use if needed.");
   EnvSep sep;
   DOCUMENT("The name of the environment variable.");
-  rdctype::str name;
+  rdcstr name;
   DOCUMENT("The value to use with the modification specified in :data:`mod`.");
-  rdctype::str value;
+  rdcstr value;
 };
 
 DECLARE_REFLECTION_STRUCT(EnvironmentModification);
diff --git a/renderdoc/api/replay/d3d11_pipestate.h b/renderdoc/api/replay/d3d11_pipestate.h
index d30f9de1a..1d2ef4781 100644
--- a/renderdoc/api/replay/d3d11_pipestate.h
+++ b/renderdoc/api/replay/d3d11_pipestate.h
@@ -38,7 +38,7 @@ DOCUMENT(R"(Describes a single D3D11 input layout element for one vertex input.
 struct Layout
 {
   DOCUMENT("The semantic name for this input.");
-  rdctype::str SemanticName;
+  rdcstr SemanticName;
 
   DOCUMENT("The semantic index for this input.");
   uint32_t SemanticIndex = 0;
@@ -99,7 +99,7 @@ DOCUMENT("Describes the input assembler data.");
 struct IA
 {
   DOCUMENT("A list of :class:`D3D11_Layout` describing the input layout elements in this layout.");
-  rdctype::array layouts;
+  rdcarray layouts;
 
   DOCUMENT("The :class:`ResourceId` of the layout object.");
   ResourceId layout;
@@ -113,10 +113,10 @@ based on the ID.
   bool customName = false;
 
   DOCUMENT("The name of the input layout object.");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT("A list of :class:`D3D11_VB` with the vertex buffers that are bound.");
-  rdctype::array vbuffers;
+  rdcarray vbuffers;
 
   DOCUMENT("The :class:`D3D11_IB` describing the index buffer.");
   IB ibuffer;
@@ -173,7 +173,7 @@ struct Sampler
   DOCUMENT("The :class:`ResourceId` of the sampler state object.");
   ResourceId Samp;
   DOCUMENT("The name of the sampler state object.");
-  rdctype::str name;
+  rdcstr name;
   DOCUMENT(R"(``True`` if :data:`name` was assigned by the application, otherwise it's autogenerated
 based on the ID.
 )");
@@ -237,7 +237,7 @@ struct Shader
   ResourceId Object;
 
   DOCUMENT("The name of the shader object.");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT(R"(``True`` if :data:`name` was assigned by the application, otherwise it's autogenerated
 based on the ID.
@@ -255,19 +255,19 @@ mapping data.
   ShaderStage stage = ShaderStage::Vertex;
 
   DOCUMENT("A list of :class:`D3D11_View` with the bound SRVs.");
-  rdctype::array SRVs;
+  rdcarray SRVs;
 
   DOCUMENT("A list of :class:`D3D11_View` with the bound UAVs - only valid for the compute stage.");
-  rdctype::array UAVs;
+  rdcarray UAVs;
 
   DOCUMENT("A list of :class:`D3D11_Sampler` with the bound samplers.");
-  rdctype::array Samplers;
+  rdcarray Samplers;
 
   DOCUMENT("A list of :class:`D3D11_CBuffer` with the bound constant buffers.");
-  rdctype::array ConstantBuffers;
+  rdcarray ConstantBuffers;
 
   DOCUMENT("A list of ``str`` with the bound class instance names.");
-  rdctype::array ClassInstances;
+  rdcarray ClassInstances;
 };
 
 DOCUMENT("Describes a binding on the D3D11 stream-out stage.");
@@ -284,7 +284,7 @@ DOCUMENT("Describes the stream-out stage bindings.");
 struct SO
 {
   DOCUMENT("A list of ``D3D11_SOBind`` with the bound buffers.");
-  rdctype::array Outputs;
+  rdcarray Outputs;
 };
 
 DOCUMENT("Describes a single D3D11 viewport.");
@@ -374,10 +374,10 @@ DOCUMENT("Describes the rasterization state of the D3D11 pipeline.");
 struct Rasterizer
 {
   DOCUMENT("A list of :class:`D3D11_Viewport` with the bound viewports.");
-  rdctype::array Viewports;
+  rdcarray Viewports;
 
   DOCUMENT("A list of :class:`D3D11_Scissor` with the bound scissor regions.");
-  rdctype::array Scissors;
+  rdcarray Scissors;
 
   DOCUMENT("A :class:`D3D11_RasterizerState` with the details of the rasterization state.");
   RasterizerState m_State;
@@ -469,7 +469,7 @@ struct BlendState
   bool IndependentBlend = false;
 
   DOCUMENT("A list of :class:`D3D11_Blend` describing the blend operations for each target.");
-  rdctype::array Blends;
+  rdcarray Blends;
 
   DOCUMENT("The constant blend factor to use in blend equations.");
   float BlendFactor[4] = {1.0f, 1.0f, 1.0f, 1.0f};
@@ -486,12 +486,12 @@ struct OM
   BlendState m_BlendState;
 
   DOCUMENT("A list of :class:`D3D11_View` describing the bound render targets.");
-  rdctype::array RenderTargets;
+  rdcarray RenderTargets;
 
   DOCUMENT("Which slot in the output targets is the first UAV.");
   uint32_t UAVStartSlot = 0;
   DOCUMENT("A list of :class:`D3D11_View` describing the bound UAVs.");
-  rdctype::array UAVs;
+  rdcarray UAVs;
 
   DOCUMENT("A :class:`D3D11_View` with details of the bound depth-stencil target.");
   View DepthTarget;
diff --git a/renderdoc/api/replay/d3d12_pipestate.h b/renderdoc/api/replay/d3d12_pipestate.h
index 729325917..4d156dbcb 100644
--- a/renderdoc/api/replay/d3d12_pipestate.h
+++ b/renderdoc/api/replay/d3d12_pipestate.h
@@ -37,7 +37,7 @@ DOCUMENT(R"(Describes a single D3D12 input layout element for one vertex input.
 struct Layout
 {
   DOCUMENT("The semantic name for this input.");
-  rdctype::str SemanticName;
+  rdcstr SemanticName;
 
   DOCUMENT("The semantic index for this input.");
   uint32_t SemanticIndex = 0;
@@ -104,10 +104,10 @@ DOCUMENT("Describes the input assembler state in the PSO.");
 struct IA
 {
   DOCUMENT("A list of :class:`D3D12_Layout` describing the input layout elements in this layout.");
-  rdctype::array layouts;
+  rdcarray layouts;
 
   DOCUMENT("A list of :class:`D3D12_VB` with the vertex buffers that are bound.");
-  rdctype::array vbuffers;
+  rdcarray vbuffers;
 
   DOCUMENT("The :class:`D3D12_IB` describing the index buffer.");
   IB ibuffer;
@@ -236,20 +236,20 @@ struct CBuffer
   DOCUMENT(R"(If :data:`Immediate` is ``True`` and this is a root constant, this contains a list of
 ``int`` values with the root values set.
 )");
-  rdctype::array RootValues;
+  rdcarray RootValues;
 };
 
 DOCUMENT("Contains all of the registers in a single register space mapped to by a root signature.");
 struct RegisterSpace
 {
   DOCUMENT("List of :class:`D3D12_CBuffer` containing the constant buffers.");
-  rdctype::array ConstantBuffers;
+  rdcarray ConstantBuffers;
   DOCUMENT("List of :class:`D3D12_Sampler` containing the samplers.");
-  rdctype::array Samplers;
+  rdcarray Samplers;
   DOCUMENT("List of :class:`D3D12_View` containing the SRVs.");
-  rdctype::array SRVs;
+  rdcarray SRVs;
   DOCUMENT("List of :class:`D3D12_View` containing the UAVs.");
-  rdctype::array UAVs;
+  rdcarray UAVs;
 };
 
 DOCUMENT("Describes a D3D12 shader stage.");
@@ -269,7 +269,7 @@ mapping data.
   ShaderStage stage = ShaderStage::Vertex;
 
   DOCUMENT("A list of :class:`D3D12_RegisterSpace` with the register spaces for this stage.");
-  rdctype::array Spaces;
+  rdcarray Spaces;
 };
 
 DOCUMENT("Describes a binding on the D3D12 stream-out stage.");
@@ -294,7 +294,7 @@ DOCUMENT("Describes the stream-out state in the PSO.");
 struct Streamout
 {
   DOCUMENT("A list of ``D3D12_SOBind`` with the bound buffers.");
-  rdctype::array Outputs;
+  rdcarray Outputs;
 };
 
 DOCUMENT("Describes a single D3D12 viewport.");
@@ -377,10 +377,10 @@ struct Rasterizer
   uint32_t SampleMask = ~0U;
 
   DOCUMENT("A list of :class:`D3D12_Viewport` with the bound viewports.");
-  rdctype::array Viewports;
+  rdcarray Viewports;
 
   DOCUMENT("A list of :class:`D3D12_Scissor` with the bound scissor regions.");
-  rdctype::array Scissors;
+  rdcarray Scissors;
 
   DOCUMENT("A :class:`D3D12_RasterizerState` with the details of the rasterization state.");
   RasterizerState m_State;
@@ -467,7 +467,7 @@ struct BlendState
   bool IndependentBlend = false;
 
   DOCUMENT("A list of :class:`D3D12_Blend` describing the blend operations for each target.");
-  rdctype::array Blends;
+  rdcarray Blends;
 
   DOCUMENT("The constant blend factor to use in blend equations.");
   float BlendFactor[4] = {1.0f, 1.0f, 1.0f, 1.0f};
@@ -482,7 +482,7 @@ struct OM
   BlendState m_BlendState;
 
   DOCUMENT("A list of :class:`D3D12_View` describing the bound render targets.");
-  rdctype::array RenderTargets;
+  rdcarray RenderTargets;
 
   DOCUMENT("A :class:`D3D12_View` with details of the bound depth-stencil target.");
   View DepthTarget;
@@ -501,7 +501,7 @@ DOCUMENT("Describes the current state that a sub-resource is in.");
 struct ResourceState
 {
   DOCUMENT("A human-readable name for the current state.");
-  rdctype::str name;
+  rdcstr name;
 };
 
 DOCUMENT("Contains the current state of a given resource.");
@@ -511,7 +511,7 @@ struct ResourceData
   ResourceId id;
 
   DOCUMENT("A list of :class:`D3D12_ResourceState` entries, one for each subresource.");
-  rdctype::array states;
+  rdcarray states;
 };
 
 DOCUMENT("The full current D3D12 pipeline state.");
@@ -526,7 +526,7 @@ based on the ID.
   bool customName = false;
 
   DOCUMENT("The name of the pipeline state object.");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT("The :class:`ResourceId` of the root signature object.");
   ResourceId rootSig;
@@ -557,7 +557,7 @@ based on the ID.
   OM m_OM;
 
   DOCUMENT("A list of :class:`D3D12_ResourceData` entries, one for each resource.");
-  rdctype::array Resources;
+  rdcarray Resources;
 };
 
 };    // namespace D3D12Pipe
diff --git a/renderdoc/api/replay/data_types.h b/renderdoc/api/replay/data_types.h
index 16a31105e..35d679e59 100644
--- a/renderdoc/api/replay/data_types.h
+++ b/renderdoc/api/replay/data_types.h
@@ -55,7 +55,7 @@ struct PathEntry
   PathEntry() : flags(PathProperty::NoFlags), lastmod(0), size(0) {}
   PathEntry(const char *fn, PathProperty f) : filename(fn), flags(f), lastmod(0), size(0) {}
   DOCUMENT("The filename of this path. This contains only the filename, not the full path.");
-  rdctype::str filename;
+  rdcstr filename;
 
   DOCUMENT("The :class:`PathProperty` flags for this path.");
   PathProperty flags;
@@ -73,7 +73,7 @@ struct ResourceFormat;
 
 DOCUMENT("Internal function for getting the name for a resource format.");
 extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_ResourceFormatName(const ResourceFormat &fmt,
-                                                                        rdctype::str &name);
+                                                                        rdcstr &name);
 
 DOCUMENT("Description of the format of a resource or element.");
 struct ResourceFormat
@@ -101,9 +101,9 @@ struct ResourceFormat
   DOCUMENT(R"(:return: The name of the format.
 :rtype: str
 )");
-  rdctype::str Name() const
+  rdcstr Name() const
   {
-    rdctype::str ret;
+    rdcstr ret;
     RENDERDOC_ResourceFormatName(*this, ret);
     return ret;
   }
@@ -152,7 +152,7 @@ struct BufferDescription
   ResourceId ID;
 
   DOCUMENT("The name given to this buffer.");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT(R"(``True`` if the name was assigned by the application, otherwise it's autogenerated
 based on the ID.
@@ -172,7 +172,7 @@ DOCUMENT("A description of a texture resource.");
 struct TextureDescription
 {
   DOCUMENT("The name given to this buffer.");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT(R"(``True`` if the name was assigned by the application, otherwise it's autogenerated
 based on the ID.
@@ -244,10 +244,10 @@ results part way through the multi draw.
   uint32_t eventID;
 
   DOCUMENT("A list of addresses in the CPU callstack where this function was called.");
-  rdctype::array callstack;
+  rdcarray callstack;
 
   DOCUMENT("A raw debug string with the serialised form of the function call parameters.");
-  rdctype::str eventDesc;
+  rdcstr eventDesc;
 
   DOCUMENT(R"(A byte offset in the data stream where this event happens.
 
@@ -278,7 +278,7 @@ struct DebugMessage
   uint32_t messageID;
 
   DOCUMENT("The string contents of the message.");
-  rdctype::str description;
+  rdcstr description;
 };
 
 DECLARE_REFLECTION_STRUCT(DebugMessage);
@@ -326,10 +326,10 @@ struct ConstantBindStats
   uint32_t nulls;
 
   DOCUMENT("A list where the Nth element contains the number of calls that bound N buffers.");
-  rdctype::array bindslots;
+  rdcarray bindslots;
 
   DOCUMENT("A :class:`bucketed ` list over the sizes of buffers bound.");
-  rdctype::array sizes;
+  rdcarray sizes;
 };
 
 DECLARE_REFLECTION_STRUCT(ConstantBindStats);
@@ -347,7 +347,7 @@ struct SamplerBindStats
   uint32_t nulls;
 
   DOCUMENT("A list where the Nth element contains the number of calls that bound N samplers.");
-  rdctype::array bindslots;
+  rdcarray bindslots;
 };
 
 DECLARE_REFLECTION_STRUCT(SamplerBindStats);
@@ -368,10 +368,10 @@ struct ResourceBindStats
 
 The Nth element contains the number of times a resource of that type was bound.
 )");
-  rdctype::array types;
+  rdcarray types;
 
   DOCUMENT("A list where the Nth element contains the number of calls that bound N resources.");
-  rdctype::array bindslots;
+  rdcarray bindslots;
 };
 
 DECLARE_REFLECTION_STRUCT(ResourceBindStats);
@@ -404,10 +404,10 @@ struct ResourceUpdateStats
 
 The Nth element contains the number of times a resource of that type was updated.
 )");
-  rdctype::array types;
+  rdcarray types;
 
   DOCUMENT("A :class:`bucketed ` list over the number of bytes in the update.");
-  rdctype::array sizes;
+  rdcarray sizes;
 };
 
 DECLARE_REFLECTION_STRUCT(ResourceUpdateStats);
@@ -440,7 +440,7 @@ struct DrawcallStats
   uint32_t indirect;
 
   DOCUMENT("A :class:`bucketed ` list over the number of instances in the draw.");
-  rdctype::array counts;
+  rdcarray counts;
 };
 
 DECLARE_REFLECTION_STRUCT(DrawcallStats);
@@ -486,7 +486,7 @@ struct VertexBindStats
 
   DOCUMENT(
       "A list where the Nth element contains the number of calls that bound N vertex buffers.");
-  rdctype::array bindslots;
+  rdcarray bindslots;
 };
 
 DECLARE_REFLECTION_STRUCT(VertexBindStats);
@@ -576,10 +576,10 @@ struct RasterizationStats
   uint32_t redundants;
 
   DOCUMENT("A list where the Nth element contains the number of calls that bound N viewports.");
-  rdctype::array viewports;
+  rdcarray viewports;
 
   DOCUMENT("A list where the Nth element contains the number of calls that bound N scissor rects.");
-  rdctype::array rects;
+  rdcarray rects;
 };
 
 DECLARE_REFLECTION_STRUCT(RasterizationStats);
@@ -597,7 +597,7 @@ struct OutputTargetStats
   uint32_t nulls;
 
   DOCUMENT("A list where the Nth element contains the number of calls that bound N targets.");
-  rdctype::array bindslots;
+  rdcarray bindslots;
 };
 
 DECLARE_REFLECTION_STRUCT(OutputTargetStats);
@@ -704,7 +704,7 @@ this counts the frame number when the capture was made.
   FrameStatistics stats;
 
   DOCUMENT("A list of debug messages that are not associated with any particular event.");
-  rdctype::array debugMessages;
+  rdcarray debugMessages;
 };
 
 DECLARE_REFLECTION_STRUCT(FrameDescription);
@@ -783,7 +783,7 @@ struct DrawcallDescription
 .. note:: For drawcalls, the convention is to list primary parameters (vertex/index count, instance
   count) and omit secondary parameters (vertex offset, instance offset).
 )");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT("A set of :class:`DrawFlags` properties describing what kind of drawcall this is.");
   DrawFlags flags;
@@ -856,10 +856,10 @@ for very coarse bucketing of drawcalls into similar passes by their outputs.
   ResourceId depthOut;
 
   DOCUMENT("A list of the :class:`APIEvent` events that happened since the previous drawcall.");
-  rdctype::array events;
+  rdcarray events;
 
   DOCUMENT("A list of :class:`DrawcallDescription` child drawcalls.");
-  rdctype::array children;
+  rdcarray children;
 };
 
 DECLARE_REFLECTION_STRUCT(DrawcallDescription);
@@ -918,13 +918,13 @@ struct CounterDescription
   GPUCounter counterID;
 
   DOCUMENT("A short human-readable name for the counter.");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT("The counter category. Can be empty for uncategorized counters.");
-  rdctype::str category;
+  rdcstr category;
 
   DOCUMENT("If available, a longer human-readable description of the value this counter measures.");
-  rdctype::str description;
+  rdcstr description;
 
   DOCUMENT("The :class:`type of value ` returned by this counter.");
   CompType resultType;
diff --git a/renderdoc/api/replay/gl_pipestate.h b/renderdoc/api/replay/gl_pipestate.h
index dca7b283d..d2685f2ab 100644
--- a/renderdoc/api/replay/gl_pipestate.h
+++ b/renderdoc/api/replay/gl_pipestate.h
@@ -76,10 +76,10 @@ DOCUMENT("Describes the setup for fixed-function vertex input fetch.");
 struct VertexInput
 {
   DOCUMENT("A list of :class:`GL_VertexAttribute` with the vertex attributes.");
-  rdctype::array attributes;
+  rdcarray attributes;
 
   DOCUMENT("A list of :class:`GL_VB` with the vertex buffers.");
-  rdctype::array vbuffers;
+  rdcarray vbuffers;
 
   DOCUMENT("The :class:`ResourceId` of the index buffer.");
   ResourceId ibuffer;
@@ -102,14 +102,14 @@ struct Shader
   ResourceId Object;
 
   DOCUMENT("The name of the shader object.");
-  rdctype::str ShaderName;
+  rdcstr ShaderName;
   DOCUMENT(R"(``True`` if :data:`ShaderName` was assigned by the application, otherwise it's
 autogenerated based on the ID.
 )");
   bool customShaderName = false;
 
   DOCUMENT("The name of the program object.");
-  rdctype::str ProgramName;
+  rdcstr ProgramName;
   DOCUMENT(R"(``True`` if :data:`ProgramName` was assigned by the application, otherwise it's
 autogenerated based on the ID.
 )");
@@ -118,7 +118,7 @@ autogenerated based on the ID.
   DOCUMENT("``True`` if a program pipeline object is in use.");
   bool PipelineActive = false;
   DOCUMENT("The name of the pipeline object.");
-  rdctype::str PipelineName;
+  rdcstr PipelineName;
   DOCUMENT(R"(``True`` if :data:`PipelineName` was assigned by the application, otherwise it's
 autogenerated based on the ID.
 )");
@@ -135,7 +135,7 @@ mapping data.
   ShaderStage stage = ShaderStage::Vertex;
 
   DOCUMENT("A list of integers with the subroutine values.");
-  rdctype::array Subroutines;
+  rdcarray Subroutines;
 };
 
 DOCUMENT("Describes the setup for fixed vertex processing operations.");
@@ -376,10 +376,10 @@ DOCUMENT("Describes the rasterization state of the OpenGL pipeline.");
 struct Rasterizer
 {
   DOCUMENT("A list of :class:`GL_Viewport` with the bound viewports.");
-  rdctype::array Viewports;
+  rdcarray Viewports;
 
   DOCUMENT("A list of :class:`GL_Scissor` with the bound scissor regions.");
-  rdctype::array Scissors;
+  rdcarray Scissors;
 
   DOCUMENT("A :class:`GL_RasterizerState` with the details of the rasterization state.");
   RasterizerState m_State;
@@ -453,14 +453,14 @@ struct FBO
   DOCUMENT("The :class:`ResourceId` of the framebuffer.");
   ResourceId Obj;
   DOCUMENT("The list of :class:`GL_Attachment` with the framebuffer color attachments.");
-  rdctype::array Color;
+  rdcarray Color;
   DOCUMENT("The :class:`GL_Attachment` with the framebuffer depth attachment.");
   Attachment Depth;
   DOCUMENT("The :class:`GL_Attachment` with the framebuffer stencil attachment.");
   Attachment Stencil;
 
   DOCUMENT("The list of draw buffer indices into the :data:`Color` attachment list.");
-  rdctype::array DrawBuffers;
+  rdcarray DrawBuffers;
   DOCUMENT("The read buffer index in the :data:`Color` attachment list.");
   int32_t ReadBuffer = 0;
 };
@@ -497,7 +497,7 @@ DOCUMENT("Describes the blend pipeline state.");
 struct BlendState
 {
   DOCUMENT("A list of :class:`GL_Blend` describing the blend operations for each target.");
-  rdctype::array Blends;
+  rdcarray Blends;
 
   DOCUMENT("The constant blend factor to use in blend equations.");
   float BlendFactor[4] = {1.0f, 1.0f, 1.0f, 1.0f};
@@ -562,19 +562,19 @@ struct State
   FixedVertexProcessing m_VtxProcess;
 
   DOCUMENT("A list of :class:`GL_Texture` with the currently bound textures.");
-  rdctype::array Textures;
+  rdcarray Textures;
   DOCUMENT("A list of :class:`GL_Sampler` with the currently bound samplers.");
-  rdctype::array Samplers;
+  rdcarray Samplers;
 
   DOCUMENT("A list of :class:`GL_Buffer` with the currently bound atomic buffers.");
-  rdctype::array AtomicBuffers;
+  rdcarray AtomicBuffers;
   DOCUMENT("A list of :class:`GL_Buffer` with the currently bound uniform buffers.");
-  rdctype::array UniformBuffers;
+  rdcarray UniformBuffers;
   DOCUMENT("A list of :class:`GL_Buffer` with the currently bound shader storage buffers.");
-  rdctype::array ShaderStorageBuffers;
+  rdcarray ShaderStorageBuffers;
 
   DOCUMENT("A list of :class:`GL_ImageLoadStore` with the currently bound load/store images.");
-  rdctype::array Images;
+  rdcarray Images;
 
   DOCUMENT("A :class:`GL_Feedback` describing the transform feedback stage.");
   Feedback m_Feedback;
diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h
index 818cc0343..89bdc3fa0 100644
--- a/renderdoc/api/replay/renderdoc_replay.h
+++ b/renderdoc/api/replay/renderdoc_replay.h
@@ -341,7 +341,7 @@ Should only be called for texture outputs.
 :return: A tuple with the minimum and maximum pixel values respectively.
 :rtype: ``tuple`` of PixelValue and PixelValue
 )");
-  virtual rdctype::pair GetMinMax() = 0;
+  virtual rdcpair GetMinMax() = 0;
 
   DOCUMENT(R"(Retrieve a list of values that can be used to show a histogram of values for the
 current texture.
@@ -360,7 +360,7 @@ Should only be called for texture outputs.
 :return: A list of the unnormalised bucket values.
 :rtype: ``list`` of ``int``
 )");
-  virtual rdctype::array GetHistogram(float minval, float maxval, bool channels[4]) = 0;
+  virtual rdcarray GetHistogram(float minval, float maxval, bool channels[4]) = 0;
 
   DOCUMENT(R"(Retrieves the :class:`ResourceId` containing the contents of the texture after being
 passed through a custom shader pass.
@@ -411,7 +411,7 @@ Should only be called for mesh outputs.
   the instance index. The values are set to :data:`NoResult` if no vertex was found, 
 :rtype: ``tuple`` of ``int`` and ``int``
 )");
-  virtual rdctype::pair PickVertex(uint32_t eventID, uint32_t x, uint32_t y) = 0;
+  virtual rdcpair PickVertex(uint32_t eventID, uint32_t x, uint32_t y) = 0;
 
   static const uint32_t NoResult = ~0U;
 
@@ -441,7 +441,7 @@ struct IReplayController
 :return: The list of supported systems.
 :rtype: ``list`` of :class:`WindowingSystem`
 )");
-  virtual rdctype::array GetSupportedWindowSystems() = 0;
+  virtual rdcarray GetSupportedWindowSystems() = 0;
 
   DOCUMENT(R"(Creates a replay output of the given type to the given native window
 
@@ -558,7 +558,7 @@ or hardware-specific ISA formats.
 :return: The list of disassembly targets available.
 :rtype: ``list`` of ``str``
 )");
-  virtual rdctype::array GetDisassemblyTargets() = 0;
+  virtual rdcarray GetDisassemblyTargets() = 0;
 
   DOCUMENT(R"(Retrieve the disassembly for a given shader, for the given disassembly target.
 
@@ -569,8 +569,8 @@ or hardware-specific ISA formats.
 :return: The disassembly text, or an error message if something went wrong.
 :rtype: str
 )");
-  virtual rdctype::str DisassembleShader(ResourceId pipeline, const ShaderReflection *refl,
-                                         const char *target) = 0;
+  virtual rdcstr DisassembleShader(ResourceId pipeline, const ShaderReflection *refl,
+                                   const char *target) = 0;
 
   DOCUMENT(R"(Builds a shader suitable for running on the local replay instance as a custom shader.
 
@@ -586,9 +586,9 @@ See :data:`TextureDisplay.CustomShader`.
   :meth:`ResourceId.Null` otherwise, and a ``str`` with any warnings/errors from compilation.
 :rtype: ``tuple`` of :class:`ResourceId` and ``str``.
 )");
-  virtual rdctype::pair BuildCustomShader(
-      const char *entry, const char *source, const ShaderCompileFlags &compileFlags,
-      ShaderStage type) = 0;
+  virtual rdcpair BuildCustomShader(const char *entry, const char *source,
+                                                        const ShaderCompileFlags &compileFlags,
+                                                        ShaderStage type) = 0;
 
   DOCUMENT(R"(Free a previously created custom shader.
 
@@ -610,10 +610,9 @@ The language used is native to the API's renderer - HLSL for D3D based renderers
   :meth:`ResourceId.Null` otherwise, and a ``str`` with any warnings/errors from compilation.
 :rtype: ``tuple`` of :class:`ResourceId` and ``str``.
 )");
-  virtual rdctype::pair BuildTargetShader(const char *entry,
-                                                                    const char *source,
-                                                                    const ShaderCompileFlags &flags,
-                                                                    ShaderStage type) = 0;
+  virtual rdcpair BuildTargetShader(const char *entry, const char *source,
+                                                        const ShaderCompileFlags &flags,
+                                                        ShaderStage type) = 0;
 
   DOCUMENT(R"(Replace one resource with another for subsequent replay and analysis work.
 
@@ -655,7 +654,7 @@ See :meth:`BuildTargetShader`.
 :return: The list of root-level drawcalls in the capture.
 :rtype: ``list`` of :class:`DrawcallDescription`
 )");
-  virtual rdctype::array GetDrawcalls() = 0;
+  virtual rdcarray GetDrawcalls() = 0;
 
   DOCUMENT(R"(Retrieve the values of a specified set of counters.
 
@@ -663,7 +662,7 @@ See :meth:`BuildTargetShader`.
 :return: The list of counter results generated.
 :rtype: ``list`` of :class:`CounterResult`
 )");
-  virtual rdctype::array FetchCounters(const rdctype::array &counters) = 0;
+  virtual rdcarray FetchCounters(const rdcarray &counters) = 0;
 
   DOCUMENT(R"(Retrieve a list of which counters are available in the current capture analysis
 implementation.
@@ -671,7 +670,7 @@ implementation.
 :return: The list of counters available.
 :rtype: ``list`` of :class:`GPUCounter`
 )");
-  virtual rdctype::array EnumerateCounters() = 0;
+  virtual rdcarray EnumerateCounters() = 0;
 
   DOCUMENT(R"(Get information about what a counter actually represents, in terms of a human-readable
 understanding as well as the type and unit of the resulting information.
@@ -687,14 +686,14 @@ understanding as well as the type and unit of the resulting information.
 :return: The list of textures in the capture.
 :rtype: ``list`` of :class:`TextureDescription`
 )");
-  virtual rdctype::array GetTextures() = 0;
+  virtual rdcarray GetTextures() = 0;
 
   DOCUMENT(R"(Retrieve the list of buffers alive in the capture.
 
 :return: The list of buffers in the capture.
 :rtype: ``list`` of :class:`BufferDescription`
 )");
-  virtual rdctype::array GetBuffers() = 0;
+  virtual rdcarray GetBuffers() = 0;
 
   DOCUMENT(R"(Retrieve the list of buffers alive in the capture.
 
@@ -704,7 +703,7 @@ Must only be called after :meth:`InitResolver` has returned ``True``.
 :return: The list of resolved callstack entries as strings.
 :rtype: ``list`` of ``str``
 )");
-  virtual rdctype::array GetResolve(const rdctype::array &callstack) = 0;
+  virtual rdcarray GetResolve(const rdcarray &callstack) = 0;
 
   DOCUMENT(R"(Retrieve a list of any newly generated diagnostic messages.
 
@@ -714,7 +713,7 @@ newly generated messages will be returned after that.
 :return: The list of the :class:`DebugMessage` messages.
 :rtype: ``list`` of :class:`DebugMessage`
 )");
-  virtual rdctype::array GetDebugMessages() = 0;
+  virtual rdcarray GetDebugMessages() = 0;
 
   DOCUMENT(R"(Retrieve the history of modifications to the selected pixel on the selected texture.
 
@@ -728,9 +727,9 @@ newly generated messages will be returned after that.
 :return: The list of pixel history events.
 :rtype: ``list`` of :class:`PixelModification`
 )");
-  virtual rdctype::array PixelHistory(ResourceId texture, uint32_t x, uint32_t y,
-                                                         uint32_t slice, uint32_t mip,
-                                                         uint32_t sampleIdx, CompType typeHint) = 0;
+  virtual rdcarray PixelHistory(ResourceId texture, uint32_t x, uint32_t y,
+                                                   uint32_t slice, uint32_t mip, uint32_t sampleIdx,
+                                                   CompType typeHint) = 0;
 
   DOCUMENT(R"(Retrieve a debugging trace from running a vertex shader.
 
@@ -783,7 +782,7 @@ newly generated messages will be returned after that.
 :return: The list of usages of the resource.
 :rtype: ``list`` of :class:`EventUsage`
 )");
-  virtual rdctype::array GetUsage(ResourceId id) = 0;
+  virtual rdcarray GetUsage(ResourceId id) = 0;
 
   DOCUMENT(R"(Retrieve the contents of a constant block by reading from memory or their source
 otherwise.
@@ -797,11 +796,10 @@ otherwise.
 :return: The shader variables with their contents.
 :rtype: ``list`` of :class:`ShaderVariable`
 )");
-  virtual rdctype::array GetCBufferVariableContents(ResourceId shader,
-                                                                    const char *entryPoint,
-                                                                    uint32_t cbufslot,
-                                                                    ResourceId buffer,
-                                                                    uint64_t offs) = 0;
+  virtual rdcarray GetCBufferVariableContents(ResourceId shader,
+                                                              const char *entryPoint,
+                                                              uint32_t cbufslot, ResourceId buffer,
+                                                              uint64_t offs) = 0;
 
   DOCUMENT(R"(Save a texture to a file on disk, with possible transformation to map a complex
 texture to something compatible with the target file format.
@@ -830,7 +828,7 @@ texture to something compatible with the target file format.
 :return: The requested buffer contents.
 :rtype: ``bytes``
 )");
-  virtual rdctype::array GetBufferData(ResourceId buff, uint64_t offset, uint64_t len) = 0;
+  virtual bytebuf GetBufferData(ResourceId buff, uint64_t offset, uint64_t len) = 0;
 
   DOCUMENT(R"(Retrieve the contents of one subresource of a texture as a ``bytes``.
 
@@ -844,7 +842,7 @@ sample 0, etc.
 :return: The requested texture contents.
 :rtype: ``bytes``
 )");
-  virtual rdctype::array GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip) = 0;
+  virtual bytebuf GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip) = 0;
 
   static const uint32_t NoPreference = ~0U;
 
@@ -981,7 +979,7 @@ These will be strings like "D3D11" or "OpenGL".
 :return: A list of names of the local proxies.
 :rtype: ``list`` of ``str``
 )");
-  virtual rdctype::array LocalProxies() = 0;
+  virtual rdcarray LocalProxies() = 0;
 
   DOCUMENT(R"(Retrieve a list of renderers supported by the remote server.
 
@@ -990,14 +988,14 @@ These will be strings like "D3D11" or "OpenGL".
 :return: A list of names of the remote renderers.
 :rtype: ``list`` of ``str``
 )");
-  virtual rdctype::array RemoteSupportedReplays() = 0;
+  virtual rdcarray RemoteSupportedReplays() = 0;
 
   DOCUMENT(R"(Retrieve the path on the remote system where browsing can begin.
 
 :return: The 'home' path where browsing for files or folders can begin.
 :rtype: ``str``
 )");
-  virtual rdctype::str GetHomeFolder() = 0;
+  virtual rdcstr GetHomeFolder() = 0;
 
   DOCUMENT(R"(Retrieve the contents of a folder path on the remote system.
 
@@ -1007,7 +1005,7 @@ If an error occurs, a single :class:`PathEntry` will be returned with appropriat
 :return: The contents of the specified folder.
 :rtype: ``list`` of :class:`PathEntry`
 )");
-  virtual rdctype::array ListFolder(const char *path) = 0;
+  virtual rdcarray ListFolder(const char *path) = 0;
 
   DOCUMENT(R"(Launch an application and inject into it to allow capturing.
 
@@ -1025,7 +1023,7 @@ This happens on the remote system, so all paths are relative to the remote files
 :rtype: ``int``
 )");
   virtual uint32_t ExecuteAndInject(const char *app, const char *workingDir, const char *cmdLine,
-                                    const rdctype::array &env,
+                                    const rdcarray &env,
                                     const CaptureOptions &opts) = 0;
 
   DOCUMENT(R"(Take ownership over a capture file.
@@ -1054,7 +1052,7 @@ the capture must be available on the machine where the replay happens.
 :return: The path on the remote system where the capture was saved temporarily.
 :rtype: ``str``
 )");
-  virtual rdctype::str CopyCaptureToRemote(const char *filename, float *progress) = 0;
+  virtual rdcstr CopyCaptureToRemote(const char *filename, float *progress) = 0;
 
   DOCUMENT(R"(Copy a capture file that is stored on the remote system to the local system.
 
@@ -1089,9 +1087,9 @@ or an error has occurred.
   resulting :class:`ReplayController` handle if successful.
 :rtype: ``tuple`` of :class:`ReplayStatus` and :class:`ReplayController`
 )");
-  virtual rdctype::pair OpenCapture(uint32_t proxyid,
-                                                                       const char *logfile,
-                                                                       float *progress) = 0;
+  virtual rdcpair OpenCapture(uint32_t proxyid,
+                                                                 const char *logfile,
+                                                                 float *progress) = 0;
 
   DOCUMENT(R"(Close a capture analysis handle previously opened by :meth:`OpenCapture`.
 
@@ -1167,7 +1165,7 @@ by the :class:`ReplayController`.
   resulting :class:`ReplayController` handle if successful.
 :rtype: ``tuple`` of :class:`ReplayStatus` and :class:`ReplayController`.
 )");
-  virtual rdctype::pair OpenCapture(float *progress) = 0;
+  virtual rdcpair OpenCapture(float *progress) = 0;
 
   DOCUMENT(R"(Retrieves the embedded thumbnail from the capture.
 
@@ -1177,7 +1175,7 @@ by the :class:`ReplayController`.
   resolution.
 :rtype: ``bytes``.
   )");
-  virtual rdctype::array GetThumbnail(FileType type, uint32_t maxsize) = 0;
+  virtual bytebuf GetThumbnail(FileType type, uint32_t maxsize) = 0;
 
 protected:
   ICaptureFile() = default;
@@ -1490,7 +1488,7 @@ DOCUMENT(R"(Launch an application and inject into it to allow capturing.
 )");
 extern "C" RENDERDOC_API uint32_t RENDERDOC_CC
 RENDERDOC_ExecuteAndInject(const char *app, const char *workingDir, const char *cmdLine,
-                           const rdctype::array &env, const char *logfile,
+                           const rdcarray &env, const char *logfile,
                            const CaptureOptions &opts, bool waitForExit);
 
 DOCUMENT(R"(Where supported by operating system and permissions, inject into a running process.
@@ -1504,7 +1502,7 @@ DOCUMENT(R"(Where supported by operating system and permissions, inject into a r
 :rtype: ``int``
 )");
 extern "C" RENDERDOC_API uint32_t RENDERDOC_CC
-RENDERDOC_InjectIntoProcess(uint32_t pid, const rdctype::array &env,
+RENDERDOC_InjectIntoProcess(uint32_t pid, const rdcarray &env,
                             const char *logfile, const CaptureOptions &opts, bool waitForExit);
 
 DOCUMENT(R"(When debugging RenderDoc it can be useful to capture itself by doing a side-build with a
@@ -1526,9 +1524,8 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EndSelfHostCapture(const ch
 //////////////////////////////////////////////////////////////////////////
 
 DOCUMENT("Internal function for determining vulkan layer registration status.");
-extern "C" RENDERDOC_API bool RENDERDOC_CC
-RENDERDOC_NeedVulkanLayerRegistration(VulkanLayerFlags *flags, rdctype::array *myJSONs,
-                                      rdctype::array *otherJSONs);
+extern "C" RENDERDOC_API bool RENDERDOC_CC RENDERDOC_NeedVulkanLayerRegistration(
+    VulkanLayerFlags *flags, rdcarray *myJSONs, rdcarray *otherJSONs);
 
 DOCUMENT("Internal function for updating vulkan layer registration.");
 extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_UpdateVulkanLayerRegistration(bool systemLevel);
@@ -1538,8 +1535,8 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_UpdateVulkanLayerRegistrati
 //////////////////////////////////////////////////////////////////////////
 
 DOCUMENT("Internal function for initialising global process environment in a replay program.");
-extern "C" RENDERDOC_API void RENDERDOC_CC
-RENDERDOC_InitGlobalEnv(GlobalEnvironment env, const rdctype::array &args);
+extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_InitGlobalEnv(GlobalEnvironment env,
+                                                                   const rdcarray &args);
 
 DOCUMENT("Internal function for triggering exception handler.");
 extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_TriggerExceptionHandler(void *exceptionPtrs,
@@ -1590,11 +1587,11 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_SetColors(FloatVector darkC
                                                                bool darkTheme);
 
 DOCUMENT("Internal function for fetching friendly android names.");
-extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_GetAndroidFriendlyName(const rdctype::str &device,
-                                                                            rdctype::str &friendly);
+extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_GetAndroidFriendlyName(const rdcstr &device,
+                                                                            rdcstr &friendly);
 
 DOCUMENT("Internal function for enumerating android devices.");
-extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EnumerateAndroidDevices(rdctype::str *deviceList);
+extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EnumerateAndroidDevices(rdcstr *deviceList);
 
 DOCUMENT("Internal function for starting an android remote server.");
 extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_StartAndroidRemoteServer(const char *device);
@@ -1614,5 +1611,5 @@ extern "C" RENDERDOC_API bool RENDERDOC_CC RENDERDOC_AddLayerToAndroidPackage(co
                                                                               float *progress);
 
 DOCUMENT("Internal function that runs unit tests.");
-extern "C" RENDERDOC_API int RENDERDOC_CC
-RENDERDOC_RunUnitTests(const rdctype::str &command, const rdctype::array &args);
+extern "C" RENDERDOC_API int RENDERDOC_CC RENDERDOC_RunUnitTests(const rdcstr &command,
+                                                                 const rdcarray &args);
diff --git a/renderdoc/api/replay/shader_types.h b/renderdoc/api/replay/shader_types.h
index cda9d562e..c503c99ae 100644
--- a/renderdoc/api/replay/shader_types.h
+++ b/renderdoc/api/replay/shader_types.h
@@ -171,7 +171,7 @@ struct ShaderVariable
   DOCUMENT("The number of columns in this matrix.");
   uint32_t columns;
   DOCUMENT("The name of this variable.");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT("The :class:`basic type ` of this variable.");
   VarType type;
@@ -186,7 +186,7 @@ struct ShaderVariable
   bool isStruct;
 
   DOCUMENT("The members of this variable as a list of :class:`ShaderValue`.");
-  rdctype::array members;
+  rdcarray members;
 };
 
 DECLARE_REFLECTION_STRUCT(ShaderVariable);
@@ -197,13 +197,13 @@ with all mutable variable contents.
 struct ShaderDebugState
 {
   DOCUMENT("The temporary variables for this shader as a list of :class:`ShaderValue`.");
-  rdctype::array registers;
+  rdcarray registers;
   DOCUMENT("The output variables for this shader as a list of :class:`ShaderValue`.");
-  rdctype::array outputs;
+  rdcarray outputs;
 
   DOCUMENT(
       "Indexable temporary variables for this shader as a list of :class:`ShaderValue` lists.");
-  rdctype::array > indexableTemps;
+  rdcarray > indexableTemps;
 
   DOCUMENT(R"(The next instruction to be executed after this state. The initial state before any
 shader execution happened will have ``nextInstruction == 0``.)");
@@ -222,18 +222,18 @@ change with shader execution.
 struct ShaderDebugTrace
 {
   DOCUMENT("The input variables for this shader as a list of :class:`ShaderValue`.");
-  rdctype::array inputs;
+  rdcarray inputs;
   DOCUMENT(R"(Constant variables for this shader as a list of :class:`ShaderValue` lists.
 
 Each entry in this list corresponds to a constant block with the same index in the
 :data:`ShaderBindpointMapping.ConstantBlocks` list, which can be used to look up the metadata.
 )");
-  rdctype::array > cbuffers;
+  rdcarray > cbuffers;
 
   DOCUMENT(R"(A list of :class:`ShaderDebugState` states representing the state after each
 instruction was executed
 )");
-  rdctype::array states;
+  rdcarray states;
 };
 
 DECLARE_REFLECTION_STRUCT(ShaderDebugTrace);
@@ -262,11 +262,11 @@ struct SigParameter
   }
 
   DOCUMENT("The name of this variable - may not be present in the metadata for all APIs.");
-  rdctype::str varName;
+  rdcstr varName;
   DOCUMENT("The semantic name of this variable, if the API uses semantic matching for bindings.");
-  rdctype::str semanticName;
+  rdcstr semanticName;
   DOCUMENT("The combined semantic name and index.");
-  rdctype::str semanticIdxName;
+  rdcstr semanticIdxName;
   DOCUMENT("The semantic index of this variable - see :data:`semanticName`.");
   uint32_t semanticIndex;
 
@@ -326,7 +326,7 @@ struct ShaderVariableDescriptor
   DOCUMENT("The number of bytes between the start of one element in the array and the next.");
   uint32_t arrayStride;
   DOCUMENT("The name of the type of this constant, e.g. a ``struct`` name.");
-  rdctype::str name;
+  rdcstr name;
 };
 
 DECLARE_REFLECTION_STRUCT(ShaderVariableDescriptor);
@@ -338,7 +338,7 @@ struct ShaderVariableType
   ShaderVariableDescriptor descriptor;
 
   DOCUMENT("A list of :class:`ShaderConstant` with any members that this constant may contain.");
-  rdctype::array members;
+  rdcarray members;
 };
 
 DECLARE_REFLECTION_STRUCT(ShaderVariableType);
@@ -358,7 +358,7 @@ DOCUMENT("Contains the detail of a constant within a :class:`ConstantBlock` in m
 struct ShaderConstant
 {
   DOCUMENT("The name of this constant");
-  rdctype::str name;
+  rdcstr name;
   DOCUMENT(
       "A :class:`ShaderRegister` describing where this constant is offset from the start of the "
       "block");
@@ -379,9 +379,9 @@ information.
 struct ConstantBlock
 {
   DOCUMENT("The name of this constant block, may be empty on some APIs.");
-  rdctype::str name;
+  rdcstr name;
   DOCUMENT("The constants contained within this block as a list of :class:`ShaderConstant`.");
-  rdctype::array variables;
+  rdcarray variables;
   DOCUMENT(R"(The bindpoint for this block. This is an index in the
 :data:`ShaderBindpointMapping.ConstantBlocks` list.
 )");
@@ -406,7 +406,7 @@ relevant.
 struct ShaderSampler
 {
   DOCUMENT("The name of this sampler.");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT(R"(The bindpoint for this block. This is an index in either the
 :data:`ShaderBindpointMapping.Samplers` list.
@@ -428,7 +428,7 @@ struct ShaderResource
   TextureDim resType;
 
   DOCUMENT("The name of this resource.");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT("A :class:`ShaderVariableType` describing type of each element of this resource.");
   ShaderVariableType variableType;
@@ -458,7 +458,7 @@ struct ShaderCompileFlags
 
 Each entry is an API or compiler specific flag used to compile this shader originally.
 )");
-  rdctype::array > flags;
+  rdcarray > flags;
 };
 
 DOCUMENT(R"(Contains the information about a shader contained within API-specific debugging
@@ -476,7 +476,7 @@ struct ShaderDebugChunk
 
 The first entry in the list is always the file where the entry point is.
 )");
-  rdctype::array > files;
+  rdcarray > files;
 };
 
 DECLARE_REFLECTION_STRUCT(ShaderDebugChunk);
@@ -493,37 +493,37 @@ struct ShaderReflection
   ResourceId ID;
 
   DOCUMENT("The entry point in the shader for this reflection, if multiple entry points exist.");
-  rdctype::str EntryPoint;
+  rdcstr EntryPoint;
 
   DOCUMENT(
       "A :class:`ShaderDebugChunk` containing any embedded debugging information in this shader.");
   ShaderDebugChunk DebugInfo;
 
   DOCUMENT("A raw ``bytes`` dump of the original shader, encoded in API specific binary form.");
-  rdctype::array RawBytes;
+  bytebuf RawBytes;
 
   DOCUMENT("The 3D dimensions of a compute workgroup, for compute shaders.");
   uint32_t DispatchThreadsDimension[3];
 
   DOCUMENT("A list of :class:`SigParameter` with the shader's input signature.");
-  rdctype::array InputSig;
+  rdcarray InputSig;
   DOCUMENT("A list of :class:`SigParameter` with the shader's output signature.");
-  rdctype::array OutputSig;
+  rdcarray OutputSig;
 
   DOCUMENT("A list of :class:`ConstantBlock` with the shader's constant bindings.");
-  rdctype::array ConstantBlocks;
+  rdcarray ConstantBlocks;
 
   DOCUMENT("A list of :class:`ShaderSampler` with the shader's samplers.");
-  rdctype::array Samplers;
+  rdcarray Samplers;
 
   DOCUMENT("A list of :class:`ShaderResource` with the shader's read-only resources.");
-  rdctype::array ReadOnlyResources;
+  rdcarray ReadOnlyResources;
   DOCUMENT("A list of :class:`ShaderResource` with the shader's read-write resources.");
-  rdctype::array ReadWriteResources;
+  rdcarray ReadWriteResources;
 
   // TODO expand this to encompass shader subroutines.
   DOCUMENT("A list of strings with the shader's interfaces. Largely an unused API feature.");
-  rdctype::array Interfaces;
+  rdcarray Interfaces;
 };
 
 DECLARE_REFLECTION_STRUCT(ShaderReflection);
@@ -613,27 +613,27 @@ struct ShaderBindpointMapping
   DOCUMENT(R"(This maps input attributes as a simple swizzle on the
 :data:`ShaderReflection.InputSig` indices for APIs where this mapping is mutable at runtime.
 )");
-  rdctype::array InputAttributes;
+  rdcarray InputAttributes;
 
   DOCUMENT(R"(Provides a list of :class:`BindpointMap` entries for remapping the
 :data:`ShaderReflection.ConstantBlocks` list.
 )");
-  rdctype::array ConstantBlocks;
+  rdcarray ConstantBlocks;
 
   DOCUMENT(R"(Provides a list of :class:`BindpointMap` entries for remapping the
 :data:`ShaderReflection.Samplers` list.
 )");
-  rdctype::array Samplers;
+  rdcarray Samplers;
 
   DOCUMENT(R"(Provides a list of :class:`BindpointMap` entries for remapping the
 :data:`ShaderReflection.ReadOnlyResources` list.
 )");
-  rdctype::array ReadOnlyResources;
+  rdcarray ReadOnlyResources;
 
   DOCUMENT(R"(Provides a list of :class:`BindpointMap` entries for remapping the
 :data:`ShaderReflection.ReadWriteResources` list.
 )");
-  rdctype::array ReadWriteResources;
+  rdcarray ReadWriteResources;
 };
 
 DECLARE_REFLECTION_STRUCT(ShaderBindpointMapping);
diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h
index eca60f35f..1566a0fb2 100644
--- a/renderdoc/api/replay/vk_pipestate.h
+++ b/renderdoc/api/replay/vk_pipestate.h
@@ -39,7 +39,7 @@ struct BindingElement
   bool immutableSampler = false;
 
   DOCUMENT("The name of the current sampler object, if one is bound. Empty for other bindings.");
-  rdctype::str name;
+  rdcstr name;
 
   DOCUMENT(R"(``True`` if :data:`name` was assigned by the application, otherwise it's autogenerated
 based on the ID.
@@ -115,7 +115,7 @@ If this binding is empty/non-existant this value will be ``0``.
   DOCUMENT(R"(A list of :class:`VK_BindingElement` with the binding elements.
 If :data:`descriptorCount` is 1 then this isn't an array, and this list has only one element.
 )");
-  rdctype::array binds;
+  rdcarray binds;
 };
 
 DOCUMENT("The contents of a descriptor set.");
@@ -129,7 +129,7 @@ struct DescriptorSet
   DOCUMENT(R"(A list of :class:`VK_DescriptorBinding` with the bindings within this set.
 This list is indexed by the binding, so it may be sparse (some entries do not contain any elements).
 )");
-  rdctype::array bindings;
+  rdcarray bindings;
 };
 
 DOCUMENT("Describes the object and descriptor set bindings of a Vulkan pipeline object.");
@@ -141,7 +141,7 @@ struct Pipeline
   uint32_t flags = 0;
 
   DOCUMENT("A list of :class:`VK_DescriptorSet` with the bound descriptor sets.");
-  rdctype::array DescSets;
+  rdcarray DescSets;
 };
 
 DOCUMENT("Describes the Vulkan index buffer binding.")
@@ -203,11 +203,11 @@ DOCUMENT("Describes the fixed-function vertex input fetch setup.");
 struct VertexInput
 {
   DOCUMENT("A list of :class:`VK_VertexAttribute` with the vertex attributes.");
-  rdctype::array attrs;
+  rdcarray attrs;
   DOCUMENT("A list of :class:`VK_VertexBinding` with the vertex bindings.");
-  rdctype::array binds;
+  rdcarray binds;
   DOCUMENT("A list of :class:`VK_VB` with the vertex buffers.");
-  rdctype::array vbuffers;
+  rdcarray vbuffers;
 };
 
 DOCUMENT("The provided value for a specialization constant.");
@@ -216,7 +216,7 @@ struct SpecInfo
   DOCUMENT("The specialization ID");
   uint32_t specID = 0;
   DOCUMENT("A ``bytes`` with the contents of the constant.");
-  rdctype::array data;
+  bytebuf data;
 };
 
 DOCUMENT("Describes a Vulkan shader stage.");
@@ -225,10 +225,10 @@ struct Shader
   DOCUMENT("The :class:`ResourceId` of the shader module object.");
   ResourceId Object;
   DOCUMENT("The name of the entry point in the shader module that is used.");
-  rdctype::str entryPoint;
+  rdcstr entryPoint;
 
   DOCUMENT("The name of the shader module.");
-  rdctype::str name;
+  rdcstr name;
   DOCUMENT(R"(``True`` if :data:`name` was assigned by the application, otherwise it's autogenerated
 based on the ID.
 )");
@@ -245,7 +245,7 @@ mapping data.
   ShaderStage stage = ShaderStage::Vertex;
 
   DOCUMENT("A list of :class:`VK_SpecInfo` with the provided specialization constants.");
-  rdctype::array specialization;
+  rdcarray specialization;
 };
 
 DOCUMENT("Describes the state of the fixed-function tessellator.");
@@ -298,7 +298,7 @@ DOCUMENT("Describes the view state in the pipeline.");
 struct ViewState
 {
   DOCUMENT("A list of :class:`VK_ViewportScissor`.");
-  rdctype::array viewportScissors;
+  rdcarray viewportScissors;
 };
 
 DOCUMENT("Describes the raster state in the pipeline.");
@@ -384,7 +384,7 @@ struct ColorBlend
   LogicOp logic = LogicOp::NoOp;
 
   DOCUMENT("The list of :class:`VK_Blend` with the blending configuration per-attachment.");
-  rdctype::array attachments;
+  rdcarray attachments;
 
   DOCUMENT("The constant blend factor to use in blend equations.");
   float blendConst[4] = {1.0f, 1.0f, 1.0f, 1.0f};
@@ -444,11 +444,11 @@ struct RenderPass
   // VKTODOMED renderpass and subpass information here
 
   DOCUMENT("A list of indices into the framebuffer attachments for input attachments.");
-  rdctype::array inputAttachments;
+  rdcarray inputAttachments;
   DOCUMENT("A list of indices into the framebuffer attachments for color attachments.");
-  rdctype::array colorAttachments;
+  rdcarray colorAttachments;
   DOCUMENT("A list of indices into the framebuffer attachments for resolve attachments.");
-  rdctype::array resolveAttachments;
+  rdcarray resolveAttachments;
   DOCUMENT(R"(An index into the framebuffer attachments for the depth-stencil attachment.
 
 If there is no depth-stencil attachment, this index is ``-1``.
@@ -486,7 +486,7 @@ struct Framebuffer
   ResourceId obj;
 
   DOCUMENT("A list of :class:`VK_Attachment` with the attachments of this framebuffer.");
-  rdctype::array attachments;
+  rdcarray attachments;
 
   DOCUMENT("The width of this framebuffer in pixels.");
   uint32_t width = 0;
@@ -532,7 +532,7 @@ struct ImageLayout
   DOCUMENT("For 3D textures and texture arrays, the number of array slices in the range.");
   uint32_t numLayer = 1;
   DOCUMENT("The name of the current image state.");
-  rdctype::str name;
+  rdcstr name;
 };
 
 DOCUMENT("Contains the current layout of all subresources in the image.");
@@ -543,7 +543,7 @@ struct ImageData
 
   DOCUMENT(
       "A list of :class:`VK_ImageLayout` with the set of subresources that make up the image.");
-  rdctype::array layouts;
+  rdcarray layouts;
 };
 
 DOCUMENT("The full current Vulkan pipeline state.");
@@ -591,7 +591,7 @@ struct State
   CurrentPass Pass;
 
   DOCUMENT("A list of :class:`VK_ImageData` entries, one for each image.");
-  rdctype::array images;
+  rdcarray images;
 };
 
 };    // namespace VKPipe
diff --git a/renderdoc/core/android.cpp b/renderdoc/core/android.cpp
index e363c9bb5..0d42b79a8 100644
--- a/renderdoc/core/android.cpp
+++ b/renderdoc/core/android.cpp
@@ -792,8 +792,8 @@ string FindAndroidLayer(const string &abi, const string &layerName)
   return layer;
 }
 
-extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_GetAndroidFriendlyName(const rdctype::str &device,
-                                                                            rdctype::str &friendly)
+extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_GetAndroidFriendlyName(const rdcstr &device,
+                                                                            rdcstr &friendly)
 {
   if(!IsHostADB(device.c_str()))
   {
@@ -831,7 +831,7 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_GetAndroidFriendlyName(cons
     friendly = combined;
 }
 
-extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EnumerateAndroidDevices(rdctype::str *deviceList)
+extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EnumerateAndroidDevices(rdcstr *deviceList)
 {
   string adbStdout = adbGetDeviceList();
 
diff --git a/renderdoc/core/remote_server.cpp b/renderdoc/core/remote_server.cpp
index 4e6c719d3..dafe4fec0 100644
--- a/renderdoc/core/remote_server.cpp
+++ b/renderdoc/core/remote_server.cpp
@@ -434,7 +434,7 @@ static void ActiveRemoteClientThread(ClientThread *threadData)
         recvser->Serialise("cmdLine", cmdLine);
         recvser->Serialise("opts", opts);
 
-        rdctype::array env;
+        rdcarray env;
         recvser->Serialise("env", env);
 
         uint32_t ident = uint32_t(ReplayStatus::NetworkIOFailed);
@@ -743,9 +743,9 @@ public:
     return type == eRemoteServer_Ping;
   }
 
-  rdctype::array LocalProxies()
+  rdcarray LocalProxies()
   {
-    rdctype::array out;
+    rdcarray out;
 
     m_Proxies.reserve(m_Proxies.size());
 
@@ -756,9 +756,9 @@ public:
     return out;
   }
 
-  rdctype::array RemoteSupportedReplays()
+  rdcarray RemoteSupportedReplays()
   {
-    rdctype::array out;
+    rdcarray out;
 
     {
       Serialiser sendData("", Serialiser::WRITING, false);
@@ -793,12 +793,12 @@ public:
     return out;
   }
 
-  rdctype::str GetHomeFolder()
+  rdcstr GetHomeFolder()
   {
     if(Android::IsHostADB(m_hostname.c_str()))
       return "/";
 
-    rdctype::str ret;
+    rdcstr ret;
 
     Serialiser sendData("", Serialiser::WRITING, false);
     Send(eRemoteServer_HomeDir, sendData);
@@ -821,7 +821,7 @@ public:
     return ret;
   }
 
-  rdctype::array ListFolder(const char *path)
+  rdcarray ListFolder(const char *path)
   {
     if(Android::IsHostADB(m_hostname.c_str()))
     {
@@ -863,7 +863,7 @@ public:
     Serialiser *ser = NULL;
     Get(type, &ser);
 
-    rdctype::array files;
+    rdcarray files;
 
     if(ser)
     {
@@ -886,8 +886,7 @@ public:
   }
 
   uint32_t ExecuteAndInject(const char *app, const char *workingDir, const char *cmdLine,
-                            const rdctype::array &env,
-                            const CaptureOptions &opts)
+                            const rdcarray &env, const CaptureOptions &opts)
   {
     const char *host = hostname().c_str();
     if(Android::IsHostADB(host))
@@ -902,7 +901,7 @@ public:
     sendData.Serialise("workingDir", workstr);
     sendData.Serialise("cmdLine", cmdstr);
     sendData.Serialise("opts", (CaptureOptions &)opts);
-    sendData.Serialise("env", (rdctype::array &)env);
+    sendData.Serialise("env", (rdcarray &)env);
 
     Send(eRemoteServer_ExecuteAndInject, sendData);
 
@@ -943,7 +942,7 @@ public:
     SAFE_DELETE(fileRecv);
   }
 
-  rdctype::str CopyCaptureToRemote(const char *filename, float *progress)
+  rdcstr CopyCaptureToRemote(const char *filename, float *progress)
   {
     Serialiser sendData("", Serialiser::WRITING, false);
     Send(eRemoteServer_CopyCaptureToRemote, sendData);
@@ -983,10 +982,10 @@ public:
     Send(eRemoteServer_TakeOwnershipCapture, sendData);
   }
 
-  rdctype::pair OpenCapture(uint32_t proxyid,
-                                                               const char *filename, float *progress)
+  rdcpair OpenCapture(uint32_t proxyid, const char *filename,
+                                                         float *progress)
   {
-    rdctype::pair ret;
+    rdcpair ret;
     ret.first = ReplayStatus::InternalError;
     ret.second = NULL;
 
diff --git a/renderdoc/core/target_control.cpp b/renderdoc/core/target_control.cpp
index 3a4cf7262..f09c6085d 100644
--- a/renderdoc/core/target_control.cpp
+++ b/renderdoc/core/target_control.cpp
@@ -126,7 +126,7 @@ void RenderDoc::TargetControlClientThread(Network::Socket *client)
       ser.Serialise("", captures.back().timestamp);
       ser.Serialise("", path);
 
-      rdctype::array buf;
+      bytebuf buf;
 
       ICaptureFile *file = RENDERDOC_OpenCaptureFile(captures.back().path.c_str());
       if(file->OpenStatus() == ReplayStatus::Succeeded)
diff --git a/renderdoc/driver/d3d11/d3d11_analyse.cpp b/renderdoc/driver/d3d11/d3d11_analyse.cpp
index 9e9084191..4fd7df4fb 100644
--- a/renderdoc/driver/d3d11/d3d11_analyse.cpp
+++ b/renderdoc/driver/d3d11/d3d11_analyse.cpp
@@ -1922,7 +1922,7 @@ ShaderDebugTrace D3D11DebugManager::DebugPixel(uint32_t eventID, uint32_t x, uin
 
     State initialState = CreateShaderDebugState(traces[destIdx], destIdx, dxbc, cbufData);
 
-    rdctype::array &ins = traces[destIdx].inputs;
+    rdcarray &ins = traces[destIdx].inputs;
     if(!ins.empty() && ins.back().name == "vCoverage")
       ins.back().value.u.x = hit->coverage;
 
diff --git a/renderdoc/driver/d3d11/d3d11_context.cpp b/renderdoc/driver/d3d11/d3d11_context.cpp
index b51aea90b..808fd2e64 100644
--- a/renderdoc/driver/d3d11/d3d11_context.cpp
+++ b/renderdoc/driver/d3d11/d3d11_context.cpp
@@ -1772,7 +1772,7 @@ void WrappedID3D11DeviceContext::RecordResourceStats(ShaderStage stage, UINT Num
       RDCASSERT(desc.ViewDimension < ARRAY_COUNT(mapping));
       TextureDim type = mapping[desc.ViewDimension];
       // #mivance surprisingly this is not asserted in operator[] for
-      // rdctype::array so I'm being paranoid
+      // rdcarray so I'm being paranoid
       RDCASSERT((int)type < (int)resources.types.size());
       resources.types[(int)type] += 1;
     }
diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp
index 234f84f57..b540e242f 100644
--- a/renderdoc/driver/d3d12/d3d12_replay.cpp
+++ b/renderdoc/driver/d3d12/d3d12_replay.cpp
@@ -553,7 +553,7 @@ void D3D12Replay::FillResourceView(D3D12Pipe::View &view, D3D12Descriptor *desc)
 }
 
 void D3D12Replay::FillRegisterSpaces(const D3D12RenderState::RootSignature &rootSig,
-                                     rdctype::array &dstSpaces,
+                                     rdcarray &dstSpaces,
                                      D3D12_SHADER_VISIBILITY visibility)
 {
   D3D12ResourceManager *rm = m_pDevice->GetResourceManager();
diff --git a/renderdoc/driver/d3d12/d3d12_replay.h b/renderdoc/driver/d3d12/d3d12_replay.h
index 98442aacf..0cc92780a 100644
--- a/renderdoc/driver/d3d12/d3d12_replay.h
+++ b/renderdoc/driver/d3d12/d3d12_replay.h
@@ -179,7 +179,7 @@ public:
 
 private:
   void FillRegisterSpaces(const D3D12RenderState::RootSignature &rootSig,
-                          rdctype::array &spaces,
+                          rdcarray &spaces,
                           D3D12_SHADER_VISIBILITY visibility);
   void FillResourceView(D3D12Pipe::View &view, D3D12Descriptor *desc);
 
diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp
index fea60923c..b659abae0 100644
--- a/renderdoc/driver/gl/gl_replay.cpp
+++ b/renderdoc/driver/gl/gl_replay.cpp
@@ -2038,8 +2038,7 @@ void GLReplay::FillCBufferValue(WrappedOpenGL &gl, GLuint prog, bool bufferBacke
 }
 
 void GLReplay::FillCBufferVariables(WrappedOpenGL &gl, GLuint prog, bool bufferBacked,
-                                    std::string prefix,
-                                    const rdctype::array &variables,
+                                    std::string prefix, const rdcarray &variables,
                                     std::vector &outvars,
                                     const std::vector &data)
 {
diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h
index 1b2d11ddd..9aea292f9 100644
--- a/renderdoc/driver/gl/gl_replay.h
+++ b/renderdoc/driver/gl/gl_replay.h
@@ -239,7 +239,7 @@ private:
                         uint32_t offs, uint32_t matStride, const vector &data,
                         ShaderVariable &outVar);
   void FillCBufferVariables(WrappedOpenGL &gl, GLuint prog, bool bufferBacked, std::string prefix,
-                            const rdctype::array &variables,
+                            const rdcarray &variables,
                             std::vector &outvars, const std::vector &data);
 
   void CreateCustomShaderTex(uint32_t w, uint32_t h);
diff --git a/renderdoc/driver/gl/gl_shader_refl.cpp b/renderdoc/driver/gl/gl_shader_refl.cpp
index 8bb096e75..617009d4c 100644
--- a/renderdoc/driver/gl/gl_shader_refl.cpp
+++ b/renderdoc/driver/gl/gl_shader_refl.cpp
@@ -27,7 +27,7 @@
 #include 
 #include "gl_driver.h"
 
-void sort(rdctype::array &vars)
+void sort(rdcarray &vars)
 {
   if(vars.empty())
     return;
@@ -490,8 +490,8 @@ GLuint MakeSeparableShaderProgram(WrappedOpenGL &gl, GLenum type, vector
 }
 
 void ReconstructVarTree(const GLHookSet &gl, GLenum query, GLuint sepProg, GLuint varIdx,
-                        GLint numParentBlocks, rdctype::array *parentBlocks,
-                        rdctype::array *defaultBlock)
+                        GLint numParentBlocks, rdcarray *parentBlocks,
+                        rdcarray *defaultBlock)
 {
   const size_t numProps = 8;
 
@@ -709,7 +709,7 @@ void ReconstructVarTree(const GLHookSet &gl, GLenum query, GLuint sepProg, GLuin
     gl.glGetProgramResourceiv(sepProg, query, varIdx, 1, &propName, 1, NULL, &topLevelStride);
   }
 
-  rdctype::array *parentmembers = defaultBlock;
+  rdcarray *parentmembers = defaultBlock;
 
   if(values[3] != -1 && values[3] < numParentBlocks)
   {
@@ -847,8 +847,8 @@ void MakeShaderReflection(const GLHookSet &gl, GLenum shadType, GLuint sepProg,
     RDCEraseEl(refl.DispatchThreadsDimension);
   }
 
-  rdctype::array &roresources = refl.ReadOnlyResources;
-  rdctype::array &rwresources = refl.ReadWriteResources;
+  rdcarray &roresources = refl.ReadOnlyResources;
+  rdcarray &rwresources = refl.ReadWriteResources;
 
   GLint numUniforms = 0;
   gl.glGetProgramInterfaceiv(sepProg, eGL_UNIFORM, eGL_ACTIVE_RESOURCES, &numUniforms);
@@ -1369,7 +1369,7 @@ void MakeShaderReflection(const GLHookSet &gl, GLenum shadType, GLuint sepProg,
 
     res.name = name;
 
-    rdctype::array &reslist = (res.IsReadOnly ? roresources : rwresources);
+    rdcarray &reslist = (res.IsReadOnly ? roresources : rwresources);
 
     res.bindPoint = (int32_t)reslist.size();
     reslist.push_back(res);
@@ -1434,7 +1434,7 @@ void MakeShaderReflection(const GLHookSet &gl, GLenum shadType, GLuint sepProg,
   }
 
   {
-    rdctype::array *members = new rdctype::array[ssbos.size()];
+    rdcarray *members = new rdcarray[ssbos.size()];
 
     for(uint32_t i = 0; i < ssboMembers; i++)
     {
@@ -1498,16 +1498,16 @@ void MakeShaderReflection(const GLHookSet &gl, GLenum shadType, GLuint sepProg,
     delete[] members;
   }
 
-  rdctype::array globalUniforms;
+  rdcarray globalUniforms;
 
   GLint numUBOs = 0;
   vector uboNames;
-  rdctype::array *ubos = NULL;
+  rdcarray *ubos = NULL;
 
   {
     gl.glGetProgramInterfaceiv(sepProg, eGL_UNIFORM_BLOCK, eGL_ACTIVE_RESOURCES, &numUBOs);
 
-    ubos = new rdctype::array[numUBOs];
+    ubos = new rdcarray[numUBOs];
     uboNames.resize(numUBOs);
 
     for(GLint u = 0; u < numUBOs; u++)
@@ -1571,7 +1571,7 @@ void MakeShaderReflection(const GLHookSet &gl, GLenum shadType, GLuint sepProg,
   for(int sigType = 0; sigType < 2; sigType++)
   {
     GLenum sigEnum = (sigType == 0 ? eGL_PROGRAM_INPUT : eGL_PROGRAM_OUTPUT);
-    rdctype::array *sigArray = (sigType == 0 ? &refl.InputSig : &refl.OutputSig);
+    rdcarray *sigArray = (sigType == 0 ? &refl.InputSig : &refl.OutputSig);
 
     GLint numInputs;
     gl.glGetProgramInterfaceiv(sepProg, sigEnum, eGL_ACTIVE_RESOURCES, &numInputs);
diff --git a/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp b/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp
index 00a4db115..3592459d8 100644
--- a/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp
+++ b/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp
@@ -108,8 +108,7 @@ static ShaderConstant MakeConstantBufferVariable(const DXBC::CBufferVariable &va
 }
 
 static void MakeResourceList(bool srv, DXBC::DXBCFile *dxbc, const vector &in,
-                             rdctype::array &mapping,
-                             rdctype::array &refl)
+                             rdcarray &mapping, rdcarray &refl)
 {
   for(size_t i = 0; i < in.size(); i++)
   {
diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp
index 4a07e5130..abf8f602b 100644
--- a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp
+++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp
@@ -3444,7 +3444,7 @@ string SPVModule::Disassemble(const string &entryPoint)
   return retDisasm;
 }
 
-void MakeConstantBlockVariables(SPVTypeData *structType, rdctype::array &cblock);
+void MakeConstantBlockVariables(SPVTypeData *structType, rdcarray &cblock);
 
 void MakeConstantBlockVariable(ShaderConstant &outConst, SPVTypeData *type, const std::string &name,
                                const std::vector &decorations)
@@ -3569,7 +3569,7 @@ void MakeConstantBlockVariable(ShaderConstant &outConst, SPVTypeData *type, cons
   }
 }
 
-void MakeConstantBlockVariables(SPVTypeData *structType, rdctype::array &cblock)
+void MakeConstantBlockVariables(SPVTypeData *structType, rdcarray &cblock)
 {
   if(structType->children.empty())
     return;
@@ -3580,7 +3580,7 @@ void MakeConstantBlockVariables(SPVTypeData *structType, rdctype::arraychildren[i].second, structType->childDecorations[i]);
 }
 
-uint32_t CalculateMinimumByteSize(const rdctype::array &variables)
+uint32_t CalculateMinimumByteSize(const rdcarray &variables)
 {
   if(variables.empty())
   {
diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp
index 23780d8a1..7e86b671a 100644
--- a/renderdoc/driver/vulkan/vk_core.cpp
+++ b/renderdoc/driver/vulkan/vk_core.cpp
@@ -2908,8 +2908,8 @@ void WrappedVulkan::AddUsage(VulkanDrawcallTreeNode &drawNode, vector &a, ResourceUsage u) : bindmap(a), usage(u) {}
-      rdctype::array &bindmap;
+      ResUsageType(rdcarray &a, ResourceUsage u) : bindmap(a), usage(u) {}
+      rdcarray &bindmap;
       ResourceUsage usage;
     };
 
diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp
index 7c665f559..fce201ba0 100644
--- a/renderdoc/driver/vulkan/vk_replay.cpp
+++ b/renderdoc/driver/vulkan/vk_replay.cpp
@@ -3210,7 +3210,7 @@ void VulkanReplay::SavePipelineState()
     m_VulkanPipelineState.compute.DescSets.resize(state.compute.descSets.size());
 
     {
-      rdctype::array *dsts[] = {
+      rdcarray *dsts[] = {
           &m_VulkanPipelineState.graphics.DescSets, &m_VulkanPipelineState.compute.DescSets,
       };
 
@@ -3460,7 +3460,7 @@ void VulkanReplay::SavePipelineState()
   }
 }
 
-void VulkanReplay::FillCBufferVariables(rdctype::array invars,
+void VulkanReplay::FillCBufferVariables(rdcarray invars,
                                         vector &outvars, const vector &data,
                                         size_t baseOffset)
 {
diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h
index 0cc129f70..2414d79a8 100644
--- a/renderdoc/driver/vulkan/vk_replay.h
+++ b/renderdoc/driver/vulkan/vk_replay.h
@@ -350,7 +350,7 @@ private:
   void CreateTexImageView(VkImageAspectFlags aspectFlags, VkImage liveIm,
                           VulkanCreationInfo::Image &iminfo);
 
-  void FillCBufferVariables(rdctype::array, vector &outvars,
+  void FillCBufferVariables(rdcarray, vector &outvars,
                             const vector &data, size_t baseOffset);
 
   VulkanDebugManager *GetDebugManager();
diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h
index 11143e603..035fb08d1 100644
--- a/renderdoc/os/os_specific.h
+++ b/renderdoc/os/os_specific.h
@@ -60,7 +60,7 @@ bool StartGlobalHook(const char *pathmatch, const char *logfile, const CaptureOp
 bool IsGlobalHookActive();
 void StopGlobalHook();
 
-uint32_t InjectIntoProcess(uint32_t pid, const rdctype::array &env,
+uint32_t InjectIntoProcess(uint32_t pid, const rdcarray &env,
                            const char *logfile, const CaptureOptions &opts, bool waitForExit);
 struct ProcessResult
 {
@@ -72,9 +72,8 @@ uint32_t LaunchProcess(const char *app, const char *workingDir, const char *cmdL
 uint32_t LaunchScript(const char *script, const char *workingDir, const char *args,
                       ProcessResult *result = NULL);
 uint32_t LaunchAndInjectIntoProcess(const char *app, const char *workingDir, const char *cmdLine,
-                                    const rdctype::array &env,
-                                    const char *logfile, const CaptureOptions &opts,
-                                    bool waitForExit);
+                                    const rdcarray &env, const char *logfile,
+                                    const CaptureOptions &opts, bool waitForExit);
 void *LoadModule(const char *module);
 void *GetFunctionAddress(void *module, const char *function);
 uint32_t GetCurrentPID();
diff --git a/renderdoc/os/posix/posix_process.cpp b/renderdoc/os/posix/posix_process.cpp
index e668bd16c..a71e3f8c2 100644
--- a/renderdoc/os/posix/posix_process.cpp
+++ b/renderdoc/os/posix/posix_process.cpp
@@ -404,7 +404,7 @@ static pid_t RunProcess(const char *app, const char *workingDir, const char *cmd
   return childPid;
 }
 
-uint32_t Process::InjectIntoProcess(uint32_t pid, const rdctype::array &env,
+uint32_t Process::InjectIntoProcess(uint32_t pid, const rdcarray &env,
                                     const char *logfile, const CaptureOptions &opts, bool waitForExit)
 {
   RDCUNIMPLEMENTED("Injecting into already running processes on linux");
@@ -474,7 +474,7 @@ uint32_t Process::LaunchScript(const char *script, const char *workingDir, const
 
 uint32_t Process::LaunchAndInjectIntoProcess(const char *app, const char *workingDir,
                                              const char *cmdLine,
-                                             const rdctype::array &envList,
+                                             const rdcarray &envList,
                                              const char *logfile, const CaptureOptions &opts,
                                              bool waitForExit)
 {
diff --git a/renderdoc/os/win32/sys_win32_hooks.cpp b/renderdoc/os/win32/sys_win32_hooks.cpp
index 2641ba515..c72589f4f 100644
--- a/renderdoc/os/win32/sys_win32_hooks.cpp
+++ b/renderdoc/os/win32/sys_win32_hooks.cpp
@@ -314,7 +314,7 @@ private:
 
       if(inject)
       {
-        rdctype::array env;
+        rdcarray env;
 
         // inherit logfile and capture options
         uint32_t ident = RENDERDOC_InjectIntoProcess(lpProcessInformation->dwProcessId, env,
@@ -400,7 +400,7 @@ private:
 
       if(inject)
       {
-        rdctype::array env;
+        rdcarray env;
 
         // inherit logfile and capture options
         uint32_t ident = RENDERDOC_InjectIntoProcess(lpProcessInformation->dwProcessId, env,
diff --git a/renderdoc/os/win32/win32_process.cpp b/renderdoc/os/win32/win32_process.cpp
index 51d10c054..60d1f96a5 100644
--- a/renderdoc/os/win32/win32_process.cpp
+++ b/renderdoc/os/win32/win32_process.cpp
@@ -498,7 +498,7 @@ static PROCESS_INFORMATION RunProcess(const char *app, const char *workingDir, c
   return pi;
 }
 
-uint32_t Process::InjectIntoProcess(uint32_t pid, const rdctype::array &env,
+uint32_t Process::InjectIntoProcess(uint32_t pid, const rdcarray &env,
                                     const char *logfile, const CaptureOptions &opts, bool waitForExit)
 {
   wstring wlogfile = logfile == NULL ? L"" : StringFormat::UTF82Wide(logfile);
@@ -991,7 +991,7 @@ uint32_t Process::LaunchScript(const char *script, const char *workingDir, const
 
 uint32_t Process::LaunchAndInjectIntoProcess(const char *app, const char *workingDir,
                                              const char *cmdLine,
-                                             const rdctype::array &env,
+                                             const rdcarray &env,
                                              const char *logfile, const CaptureOptions &opts,
                                              bool waitForExit)
 {
diff --git a/renderdoc/renderdoc.natvis b/renderdoc/renderdoc.natvis
index 60f341a6a..f154204c6 100644
--- a/renderdoc/renderdoc.natvis
+++ b/renderdoc/renderdoc.natvis
@@ -1,6 +1,6 @@
  
 
-  
+  
     ""
     {elems,s}
     
@@ -12,7 +12,7 @@
       
     
   
-  
+  
     {{ size={usedCount} }}
     
       usedCount
@@ -23,7 +23,7 @@
       
     
   
- 
+ 
   {{ {first}, {second} }}
   
    first
diff --git a/renderdoc/replay/basic_types_tests.cpp b/renderdoc/replay/basic_types_tests.cpp
index ed19bcb0e..490e99727 100644
--- a/renderdoc/replay/basic_types_tests.cpp
+++ b/renderdoc/replay/basic_types_tests.cpp
@@ -61,7 +61,7 @@ TEST_CASE("Test array type", "[basictypes]")
 {
   SECTION("Basic test")
   {
-    rdctype::array test;
+    rdcarray test;
 
     CHECK(test.size() == 0);
     CHECK(test.capacity() == 0);
@@ -145,7 +145,7 @@ TEST_CASE("Test array type", "[basictypes]")
 
   SECTION("Test constructing/assigning from other types")
   {
-    rdctype::array test;
+    rdcarray test;
 
     SECTION("std::vector")
     {
@@ -159,7 +159,7 @@ TEST_CASE("Test array type", "[basictypes]")
       CHECK(test[2] == 4);
       CHECK(test[3] == 5);
 
-      rdctype::array cc(vec);
+      rdcarray cc(vec);
 
       REQUIRE(cc.size() == 4);
       CHECK(cc[0] == 2);
@@ -167,7 +167,7 @@ TEST_CASE("Test array type", "[basictypes]")
       CHECK(cc[2] == 4);
       CHECK(cc[3] == 5);
 
-      rdctype::array ass;
+      rdcarray ass;
 
       ass.assign(vec);
 
@@ -188,7 +188,7 @@ TEST_CASE("Test array type", "[basictypes]")
       CHECK(test[2] == 4);
       CHECK(test[3] == 5);
 
-      rdctype::array cc({2, 3, 4, 5});
+      rdcarray cc({2, 3, 4, 5});
 
       REQUIRE(cc.size() == 4);
       CHECK(cc[0] == 2);
@@ -196,7 +196,7 @@ TEST_CASE("Test array type", "[basictypes]")
       CHECK(cc[2] == 4);
       CHECK(cc[3] == 5);
 
-      rdctype::array ass;
+      rdcarray ass;
 
       ass.assign({2, 3, 4, 5});
 
@@ -209,7 +209,7 @@ TEST_CASE("Test array type", "[basictypes]")
 
     SECTION("other array")
     {
-      rdctype::array vec = {2, 3, 4, 5};
+      rdcarray vec = {2, 3, 4, 5};
 
       test = vec;
 
@@ -219,7 +219,7 @@ TEST_CASE("Test array type", "[basictypes]")
       CHECK(test[2] == 4);
       CHECK(test[3] == 5);
 
-      rdctype::array cc(vec);
+      rdcarray cc(vec);
 
       REQUIRE(cc.size() == 4);
       CHECK(cc[0] == 2);
@@ -227,7 +227,7 @@ TEST_CASE("Test array type", "[basictypes]")
       CHECK(cc[2] == 4);
       CHECK(cc[3] == 5);
 
-      rdctype::array ass;
+      rdcarray ass;
 
       ass.assign(vec);
 
@@ -241,7 +241,7 @@ TEST_CASE("Test array type", "[basictypes]")
 
   SECTION("Verify insert()")
   {
-    rdctype::array vec = {6, 3, 13, 5};
+    rdcarray vec = {6, 3, 13, 5};
 
     vec.insert(0, 9);
 
@@ -321,7 +321,7 @@ TEST_CASE("Test array type", "[basictypes]")
 
   SECTION("Verify erase()")
   {
-    rdctype::array vec = {6, 3, 13, 5};
+    rdcarray vec = {6, 3, 13, 5};
 
     vec.erase(2);
 
@@ -378,7 +378,7 @@ TEST_CASE("Test array type", "[basictypes]")
 
   SECTION("Check construction")
   {
-    rdctype::array test;
+    rdcarray test;
 
     CHECK(constructor == 0);
     CHECK(valueConstructor == 0);
@@ -462,7 +462,7 @@ TEST_CASE("Test array type", "[basictypes]")
 
 TEST_CASE("Test string type", "[basictypes][string]")
 {
-  rdctype::str test;
+  rdcstr test;
 
   // should not have any data in it
   CHECK(test.size() == 0);
@@ -486,7 +486,7 @@ TEST_CASE("Test string type", "[basictypes][string]")
   CHECK(test.c_str() != NULL);
   CHECK(test == "Test string type");
   CHECK(test == std::string("Test string type"));
-  CHECK(test == rdctype::str("Test string type"));
+  CHECK(test == rdcstr("Test string type"));
   CHECK_NULL_TERM(test);
 
   test[4] = '!';
@@ -501,7 +501,7 @@ TEST_CASE("Test string type", "[basictypes][string]")
   CHECK(test.c_str() != NULL);
   CHECK(test == "Test!string type");
   CHECK(test == std::string("Test!string type"));
-  CHECK(test == rdctype::str("Test!string type"));
+  CHECK(test == rdcstr("Test!string type"));
   CHECK_NULL_TERM(test);
 
   test.clear();
diff --git a/renderdoc/replay/capture_file.cpp b/renderdoc/replay/capture_file.cpp
index 5fc6e6061..8ad00f9a8 100644
--- a/renderdoc/replay/capture_file.cpp
+++ b/renderdoc/replay/capture_file.cpp
@@ -50,9 +50,9 @@ public:
   ReplaySupport LocalReplaySupport() { return m_Support; }
   const char *DriverName() { return m_DriverName.c_str(); }
   const char *RecordedMachineIdent() { return m_Ident.c_str(); }
-  rdctype::pair OpenCapture(float *progress);
+  rdcpair OpenCapture(float *progress);
 
-  rdctype::array GetThumbnail(FileType type, uint32_t maxsize);
+  bytebuf GetThumbnail(FileType type, uint32_t maxsize);
 
 private:
   std::string m_Filename, m_DriverName, m_Ident;
@@ -92,10 +92,10 @@ CaptureFile::CaptureFile(const char *f)
   }
 }
 
-rdctype::pair CaptureFile::OpenCapture(float *progress)
+rdcpair CaptureFile::OpenCapture(float *progress)
 {
   if(m_Status != ReplayStatus::Succeeded)
-    return rdctype::make_pair(m_Status, NULL);
+    return make_rdcpair(m_Status, NULL);
 
   ReplayController *render = new ReplayController();
   ReplayStatus ret;
@@ -109,12 +109,12 @@ rdctype::pair CaptureFile::OpenCapture(float
   if(ret != ReplayStatus::Succeeded)
     SAFE_DELETE(render);
 
-  return rdctype::make_pair(ret, render);
+  return make_rdcpair(ret, render);
 }
 
-rdctype::array CaptureFile::GetThumbnail(FileType type, uint32_t maxsize)
+bytebuf CaptureFile::GetThumbnail(FileType type, uint32_t maxsize)
 {
-  rdctype::array buf;
+  bytebuf buf;
 
   Serialiser ser(Filename(), Serialiser::READING, false);
 
diff --git a/renderdoc/replay/entry_points.cpp b/renderdoc/replay/entry_points.cpp
index 5bb7105d8..7002041f6 100644
--- a/renderdoc/replay/entry_points.cpp
+++ b/renderdoc/replay/entry_points.cpp
@@ -228,12 +228,12 @@ extern "C" RENDERDOC_API const char *RENDERDOC_CC RENDERDOC_GetLogFile()
   return RDCGETLOGFILE();
 }
 
-extern "C" RENDERDOC_API void RENDERDOC_CC
-RENDERDOC_InitGlobalEnv(GlobalEnvironment env, const rdctype::array &args)
+extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_InitGlobalEnv(GlobalEnvironment env,
+                                                                   const rdcarray &args)
 {
   std::vector argsVec;
   argsVec.reserve(args.size());
-  for(const rdctype::str &a : args)
+  for(const rdcstr &a : args)
     argsVec.push_back(a.c_str());
 
   RenderDoc::Inst().ProcessGlobalEnvironment(env, argsVec);
@@ -265,8 +265,8 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_TriggerExceptionHandler(voi
   }
 }
 
-extern "C" RENDERDOC_API ReplaySupport RENDERDOC_CC RENDERDOC_SupportLocalReplay(
-    const char *logfile, rdctype::str *driver, rdctype::str *recordMachineIdent)
+extern "C" RENDERDOC_API ReplaySupport RENDERDOC_CC
+RENDERDOC_SupportLocalReplay(const char *logfile, rdcstr *driver, rdcstr *recordMachineIdent)
 {
   ICaptureFile *file = RENDERDOC_OpenCaptureFile(logfile);
 
@@ -305,7 +305,7 @@ RENDERDOC_CreateReplayRenderer(const char *logfile, float *progress, IReplayCont
 
 extern "C" RENDERDOC_API uint32_t RENDERDOC_CC
 RENDERDOC_ExecuteAndInject(const char *app, const char *workingDir, const char *cmdLine,
-                           const rdctype::array &env, const char *logfile,
+                           const rdcarray &env, const char *logfile,
                            const CaptureOptions &opts, bool waitForExit)
 {
   return Process::LaunchAndInjectIntoProcess(app, workingDir, cmdLine, env, logfile, opts,
@@ -340,15 +340,14 @@ extern "C" RENDERDOC_API bool RENDERDOC_CC RENDERDOC_CanGlobalHook()
 }
 
 extern "C" RENDERDOC_API uint32_t RENDERDOC_CC
-RENDERDOC_InjectIntoProcess(uint32_t pid, const rdctype::array &env,
+RENDERDOC_InjectIntoProcess(uint32_t pid, const rdcarray &env,
                             const char *logfile, const CaptureOptions &opts, bool waitForExit)
 {
   return Process::InjectIntoProcess(pid, env, logfile, opts, waitForExit != 0);
 }
 
-extern "C" RENDERDOC_API bool RENDERDOC_CC RENDERDOC_GetThumbnail(const char *filename,
-                                                                  FileType type, uint32_t maxsize,
-                                                                  rdctype::array *buf)
+extern "C" RENDERDOC_API bool RENDERDOC_CC RENDERDOC_GetThumbnail(const char *filename, FileType type,
+                                                                  uint32_t maxsize, bytebuf *buf)
 {
   ICaptureFile *file = RENDERDOC_OpenCaptureFile(filename);
 
@@ -489,8 +488,7 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EndSelfHostCapture(const ch
 }
 
 extern "C" RENDERDOC_API bool RENDERDOC_CC RENDERDOC_NeedVulkanLayerRegistration(
-    VulkanLayerFlags *flagsPtr, rdctype::array *myJSONsPtr,
-    rdctype::array *otherJSONsPtr)
+    VulkanLayerFlags *flagsPtr, rdcarray *myJSONsPtr, rdcarray *otherJSONsPtr)
 {
   VulkanLayerFlags flags = VulkanLayerFlags::NoFlags;
   std::vector myJSONs;
@@ -612,7 +610,7 @@ static std::string ResourceFormatName(const ResourceFormat &fmt)
 }
 
 extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_ResourceFormatName(const ResourceFormat &fmt,
-                                                                        rdctype::str &name)
+                                                                        rdcstr &name)
 {
   name = ResourceFormatName(fmt);
 }
\ No newline at end of file
diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp
index d5fc0365c..65a360e09 100644
--- a/renderdoc/replay/replay_controller.cpp
+++ b/renderdoc/replay/replay_controller.cpp
@@ -233,9 +233,9 @@ const VKPipe::State &ReplayController::GetVulkanPipelineState()
   return *m_VulkanPipelineState;
 }
 
-rdctype::array ReplayController::GetDisassemblyTargets()
+rdcarray ReplayController::GetDisassemblyTargets()
 {
-  rdctype::array ret;
+  rdcarray ret;
 
   vector targets = m_pDevice->GetDisassemblyTargets();
 
@@ -246,8 +246,8 @@ rdctype::array ReplayController::GetDisassemblyTargets()
   return ret;
 }
 
-rdctype::str ReplayController::DisassembleShader(ResourceId pipeline, const ShaderReflection *refl,
-                                                 const char *target)
+rdcstr ReplayController::DisassembleShader(ResourceId pipeline, const ShaderReflection *refl,
+                                           const char *target)
 {
   return m_pDevice->DisassembleShader(pipeline, refl, target);
 }
@@ -265,19 +265,19 @@ DrawcallDescription *ReplayController::GetDrawcallByEID(uint32_t eventID)
   return m_Drawcalls[eventID];
 }
 
-rdctype::array ReplayController::GetDrawcalls()
+rdcarray ReplayController::GetDrawcalls()
 {
   return m_FrameRecord.drawcallList;
 }
 
-rdctype::array ReplayController::FetchCounters(const rdctype::array &counters)
+rdcarray ReplayController::FetchCounters(const rdcarray &counters)
 {
   std::vector counterArray(counters.begin(), counters.end());
 
   return m_pDevice->FetchCounters(counterArray);
 }
 
-rdctype::array ReplayController::EnumerateCounters()
+rdcarray ReplayController::EnumerateCounters()
 {
   return m_pDevice->EnumerateCounters();
 }
@@ -291,7 +291,7 @@ CounterDescription ReplayController::DescribeCounter(GPUCounter counterID)
   return ret;
 }
 
-rdctype::array ReplayController::GetBuffers()
+rdcarray ReplayController::GetBuffers()
 {
   if(m_Buffers.empty())
   {
@@ -306,7 +306,7 @@ rdctype::array ReplayController::GetBuffers()
   return m_Buffers;
 }
 
-rdctype::array ReplayController::GetTextures()
+rdcarray ReplayController::GetTextures()
 {
   if(m_Textures.empty())
   {
@@ -321,9 +321,9 @@ rdctype::array ReplayController::GetTextures()
   return m_Textures;
 }
 
-rdctype::array ReplayController::GetResolve(const rdctype::array &callstack)
+rdcarray ReplayController::GetResolve(const rdcarray &callstack)
 {
-  rdctype::array ret;
+  rdcarray ret;
 
   if(callstack.empty())
     return ret;
@@ -346,12 +346,12 @@ rdctype::array ReplayController::GetResolve(const rdctype::array ReplayController::GetDebugMessages()
+rdcarray ReplayController::GetDebugMessages()
 {
   return m_pDevice->GetDebugMessages();
 }
 
-rdctype::array ReplayController::GetUsage(ResourceId id)
+rdcarray ReplayController::GetUsage(ResourceId id)
 {
   return m_pDevice->GetUsage(m_pDevice->GetLiveID(id));
 }
@@ -371,17 +371,17 @@ MeshFormat ReplayController::GetPostVSData(uint32_t instID, MeshDataStage stage)
   return m_pDevice->GetPostVSBuffers(draw->eventID, instID, stage);
 }
 
-rdctype::array ReplayController::GetBufferData(ResourceId buff, uint64_t offset, uint64_t len)
+bytebuf ReplayController::GetBufferData(ResourceId buff, uint64_t offset, uint64_t len)
 {
   if(buff == ResourceId())
-    return rdctype::array();
+    return bytebuf();
 
   ResourceId liveId = m_pDevice->GetLiveID(buff);
 
   if(liveId == ResourceId())
   {
     RDCERR("Couldn't get Live ID for %llu getting buffer data", buff);
-    return rdctype::array();
+    return bytebuf();
   }
 
   vector retData;
@@ -390,9 +390,9 @@ rdctype::array ReplayController::GetBufferData(ResourceId buff, uint64_t o
   return retData;
 }
 
-rdctype::array ReplayController::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip)
+bytebuf ReplayController::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip)
 {
-  rdctype::array ret;
+  bytebuf ret;
 
   ResourceId liveId = m_pDevice->GetLiveID(tex);
 
@@ -1229,12 +1229,11 @@ bool ReplayController::SaveTexture(const TextureSave &saveData, const char *path
   return success;
 }
 
-rdctype::array ReplayController::PixelHistory(ResourceId target, uint32_t x,
-                                                                 uint32_t y, uint32_t slice,
-                                                                 uint32_t mip, uint32_t sampleIdx,
-                                                                 CompType typeHint)
+rdcarray ReplayController::PixelHistory(ResourceId target, uint32_t x,
+                                                           uint32_t y, uint32_t slice, uint32_t mip,
+                                                           uint32_t sampleIdx, CompType typeHint)
 {
-  rdctype::array ret;
+  rdcarray ret;
 
   for(size_t t = 0; t < m_Textures.size(); t++)
   {
@@ -1370,7 +1369,7 @@ void ReplayController::FreeTrace(ShaderDebugTrace *trace)
   delete trace;
 }
 
-rdctype::array ReplayController::GetCBufferVariableContents(
+rdcarray ReplayController::GetCBufferVariableContents(
     ResourceId shader, const char *entryPoint, uint32_t cbufslot, ResourceId buffer, uint64_t offs)
 {
   vector data;
@@ -1384,7 +1383,7 @@ rdctype::array ReplayController::GetCBufferVariableContents(
   return v;
 }
 
-rdctype::array ReplayController::GetSupportedWindowSystems()
+rdcarray ReplayController::GetSupportedWindowSystems()
 {
   return m_pDevice->GetSupportedWindowSystems();
 }
@@ -1466,7 +1465,7 @@ void ReplayController::Shutdown()
   delete this;
 }
 
-rdctype::pair ReplayController::BuildTargetShader(
+rdcpair ReplayController::BuildTargetShader(
     const char *entry, const char *source, const ShaderCompileFlags &compileFlags, ShaderStage type)
 {
   ResourceId id;
@@ -1480,9 +1479,7 @@ rdctype::pair ReplayController::BuildTargetShader(
     case ShaderStage::Geometry:
     case ShaderStage::Pixel:
     case ShaderStage::Compute: break;
-    default:
-      RDCERR("Unexpected type in BuildShader!");
-      return rdctype::pair();
+    default: RDCERR("Unexpected type in BuildShader!"); return rdcpair();
   }
 
   m_pDevice->BuildTargetShader(source, entry, compileFlags, type, &id, &errs);
@@ -1490,10 +1487,10 @@ rdctype::pair ReplayController::BuildTargetShader(
   if(id != ResourceId())
     m_TargetResources.insert(id);
 
-  return rdctype::make_pair(id, errs);
+  return make_rdcpair(id, errs);
 }
 
-rdctype::pair ReplayController::BuildCustomShader(
+rdcpair ReplayController::BuildCustomShader(
     const char *entry, const char *source, const ShaderCompileFlags &compileFlags, ShaderStage type)
 {
   ResourceId id;
@@ -1507,9 +1504,7 @@ rdctype::pair ReplayController::BuildCustomShader(
     case ShaderStage::Geometry:
     case ShaderStage::Pixel:
     case ShaderStage::Compute: break;
-    default:
-      RDCERR("Unexpected type in BuildShader!");
-      return rdctype::pair();
+    default: RDCERR("Unexpected type in BuildShader!"); return rdcpair();
   }
 
   m_pDevice->BuildCustomShader(source, entry, compileFlags, type, &id, &errs);
@@ -1517,7 +1512,7 @@ rdctype::pair ReplayController::BuildCustomShader(
   if(id != ResourceId())
     m_CustomShaders.insert(id);
 
-  return rdctype::make_pair(id, errs);
+  return make_rdcpair(id, errs);
 }
 
 void ReplayController::FreeTargetResource(ResourceId id)
diff --git a/renderdoc/replay/replay_controller.h b/renderdoc/replay/replay_controller.h
index a7ba44619..0f1128491 100644
--- a/renderdoc/replay/replay_controller.h
+++ b/renderdoc/replay/replay_controller.h
@@ -50,14 +50,14 @@ public:
   void SetPixelContextLocation(uint32_t x, uint32_t y);
   void DisablePixelContext();
 
-  rdctype::pair GetMinMax();
-  rdctype::array GetHistogram(float minval, float maxval, bool channels[4]);
+  rdcpair GetMinMax();
+  rdcarray GetHistogram(float minval, float maxval, bool channels[4]);
 
   ResourceId GetCustomShaderTexID() { return m_CustomShaderResourceId; }
   ResourceId GetDebugOverlayTexID() { return m_OverlayResourceId; }
   PixelValue PickPixel(ResourceId texID, bool customShader, uint32_t x, uint32_t y,
                        uint32_t sliceFace, uint32_t mip, uint32_t sample);
-  rdctype::pair PickVertex(uint32_t eventID, uint32_t x, uint32_t y);
+  rdcpair PickVertex(uint32_t eventID, uint32_t x, uint32_t y);
 
 private:
   ReplayOutput(ReplayController *parent, WindowingSystem system, void *data, ReplayOutputType type);
@@ -143,35 +143,33 @@ public:
   const GLPipe::State &GetGLPipelineState();
   const VKPipe::State &GetVulkanPipelineState();
 
-  rdctype::array GetDisassemblyTargets();
-  rdctype::str DisassembleShader(ResourceId pipeline, const ShaderReflection *refl,
-                                 const char *target);
+  rdcarray GetDisassemblyTargets();
+  rdcstr DisassembleShader(ResourceId pipeline, const ShaderReflection *refl, const char *target);
 
-  rdctype::pair BuildCustomShader(const char *entry, const char *source,
-                                                            const ShaderCompileFlags &compileFlags,
-                                                            ShaderStage type);
+  rdcpair BuildCustomShader(const char *entry, const char *source,
+                                                const ShaderCompileFlags &compileFlags,
+                                                ShaderStage type);
   void FreeCustomShader(ResourceId id);
 
-  rdctype::pair BuildTargetShader(const char *entry, const char *source,
-                                                            const ShaderCompileFlags &compileFlags,
-                                                            ShaderStage type);
+  rdcpair BuildTargetShader(const char *entry, const char *source,
+                                                const ShaderCompileFlags &compileFlags,
+                                                ShaderStage type);
   void ReplaceResource(ResourceId from, ResourceId to);
   void RemoveReplacement(ResourceId id);
   void FreeTargetResource(ResourceId id);
 
   FrameDescription GetFrameInfo();
-  rdctype::array GetDrawcalls();
-  rdctype::array FetchCounters(const rdctype::array &counters);
-  rdctype::array EnumerateCounters();
+  rdcarray GetDrawcalls();
+  rdcarray FetchCounters(const rdcarray &counters);
+  rdcarray EnumerateCounters();
   CounterDescription DescribeCounter(GPUCounter counterID);
-  rdctype::array GetTextures();
-  rdctype::array GetBuffers();
-  rdctype::array GetResolve(const rdctype::array &callstack);
-  rdctype::array GetDebugMessages();
+  rdcarray GetTextures();
+  rdcarray GetBuffers();
+  rdcarray GetResolve(const rdcarray &callstack);
+  rdcarray GetDebugMessages();
 
-  rdctype::array PixelHistory(ResourceId target, uint32_t x, uint32_t y,
-                                                 uint32_t slice, uint32_t mip, uint32_t sampleIdx,
-                                                 CompType typeHint);
+  rdcarray PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t slice,
+                                           uint32_t mip, uint32_t sampleIdx, CompType typeHint);
   ShaderDebugTrace *DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset,
                                 uint32_t vertOffset);
   ShaderDebugTrace *DebugPixel(uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive);
@@ -180,18 +178,18 @@ public:
 
   MeshFormat GetPostVSData(uint32_t instID, MeshDataStage stage);
 
-  rdctype::array GetUsage(ResourceId id);
+  rdcarray GetUsage(ResourceId id);
 
-  rdctype::array GetBufferData(ResourceId buff, uint64_t offset, uint64_t len);
-  rdctype::array GetTextureData(ResourceId buff, uint32_t arrayIdx, uint32_t mip);
+  bytebuf GetBufferData(ResourceId buff, uint64_t offset, uint64_t len);
+  bytebuf GetTextureData(ResourceId buff, uint32_t arrayIdx, uint32_t mip);
 
   bool SaveTexture(const TextureSave &saveData, const char *path);
 
-  rdctype::array GetCBufferVariableContents(ResourceId shader, const char *entryPoint,
-                                                            uint32_t cbufslot, ResourceId buffer,
-                                                            uint64_t offs);
+  rdcarray GetCBufferVariableContents(ResourceId shader, const char *entryPoint,
+                                                      uint32_t cbufslot, ResourceId buffer,
+                                                      uint64_t offs);
 
-  rdctype::array GetSupportedWindowSystems();
+  rdcarray GetSupportedWindowSystems();
 
   void ReplayLoop(WindowingSystem system, void *data, ResourceId texid);
   void CancelReplayLoop();
diff --git a/renderdoc/replay/replay_driver.cpp b/renderdoc/replay/replay_driver.cpp
index 1c5cee479..233ba6fbc 100644
--- a/renderdoc/replay/replay_driver.cpp
+++ b/renderdoc/replay/replay_driver.cpp
@@ -26,7 +26,7 @@
 #include "maths/formatpacking.h"
 
 DrawcallDescription *SetupDrawcallPointers(vector *drawcallTable,
-                                           rdctype::array &draws,
+                                           rdcarray &draws,
                                            DrawcallDescription *parent,
                                            DrawcallDescription *&previous)
 {
diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h
index 9fba146b9..afe04939e 100644
--- a/renderdoc/replay/replay_driver.h
+++ b/renderdoc/replay/replay_driver.h
@@ -33,7 +33,7 @@ struct FrameRecord
 {
   FrameDescription frameInfo;
 
-  rdctype::array drawcallList;
+  rdcarray drawcallList;
 };
 
 enum RemapTextureEnum
@@ -212,7 +212,7 @@ public:
 
 // utility functions useful in any driver implementation
 DrawcallDescription *SetupDrawcallPointers(std::vector *drawcallTable,
-                                           rdctype::array &draws,
+                                           rdcarray &draws,
                                            DrawcallDescription *parent,
                                            DrawcallDescription *&previous);
 
diff --git a/renderdoc/replay/replay_output.cpp b/renderdoc/replay/replay_output.cpp
index 89dc4476a..aab922e21 100644
--- a/renderdoc/replay/replay_output.cpp
+++ b/renderdoc/replay/replay_output.cpp
@@ -281,7 +281,7 @@ bool ReplayOutput::AddThumbnail(WindowingSystem system, void *data, ResourceId t
   return true;
 }
 
-rdctype::pair ReplayOutput::GetMinMax()
+rdcpair ReplayOutput::GetMinMax()
 {
   PixelValue minval;
   PixelValue maxval;
@@ -303,10 +303,10 @@ rdctype::pair ReplayOutput::GetMinMax()
 
   m_pDevice->GetMinMax(tex, slice, mip, sample, typeHint, &minval.value_f[0], &maxval.value_f[0]);
 
-  return rdctype::make_pair(minval, maxval);
+  return make_rdcpair(minval, maxval);
 }
 
-rdctype::array ReplayOutput::GetHistogram(float minval, float maxval, bool channels[4])
+rdcarray ReplayOutput::GetHistogram(float minval, float maxval, bool channels[4])
 {
   vector hist;
 
@@ -399,11 +399,11 @@ PixelValue ReplayOutput::PickPixel(ResourceId tex, bool customShader, uint32_t x
   return ret;
 }
 
-rdctype::pair ReplayOutput::PickVertex(uint32_t eventID, uint32_t x, uint32_t y)
+rdcpair ReplayOutput::PickVertex(uint32_t eventID, uint32_t x, uint32_t y)
 {
   DrawcallDescription *draw = m_pRenderer->GetDrawcallByEID(eventID);
 
-  const rdctype::pair errorReturn = rdctype::make_pair(~0U, ~0U);
+  const rdcpair errorReturn = make_rdcpair(~0U, ~0U);
 
   if(!draw)
     return errorReturn;
@@ -458,7 +458,7 @@ rdctype::pair ReplayOutput::PickVertex(uint32_t eventID, uin
       uint32_t vert = m_pDevice->PickVertex(m_EventID, cfg, x, y);
       if(vert != ~0U)
       {
-        return rdctype::make_pair(vert, inst);
+        return make_rdcpair(vert, inst);
       }
     }
 
@@ -466,7 +466,7 @@ rdctype::pair ReplayOutput::PickVertex(uint32_t eventID, uin
   }
   else
   {
-    return rdctype::make_pair(m_pDevice->PickVertex(m_EventID, cfg, x, y), 0U);
+    return make_rdcpair(m_pDevice->PickVertex(m_EventID, cfg, x, y), 0U);
   }
 }
 
diff --git a/renderdoc/serialise/serialiser.h b/renderdoc/serialise/serialiser.h
index 80e18d130..13224f824 100644
--- a/renderdoc/serialise/serialiser.h
+++ b/renderdoc/serialise/serialiser.h
@@ -477,7 +477,7 @@ public:
   }
 
   template 
-  void Serialise(const char *name, rdctype::array &el)
+  void Serialise(const char *name, rdcarray &el)
   {
     int32_t sz = el.count();
     Serialise(name, sz);
@@ -494,7 +494,68 @@ public:
     }
   }
 
-  void Serialise(const char *name, rdctype::str &el)
+  void Serialise(const char *name, bytebuf &el)
+  {
+    int32_t bufLen = el.count();
+
+    if(m_Mode >= WRITING)
+    {
+      WriteFrom(bufLen);
+
+      // ensure byte alignment
+      uint64_t offs = GetOffset();
+      uint64_t alignedoffs = AlignUp(offs, BufferAlignment);
+
+      if(offs != alignedoffs)
+      {
+        static const byte padding[64] = {0};
+        WriteBytes(&padding[0], (size_t)(alignedoffs - offs));
+      }
+
+      RDCASSERT((GetOffset() % BufferAlignment) == 0);
+
+      WriteBytes(el.data(), bufLen);
+
+      m_AlignedData = true;
+    }
+    else
+    {
+      ReadInto(bufLen);
+
+      // ensure byte alignment
+      uint64_t offs = GetOffset();
+
+      // serialise version 0x00000031 had only 16-byte alignment
+      uint64_t alignedoffs = AlignUp(offs, m_SerVer == 0x00000031 ? 16 : BufferAlignment);
+
+      if(offs != alignedoffs)
+      {
+        ReadBytes((size_t)(alignedoffs - offs));
+      }
+
+      el.resize((size_t)bufLen);
+      memcpy(el.data(), ReadBytes(bufLen), bufLen);
+    }
+
+    if(m_DebugTextWriting && name && name[0])
+    {
+      const char *ellipsis = "...";
+
+      uint32_t lbuf[4];
+
+      memcpy(lbuf, el.data(), RDCMIN((size_t)bufLen, 4 * sizeof(uint32_t)));
+
+      if(bufLen <= 16)
+      {
+        ellipsis = "   ";
+      }
+
+      DebugPrint("%s: RawBuffer % 5d:< 0x%08x 0x%08x 0x%08x 0x%08x %s>\n", name, bufLen, lbuf[0],
+                 lbuf[1], lbuf[2], lbuf[3], ellipsis);
+    }
+  }
+
+  void Serialise(const char *name, rdcstr &el)
   {
     int32_t sz = el.count();
     Serialise(name, sz);
@@ -519,7 +580,7 @@ public:
   }
 
   template 
-  void Serialise(const char *name, rdctype::pair &el)
+  void Serialise(const char *name, rdcpair &el)
   {
     Serialise(name, el.first);
     Serialise(name, el.second);
diff --git a/renderdoccmd/renderdoccmd.cpp b/renderdoccmd/renderdoccmd.cpp
index 4d9e98749..3f948a3fe 100644
--- a/renderdoccmd/renderdoccmd.cpp
+++ b/renderdoccmd/renderdoccmd.cpp
@@ -34,9 +34,9 @@ using std::wstring;
 bool usingKillSignal = false;
 volatile bool killSignal = false;
 
-rdctype::array convertArgs(const std::vector &args)
+rdcarray convertArgs(const std::vector &args)
 {
-  rdctype::array ret;
+  rdcarray ret;
   ret.reserve(args.size());
   for(size_t i = 0; i < args.size(); i++)
     ret.push_back(args[i]);
@@ -59,7 +59,7 @@ void DisplayRendererPreview(IReplayController *renderer, uint32_t width, uint32_
   if(renderer == NULL)
     return;
 
-  rdctype::array texs = renderer->GetTextures();
+  rdcarray texs = renderer->GetTextures();
 
   TextureDisplay d;
   d.mip = 0;
@@ -89,7 +89,7 @@ void DisplayRendererPreview(IReplayController *renderer, uint32_t width, uint32_
     }
   }
 
-  rdctype::array draws = renderer->GetDrawcalls();
+  rdcarray draws = renderer->GetDrawcalls();
 
   if(!draws.empty() && draws.back().flags & DrawFlags::Present)
   {
@@ -277,7 +277,7 @@ struct ThumbCommand : public Command
                   << std::endl;
     }
 
-    rdctype::array buf;
+    bytebuf buf;
 
     ICaptureFile *file = RENDERDOC_OpenCaptureFile(filename.c_str());
     if(file->OpenStatus() == ReplayStatus::Succeeded)
@@ -349,7 +349,7 @@ struct CaptureCommand : public Command
       cmdLine += EscapeArgument(parser.rest()[i]);
     }
 
-    RENDERDOC_InitGlobalEnv(m_Env, rdctype::array());
+    RENDERDOC_InitGlobalEnv(m_Env, rdcarray());
 
     std::cout << "Launching '" << executable << "'";
 
@@ -358,7 +358,7 @@ struct CaptureCommand : public Command
 
     std::cout << std::endl;
 
-    rdctype::array env;
+    rdcarray env;
 
     uint32_t ident = RENDERDOC_ExecuteAndInject(
         executable.c_str(), workingDir.empty() ? "" : workingDir.c_str(),
@@ -423,7 +423,7 @@ struct InjectCommand : public Command
 
     std::cout << "Injecting into PID " << PID << std::endl;
 
-    rdctype::array env;
+    rdcarray env;
 
     RENDERDOC_InitGlobalEnv(m_Env, convertArgs(parser.rest()));
 
@@ -549,7 +549,7 @@ struct ReplayCommand : public Command
 
       std::cerr << "Copying capture file to remote server" << std::endl;
 
-      rdctype::str remotePath = remote->CopyCaptureToRemote(filename.c_str(), NULL);
+      rdcstr remotePath = remote->CopyCaptureToRemote(filename.c_str(), NULL);
 
       IReplayController *renderer = NULL;
       std::tie(status, renderer) = remote->OpenCapture(~0U, remotePath.c_str(), NULL);
@@ -646,7 +646,7 @@ struct CapAltBitCommand : public Command
     CaptureOptions cmdopts;
     readCapOpts(parser.get("capopts").c_str(), &cmdopts);
 
-    RENDERDOC_InitGlobalEnv(m_Env, rdctype::array());
+    RENDERDOC_InitGlobalEnv(m_Env, rdcarray());
 
     std::vector rest = parser.rest();
 
@@ -658,7 +658,7 @@ struct CapAltBitCommand : public Command
 
     int numEnvs = int(rest.size() / 3);
 
-    rdctype::array env;
+    rdcarray env;
     env.reserve(numEnvs);
 
     for(int i = 0; i < numEnvs; i++)
diff --git a/renderdoccmd/renderdoccmd_linux.cpp b/renderdoccmd/renderdoccmd_linux.cpp
index 580187c13..ecc80ceb7 100644
--- a/renderdoccmd/renderdoccmd_linux.cpp
+++ b/renderdoccmd/renderdoccmd_linux.cpp
@@ -108,8 +108,8 @@ struct VulkanRegisterCommand : public Command
 void VerifyVulkanLayer(const GlobalEnvironment &env, int argc, char *argv[])
 {
   VulkanLayerFlags flags = VulkanLayerFlags::NoFlags;
-  rdctype::array myJSONs;
-  rdctype::array otherJSONs;
+  rdcarray myJSONs;
+  rdcarray otherJSONs;
 
   bool needUpdate = RENDERDOC_NeedVulkanLayerRegistration(&flags, &myJSONs, &otherJSONs);
 
@@ -138,20 +138,20 @@ void VerifyVulkanLayer(const GlobalEnvironment &env, int argc, char *argv[])
   const bool registerAll = bool(flags & VulkanLayerFlags::RegisterAll);
   const bool updateAllowed = bool(flags & VulkanLayerFlags::UpdateAllowed);
 
-  for(const rdctype::str &j : otherJSONs)
+  for(const rdcstr &j : otherJSONs)
     std::cerr << (updateAllowed ? "Unregister/update: " : "Unregister: ") << j.c_str() << std::endl;
 
   if(!(flags & VulkanLayerFlags::ThisInstallRegistered))
   {
     if(registerAll)
     {
-      for(const rdctype::str &j : myJSONs)
+      for(const rdcstr &j : myJSONs)
         std::cerr << (updateAllowed ? "Register/update: " : "Register: ") << j.c_str() << std::endl;
     }
     else
     {
       std::cerr << (updateAllowed ? "Register one of:" : "Register/update one of:") << std::endl;
-      for(const rdctype::str &j : myJSONs)
+      for(const rdcstr &j : myJSONs)
         std::cerr << "  -- " << j.c_str() << "\n";
     }
   }
@@ -265,7 +265,7 @@ void DisplayRendererPreview(IReplayController *renderer, TextureDisplay &display
 
   xcb_map_window(connection, window);
 
-  rdctype::array systems = renderer->GetSupportedWindowSystems();
+  rdcarray systems = renderer->GetSupportedWindowSystems();
 
   bool xcb = false, xlib = false;