Expose C++ interface via API headers, for C++ UI

* Since the exported C functions just take an explicit 'this' parameter
  and call the corresponding function, we can just make it contractual
  via a virtual interface that the pointer can be dereferenced.
This commit is contained in:
baldurk
2015-04-02 17:38:13 +01:00
parent 56c4b23c7a
commit ea4350f52f
7 changed files with 175 additions and 34 deletions
+146 -10
View File
@@ -100,10 +100,38 @@ struct ResourceId
#include "d3d11_pipestate.h"
#include "gl_pipestate.h"
// for C++ expose the interface as a virtual interface
#ifdef __cplusplus
struct IReplayOutput
{
virtual bool SetOutputConfig(const OutputConfig &o) = 0;
virtual bool SetTextureDisplay(const TextureDisplay &o) = 0;
virtual bool SetMeshDisplay(const MeshDisplay &o) = 0;
virtual bool ClearThumbnails() = 0;
virtual bool AddThumbnail(void *wnd, ResourceId texID) = 0;
virtual bool Display() = 0;
virtual bool SetPixelContext(void *wnd) = 0;
virtual bool SetPixelContextLocation(uint32_t x, uint32_t y) = 0;
virtual void DisablePixelContext() = 0;
virtual bool PickPixel(ResourceId texID, bool customShader,
uint32_t x, uint32_t y, uint32_t sliceFace, uint32_t mip, uint32_t sample, PixelValue *val) = 0;
};
#endif
#ifdef RENDERDOC_EXPORTS
struct ReplayOutput;
struct ReplayOutput;
#else
struct ReplayOutput { };
#ifdef __cplusplus
typedef IReplayOutput ReplayOutput;
#else
struct ReplayOutput { };
#endif
#endif
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayOutput_SetOutputConfig(ReplayOutput *output, const OutputConfig &o);
@@ -123,10 +151,74 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayOutput_PickPixel(ReplayOutput
uint32_t x, uint32_t y, uint32_t sliceFace, uint32_t mip, uint32_t sample, PixelValue *val);
extern "C" RENDERDOC_API uint32_t RENDERDOC_CC ReplayOutput_PickVertex(ReplayOutput *output, uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y);
// for C++ expose the interface as a virtual interface
#ifdef __cplusplus
struct IReplayRenderer
{
virtual APIProperties GetAPIProperties() = 0;
virtual ReplayOutput* CreateOutput(void *handle) = 0;
virtual void Shutdown() = 0;
virtual void ShutdownOutput(ReplayOutput *output) = 0;
virtual bool HasCallstacks() = 0;
virtual bool InitResolver() = 0;
virtual bool SetContextFilter(ResourceId id, uint32_t firstDefEv, uint32_t lastDefEv) = 0;
virtual bool SetFrameEvent(uint32_t frameID, uint32_t eventID) = 0;
virtual bool GetD3D11PipelineState(D3D11PipelineState *state) = 0;
virtual bool GetGLPipelineState(GLPipelineState *state) = 0;
virtual ResourceId BuildCustomShader(const char *entry, const char *source, const uint32_t compileFlags, ShaderStageType type, rdctype::str *errors) = 0;
virtual bool FreeCustomShader(ResourceId id) = 0;
virtual ResourceId BuildTargetShader(const char *entry, const char *source, const uint32_t compileFlags, ShaderStageType type, rdctype::str *errors) = 0;
virtual bool ReplaceResource(ResourceId from, ResourceId to) = 0;
virtual bool RemoveReplacement(ResourceId id) = 0;
virtual bool FreeTargetResource(ResourceId id) = 0;
virtual bool GetFrameInfo(rdctype::array<FetchFrameInfo> *frame) = 0;
virtual bool GetDrawcalls(uint32_t frameID, rdctype::array<FetchDrawcall> *draws) = 0;
virtual bool FetchCounters(uint32_t frameID, uint32_t minEventID, uint32_t maxEventID, uint32_t *counters, uint32_t numCounters, rdctype::array<CounterResult> *results) = 0;
virtual bool EnumerateCounters(rdctype::array<uint32_t> *counters) = 0;
virtual bool DescribeCounter(uint32_t counterID, CounterDescription *desc) = 0;
virtual bool GetTextures(rdctype::array<FetchTexture> *texs) = 0;
virtual bool GetBuffers(rdctype::array<FetchBuffer> *bufs) = 0;
virtual bool GetResolve(uint64_t *callstack, uint32_t callstackLen, rdctype::array<rdctype::str> *trace) = 0;
virtual ShaderReflection* GetShaderDetails(ResourceId shader) = 0;
virtual bool GetDebugMessages(rdctype::array<DebugMessage> *msgs) = 0;
virtual bool PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx, rdctype::array<PixelModification> *history) = 0;
virtual bool DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace) = 0;
virtual bool DebugPixel(uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive, ShaderDebugTrace *trace) = 0;
virtual bool DebugThread(uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace) = 0;
virtual bool GetUsage(ResourceId id, rdctype::array<EventUsage> *usage) = 0;
virtual bool GetCBufferVariableContents(ResourceId shader, uint32_t cbufslot, ResourceId buffer, uint32_t offs, rdctype::array<ShaderVariable> *vars) = 0;
virtual bool SaveTexture(const TextureSave &saveData, const char *path) = 0;
virtual bool GetPostVSData(uint32_t instID, MeshDataStage stage, MeshFormat *data) = 0;
virtual bool GetMinMax(ResourceId tex, uint32_t sliceFace, uint32_t mip, uint32_t sample, PixelValue *minval, PixelValue *maxval) = 0;
virtual bool GetHistogram(ResourceId tex, uint32_t sliceFace, uint32_t mip, uint32_t sample, float minval, float maxval, bool channels[4], rdctype::array<uint32_t> *histogram) = 0;
virtual bool GetBufferData(ResourceId buff, uint32_t offset, uint32_t len, rdctype::array<byte> *data) = 0;
virtual bool GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, rdctype::array<byte> *data) = 0;
};
#endif
#ifdef RENDERDOC_EXPORTS
struct ReplayRenderer;
struct ReplayRenderer;
#else
struct ReplayRenderer { };
#ifdef __cplusplus
typedef IReplayRenderer ReplayRenderer;
#else
struct ReplayRenderer { };
#endif
#endif
extern "C" RENDERDOC_API void RENDERDOC_CC ReplayRenderer_GetAPIProperties(ReplayRenderer *rend, APIProperties *props);
@@ -143,10 +235,10 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_SetFrameEvent(Replay
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetD3D11PipelineState(ReplayRenderer *rend, D3D11PipelineState *state);
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetGLPipelineState(ReplayRenderer *rend, GLPipelineState *state);
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_BuildCustomShader(ReplayRenderer *rend, const char *entry, const char *source, const uint32_t compileFlags, ShaderStageType type, ResourceId *shaderID, rdctype::str *errors);
extern "C" RENDERDOC_API void RENDERDOC_CC ReplayRenderer_BuildCustomShader(ReplayRenderer *rend, const char *entry, const char *source, const uint32_t compileFlags, ShaderStageType type, ResourceId *shaderID, rdctype::str *errors);
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_FreeCustomShader(ReplayRenderer *rend, ResourceId id);
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_BuildTargetShader(ReplayRenderer *rend, const char *entry, const char *source, const uint32_t compileFlags, ShaderStageType type, ResourceId *shaderID, rdctype::str *errors);
extern "C" RENDERDOC_API void RENDERDOC_CC ReplayRenderer_BuildTargetShader(ReplayRenderer *rend, const char *entry, const char *source, const uint32_t compileFlags, ShaderStageType type, ResourceId *shaderID, rdctype::str *errors);
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_ReplaceResource(ReplayRenderer *rend, ResourceId from, ResourceId to);
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_RemoveReplacement(ReplayRenderer *rend, ResourceId id);
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_FreeTargetResource(ReplayRenderer *rend, ResourceId id);
@@ -181,10 +273,35 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetHistogram(ReplayR
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetBufferData(ReplayRenderer *rend, ResourceId buff, uint32_t offset, uint32_t len, rdctype::array<byte> *data);
extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetTextureData(ReplayRenderer *rend, ResourceId tex, uint32_t arrayIdx, uint32_t mip, rdctype::array<byte> *data);
// for C++ expose the interface as a virtual interface
#ifdef __cplusplus
struct IRemoteAccess
{
virtual void Shutdown() = 0;
virtual const char* GetTarget() = 0;
virtual const char* GetAPI() = 0;
virtual uint32_t GetPID() = 0;
virtual const char* GetBusyClient() = 0;
virtual void TriggerCapture() = 0;
virtual void QueueCapture(uint32_t frameNumber) = 0;
virtual void CopyCapture(uint32_t remoteID, const char *localpath) = 0;
virtual void ReceiveMessage(RemoteMessage *msg) = 0;
};
#endif
#ifdef RENDERDOC_EXPORTS
struct RemoteAccess;
struct RemoteAccess;
#else
struct RemoteAccess { };
#ifdef __cplusplus
typedef IRemoteAccess RemoteAccess;
#else
struct RemoteAccess { };
#endif
#endif
extern "C" RENDERDOC_API void RENDERDOC_CC RemoteAccess_Shutdown(RemoteAccess *access);
@@ -200,10 +317,29 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RemoteAccess_CopyCapture(RemoteAccess
extern "C" RENDERDOC_API void RENDERDOC_CC RemoteAccess_ReceiveMessage(RemoteAccess *access, RemoteMessage *msg);
// for C++ expose the interface as a virtual interface
#ifdef __cplusplus
struct IRemoteRenderer
{
virtual void Shutdown() = 0;
virtual bool LocalProxies(rdctype::array<rdctype::str> *out) = 0;
virtual bool RemoteSupportedReplays(rdctype::array<rdctype::str> *out) = 0;
virtual ReplayCreateStatus CreateProxyRenderer(uint32_t proxyid, const char *logfile, float *progress, ReplayRenderer **rend) = 0;
};
#endif
#ifdef RENDERDOC_EXPORTS
struct RemoteRenderer;
struct RemoteRenderer;
#else
struct RemoteRenderer { };
#ifdef __cplusplus
typedef IRemoteRenderer RemoteRenderer;
#else
struct RemoteRenderer { };
#endif
#endif
extern "C" RENDERDOC_API void RENDERDOC_CC RemoteRenderer_Shutdown(RemoteRenderer *remote);