summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2021-01-11 09:11:52 -0800
committerGitHub <noreply@github.com>2021-01-11 09:11:52 -0800
commit5554777188225266e2295db3588f6cb17cae0c4d (patch)
tree9d15992cd24d752cde1047745cf75a25e841f494
parente24c5a6cb9c3347477b83abe084a09ae8f9fde0a (diff)
Make `gfx::Renderer` a COM interface. (#1653)
* Make `gfx::Renderer` a COM interface. This is a first step towards making the `gfx` library expose a COM compatible DLL interface. Remaining classes will come as separate PRs. * Fixup project files * Fix calling conventions * Make gfx::create*Renderer() functions increase ref count by 1 * Make renderer createFunc return via out parameter
-rw-r--r--examples/gpu-printing/main.cpp8
-rw-r--r--examples/hello-world/main.cpp10
-rw-r--r--examples/heterogeneous-hello-world/main.cpp42
-rw-r--r--examples/model-viewer/main.cpp22
-rw-r--r--examples/shader-toy/main.cpp8
-rw-r--r--tools/gfx/cuda/render-cuda.cpp142
-rw-r--r--tools/gfx/cuda/render-cuda.h6
-rw-r--r--tools/gfx/d3d11/render-d3d11.cpp137
-rw-r--r--tools/gfx/d3d11/render-d3d11.h6
-rw-r--r--tools/gfx/d3d12/render-d3d12.cpp138
-rw-r--r--tools/gfx/d3d12/render-d3d12.h6
-rw-r--r--tools/gfx/open-gl/render-gl.cpp137
-rw-r--r--tools/gfx/open-gl/render-gl.h6
-rw-r--r--tools/gfx/render-graphics-common.cpp44
-rw-r--r--tools/gfx/render-graphics-common.h14
-rw-r--r--tools/gfx/render.h126
-rw-r--r--tools/gfx/vulkan/render-vk.cpp139
-rw-r--r--tools/gfx/vulkan/render-vk.h6
-rw-r--r--tools/graphics-app-framework/gui.cpp2
-rw-r--r--tools/graphics-app-framework/gui.h6
-rw-r--r--tools/graphics-app-framework/model.cpp2
-rw-r--r--tools/graphics-app-framework/model.h10
-rw-r--r--tools/render-test/render-test-main.cpp30
-rw-r--r--tools/render-test/shader-renderer-util.cpp32
-rw-r--r--tools/render-test/shader-renderer-util.h34
25 files changed, 716 insertions, 397 deletions
diff --git a/examples/gpu-printing/main.cpp b/examples/gpu-printing/main.cpp
index 10af0eef7..75c083a33 100644
--- a/examples/gpu-printing/main.cpp
+++ b/examples/gpu-printing/main.cpp
@@ -14,7 +14,7 @@ using namespace gfx;
#include "gpu-printing.h"
-ComPtr<slang::ISession> createSlangSession(gfx::Renderer* renderer)
+ComPtr<slang::ISession> createSlangSession(gfx::IRenderer* renderer)
{
ComPtr<slang::IGlobalSession> slangGlobalSession;
slangGlobalSession.attach(spCreateSession(NULL));
@@ -65,7 +65,7 @@ int gWindowHeight = 480;
gfx::ApplicationContext* gAppContext;
gfx::Window* gWindow;
-RefPtr<gfx::Renderer> gRenderer;
+ComPtr<gfx::IRenderer> gRenderer;
ComPtr<slang::ISession> gSlangSession;
ComPtr<slang::IModule> gSlangModule;
@@ -118,8 +118,8 @@ Result execute()
windowDesc.height = gWindowHeight;
gWindow = createWindow(windowDesc);
- gRenderer = createD3D11Renderer();
- Renderer::Desc rendererDesc;
+ createD3D11Renderer(gRenderer.writeRef());
+ IRenderer::Desc rendererDesc;
rendererDesc.width = gWindowWidth;
rendererDesc.height = gWindowHeight;
{
diff --git a/examples/hello-world/main.cpp b/examples/hello-world/main.cpp
index 9618b8c4d..da35f3f0a 100644
--- a/examples/hello-world/main.cpp
+++ b/examples/hello-world/main.cpp
@@ -35,6 +35,8 @@
#include "gfx/render.h"
#include "gfx/d3d11/render-d3d11.h"
#include "tools/graphics-app-framework/window.h"
+#include "slang-com-ptr.h"
+
using namespace gfx;
// For the purposes of a small example, we will define the vertex data for a
@@ -70,7 +72,7 @@ struct HelloWorld
// Slang API. This function is representative of code that a user
// might write to integrate Slang into their renderer/engine.
//
-RefPtr<gfx::ShaderProgram> loadShaderProgram(gfx::Renderer* renderer)
+RefPtr<gfx::ShaderProgram> loadShaderProgram(gfx::IRenderer* renderer)
{
// First, we need to create a "session" for interacting with the Slang
// compiler. This scopes all of our application's interactions
@@ -227,7 +229,7 @@ int gWindowHeight = 768;
//
gfx::ApplicationContext* gAppContext;
gfx::Window* gWindow;
-RefPtr<gfx::Renderer> gRenderer;
+Slang::ComPtr<gfx::IRenderer> gRenderer;
RefPtr<gfx::BufferResource> gConstantBuffer;
RefPtr<gfx::PipelineLayout> gPipelineLayout;
@@ -257,8 +259,8 @@ Result initialize()
// A future version of this example may support multiple
// platforms/APIs.
//
- gRenderer = createD3D11Renderer();
- Renderer::Desc rendererDesc;
+ createD3D11Renderer(gRenderer.writeRef());
+ IRenderer::Desc rendererDesc;
rendererDesc.width = gWindowWidth;
rendererDesc.height = gWindowHeight;
{
diff --git a/examples/heterogeneous-hello-world/main.cpp b/examples/heterogeneous-hello-world/main.cpp
index 8c31e7a4c..51aff0a17 100644
--- a/examples/heterogeneous-hello-world/main.cpp
+++ b/examples/heterogeneous-hello-world/main.cpp
@@ -32,6 +32,7 @@
// with Slang may depend on an application/engine making certain
// design choices in their abstraction layer.
//
+#include "slang-com-ptr.h"
#include "gfx/render.h"
#include "gfx/d3d11/render-d3d11.h"
#include "tools/graphics-app-framework/window.h"
@@ -42,7 +43,7 @@ using namespace gfx;
//
RefPtr<gfx::ShaderProgram> gShaderProgram;
RefPtr<gfx::ApplicationContext> gAppContext;
-RefPtr<gfx::Renderer> gRenderer;
+Slang::ComPtr<gfx::IRenderer> gRenderer;
RefPtr<gfx::BufferResource> gStructuredBuffer;
@@ -66,7 +67,7 @@ bool executeComputation_0();
extern unsigned char __computeMain[];
extern size_t __computeMainSize;
-gfx::ShaderProgram* loadShaderProgram(gfx::Renderer* renderer, unsigned char computeCode[], size_t computeCodeSize)
+gfx::ShaderProgram* loadShaderProgram(gfx::IRenderer* renderer, unsigned char computeCode[], size_t computeCodeSize)
{
// We extract the begin/end pointers to the output code buffers directly
//
@@ -109,7 +110,7 @@ gfx::Window* createWindow(int windowWidth, int windowHeight)
//return globalWindow;
}
-gfx::Renderer* createRenderer(
+gfx::IRenderer* createRenderer(
int windowWidth,
int windowHeight,
gfx::Window* window)
@@ -121,8 +122,8 @@ gfx::Renderer* createRenderer(
// A future version of this example may support multiple
// platforms/APIs.
//
- gRenderer = createD3D11Renderer();
- Renderer::Desc rendererDesc;
+ createD3D11Renderer(gRenderer.writeRef());
+ IRenderer::Desc rendererDesc;
rendererDesc.width = windowWidth;
rendererDesc.height = windowHeight;
{
@@ -132,7 +133,7 @@ gfx::Renderer* createRenderer(
return gRenderer;
}
-gfx::BufferResource* createStructuredBuffer(gfx::Renderer* renderer, float* initialArray)
+gfx::BufferResource* createStructuredBuffer(gfx::IRenderer* renderer, float* initialArray)
{
// Create a structured buffer for storing the data for computation
//
@@ -151,7 +152,7 @@ gfx::BufferResource* createStructuredBuffer(gfx::Renderer* renderer, float* init
return gStructuredBuffer;
}
-gfx::DescriptorSetLayout* buildDescriptorSetLayout(gfx::Renderer* renderer)
+gfx::DescriptorSetLayout* buildDescriptorSetLayout(gfx::IRenderer* renderer)
{
// Our example graphics API usess a "modern" D3D12/Vulkan style
// of resource binding, so now we will dive into describing and
@@ -170,7 +171,7 @@ gfx::DescriptorSetLayout* buildDescriptorSetLayout(gfx::Renderer* renderer)
return gDescriptorSetLayout;
}
-gfx::PipelineLayout* buildPipeline(gfx::Renderer* renderer, gfx::DescriptorSetLayout* descriptorSetLayout)
+gfx::PipelineLayout* buildPipeline(gfx::IRenderer* renderer, gfx::DescriptorSetLayout* descriptorSetLayout)
{
// Next we will allocate a pipeline layout, which specifies
// that we will render with only a single descriptor set bound.
@@ -190,7 +191,7 @@ gfx::PipelineLayout* buildPipeline(gfx::Renderer* renderer, gfx::DescriptorSetLa
}
gfx::DescriptorSet* buildDescriptorSet(
- gfx::Renderer* renderer,
+ gfx::IRenderer* renderer,
gfx::DescriptorSetLayout* descriptorSetLayout,
gfx::BufferResource* structuredBuffer)
{
@@ -213,7 +214,7 @@ gfx::DescriptorSet* buildDescriptorSet(
gfx::PipelineState* buildPipelineState(
gfx::ShaderProgram* shaderProgram,
- gfx::Renderer* renderer,
+ gfx::IRenderer* renderer,
gfx::PipelineLayout* pipelineLayout)
{
// Following the D3D12/Vulkan style of API, we need a pipeline state object
@@ -238,7 +239,7 @@ void printInitialValues(float* initialArray, int length)
}
void dispatchComputation(
- gfx::Renderer* gRenderer,
+ gfx::IRenderer* gRenderer,
gfx::PipelineState* gPipelineState,
gfx::PipelineLayout* gPipelineLayout,
gfx::DescriptorSet* gDescriptorSet,
@@ -254,7 +255,7 @@ void dispatchComputation(
}
void print_output(
- gfx::Renderer* renderer,
+ gfx::IRenderer* renderer,
gfx::BufferResource* structuredBuffer,
int length)
{
@@ -285,28 +286,28 @@ gfx_Renderer_0* createRenderer_0(int32_t _0, int32_t _1, gfx_Window_0* _2)
gfx_BufferResource_0* createStructuredBuffer_0(gfx_Renderer_0* _0, FixedArray<float, 4> _1)
{
- return (gfx_BufferResource_0*)createStructuredBuffer((gfx::Renderer*)_0, (float*)&_1);
+ return (gfx_BufferResource_0*)createStructuredBuffer((gfx::IRenderer*)_0, (float*)&_1);
}
gfx_ShaderProgram_0* loadShaderProgram_0(gfx_Renderer_0* _0, unsigned char _1[], size_t _2)
{
- return (gfx_ShaderProgram_0*)loadShaderProgram((gfx::Renderer*)_0, _1, _2);
+ return (gfx_ShaderProgram_0*)loadShaderProgram((gfx::IRenderer*)_0, _1, _2);
}
gfx_DescriptorSetLayout_0* buildDescriptorSetLayout_0(gfx_Renderer_0* _0)
{
- return (gfx_DescriptorSetLayout_0*)buildDescriptorSetLayout((gfx::Renderer*)_0);
+ return (gfx_DescriptorSetLayout_0*)buildDescriptorSetLayout((gfx::IRenderer*)_0);
}
gfx_PipelineLayout_0* buildPipeline_0(gfx_Renderer_0* _0, gfx_DescriptorSetLayout_0* _1)
{
- return (gfx_PipelineLayout_0*)buildPipeline((gfx::Renderer*)_0, (gfx::DescriptorSetLayout*)_1);
+ return (gfx_PipelineLayout_0*)buildPipeline((gfx::IRenderer*)_0, (gfx::DescriptorSetLayout*)_1);
}
gfx_DescriptorSet_0* buildDescriptorSet_0(gfx_Renderer_0* _0, gfx_DescriptorSetLayout_0* _1, gfx_BufferResource_0* _2)
{
return (gfx_DescriptorSet_0*)buildDescriptorSet(
- (gfx::Renderer*)_0,
+ (gfx::IRenderer*)_0,
(gfx::DescriptorSetLayout*)_1,
(gfx::BufferResource*)_2);
}
@@ -314,8 +315,7 @@ gfx_DescriptorSet_0* buildDescriptorSet_0(gfx_Renderer_0* _0, gfx_DescriptorSetL
gfx_PipelineState_0* buildPipelineState_0(gfx_ShaderProgram_0* _0, gfx_Renderer_0* _1, gfx_PipelineLayout_0* _2)
{
return (gfx_PipelineState_0*)buildPipelineState(
- (gfx::ShaderProgram*)_0,
- (gfx::Renderer*)_1,
+ (gfx::ShaderProgram*)_0, (gfx::IRenderer*)_1,
(gfx::PipelineLayout*)_2);
}
@@ -327,7 +327,7 @@ void printInitialValues_0(FixedArray<float, 4> _0, int32_t _1)
void dispatchComputation_0(gfx_Renderer_0* _0, gfx_PipelineState_0* _1, gfx_PipelineLayout_0* _2, gfx_DescriptorSet_0* _3, unsigned int gridDimsX, unsigned int gridDimsY, unsigned int gridDimsZ)
{
dispatchComputation(
- (gfx::Renderer*)_0,
+ (gfx::IRenderer*)_0,
(gfx::PipelineState*)_1,
(gfx::PipelineLayout*)_2,
(gfx::DescriptorSet*)_3,
@@ -348,7 +348,7 @@ gfx_BufferResource_0* unconvertBuffer_0(RWStructuredBuffer<float> _0) {
void print_output_0(gfx_Renderer_0* _0, gfx_BufferResource_0* _1, int32_t _2)
{
- print_output((gfx::Renderer*)_0, (gfx::BufferResource*)_1, _2);
+ print_output((gfx::IRenderer*)_0, (gfx::BufferResource*)_1, _2);
}
// This "inner" main function is used by the platform abstraction
diff --git a/examples/model-viewer/main.cpp b/examples/model-viewer/main.cpp
index 9507f2e2f..2dc7df3b5 100644
--- a/examples/model-viewer/main.cpp
+++ b/examples/model-viewer/main.cpp
@@ -12,7 +12,7 @@
// We still need to include the Slang header to use the Slang API
//
#include <slang.h>
-
+#include "slang-com-helper.h"
// We will again make use of a simple graphics API abstraction
// layer, just to keep the examples short and to the point.
//
@@ -67,7 +67,7 @@ struct ShaderModule : RefObject
// Reference to the renderer, used to service requests
// that load graphics API objects based on the module.
- RefPtr<gfx::Renderer> renderer;
+ Slang::ComPtr<gfx::IRenderer> renderer;
};
//
// In order to load a shader module from a `.slang` file on
@@ -78,7 +78,7 @@ struct ShaderModule : RefObject
// example's `loadShaderProgram()` function, and how this function
// loads a module for reflection purposes.
//
-RefPtr<ShaderModule> loadShaderModule(Renderer* renderer, char const* inputPath)
+RefPtr<ShaderModule> loadShaderModule(IRenderer* renderer, char const* inputPath)
{
auto slangSession = getSlangSession();
SlangCompileRequest* slangRequest = spCreateCompileRequest(slangSession);
@@ -361,7 +361,7 @@ struct ParameterBlockLayout : RefObject
// The graphics API device that should be used to allocate parameter
// block instances.
//
- RefPtr<gfx::Renderer> renderer;
+ Slang::ComPtr<gfx::IRenderer> renderer;
// The name of the type, as it appears in Slang code.
//
@@ -640,7 +640,7 @@ struct ParameterBlockEncoder
struct ParameterBlock : RefObject
{
// The graphics API device used to allocate this block.
- RefPtr<gfx::Renderer> renderer;
+ Slang::ComPtr<gfx::IRenderer> renderer;
// The associated parameter block layout.
RefPtr<ParameterBlockLayout> layout;
@@ -1100,7 +1100,7 @@ private:
// Our current abstraction layer lumps this all together
// with the "device."
//
- RefPtr<gfx::Renderer> renderer;
+ Slang::ComPtr<gfx::IRenderer> renderer;
// We also retain a pointer to the shader cache, which
// will be used to implement lookup of the right
@@ -1165,7 +1165,7 @@ private:
public:
// Initializing a render context just sets its pointer to the GPU API device
RenderContext(
- gfx::Renderer* renderer,
+ gfx::IRenderer* renderer,
ShaderCache* shaderCache)
: renderer(renderer)
, shaderCache(shaderCache)
@@ -1386,7 +1386,7 @@ struct Model : RefObject
// used for its representation.
//
RefPtr<Model> loadModel(
- Renderer* renderer,
+ IRenderer* renderer,
char const* inputPath,
ModelLoader::LoadFlags loadFlags = 0,
float scale = 1.0f)
@@ -1910,7 +1910,7 @@ struct LightEnv : public RefObject
struct ModelViewer {
Window* gWindow;
-RefPtr<gfx::Renderer> gRenderer;
+Slang::ComPtr<gfx::IRenderer> gRenderer;
RefPtr<gfx::ResourceView> gDepthTarget;
// We keep a pointer to the one effect we are using (for a forward
@@ -2050,8 +2050,8 @@ Result initialize()
windowDesc.userData = this;
gWindow = createWindow(windowDesc);
- gRenderer = createD3D11Renderer();
- Renderer::Desc rendererDesc;
+ createD3D11Renderer(gRenderer.writeRef());
+ IRenderer::Desc rendererDesc;
rendererDesc.width = gWindowWidth;
rendererDesc.height = gWindowHeight;
gRenderer->initialize(rendererDesc, getPlatformWindowHandle(gWindow));
diff --git a/examples/shader-toy/main.cpp b/examples/shader-toy/main.cpp
index 403456036..89a40b794 100644
--- a/examples/shader-toy/main.cpp
+++ b/examples/shader-toy/main.cpp
@@ -88,7 +88,7 @@ void diagnoseIfNeeded(slang::IBlob* diagnosticsBlob)
// The main interesting part of the host application code is where we
// load, compile, inspect, and compose the Slang shader code.
//
-Result loadShaderProgram(gfx::Renderer* renderer, RefPtr<gfx::ShaderProgram>& outShaderProgram)
+Result loadShaderProgram(gfx::IRenderer* renderer, RefPtr<gfx::ShaderProgram>& outShaderProgram)
{
// The first step in interacting with the Slang API is to create a "global session,"
// which represents an instance of the Slang API loaded from the library.
@@ -366,7 +366,7 @@ int gWindowHeight = 768;
gfx::ApplicationContext* gAppContext;
gfx::Window* gWindow;
-RefPtr<gfx::Renderer> gRenderer;
+Slang::ComPtr<gfx::IRenderer> gRenderer;
RefPtr<gfx::BufferResource> gConstantBuffer;
RefPtr<gfx::PipelineLayout> gPipelineLayout;
@@ -385,8 +385,8 @@ Result initialize()
windowDesc.userData = this;
gWindow = createWindow(windowDesc);
- gRenderer = createD3D11Renderer();
- Renderer::Desc rendererDesc;
+ createD3D11Renderer(gRenderer.writeRef());
+ IRenderer::Desc rendererDesc;
rendererDesc.width = gWindowWidth;
rendererDesc.height = gWindowHeight;
{
diff --git a/tools/gfx/cuda/render-cuda.cpp b/tools/gfx/cuda/render-cuda.cpp
index f12e8ee89..03bf41d38 100644
--- a/tools/gfx/cuda/render-cuda.cpp
+++ b/tools/gfx/cuda/render-cuda.cpp
@@ -1,11 +1,11 @@
#include "render-cuda.h"
+#include "slang.h"
#ifdef GFX_ENABLE_CUDA
#include "../render.h"
#include <cuda.h>
#include <cuda_runtime_api.h>
#include "core/slang-std-writers.h"
-#include "slang.h"
#endif
namespace gfx
@@ -13,6 +13,9 @@ namespace gfx
#ifdef GFX_ENABLE_CUDA
using namespace Slang;
+static const Guid IID_ISlangUnknown = SLANG_UUID_ISlangUnknown;
+static const Guid IID_IRenderer = SLANG_UUID_IRenderer;
+
SLANG_FORCE_INLINE static bool _isError(CUresult result) { return result != 0; }
SLANG_FORCE_INLINE static bool _isError(cudaError_t result) { return result != 0; }
@@ -414,9 +417,9 @@ public:
List<RefPtr<CUDAShaderObject>> objects;
List<RefPtr<CUDAResourceView>> resources;
- virtual SlangResult init(Renderer* renderer, CUDAShaderObjectLayout* typeLayout);
+ virtual SlangResult init(IRenderer* renderer, CUDAShaderObjectLayout* typeLayout);
- virtual SlangResult initBuffer(Renderer* renderer, size_t bufferSize)
+ virtual SlangResult initBuffer(IRenderer* renderer, size_t bufferSize)
{
BufferResource::Desc bufferDesc;
bufferDesc.init(bufferSize);
@@ -536,7 +539,7 @@ public:
void* hostBuffer = nullptr;
size_t uniformBufferSize = 0;
// Override buffer allocation so we store all uniform data on host memory instead of device memory.
- virtual SlangResult initBuffer(Renderer* renderer, size_t bufferSize) override
+ virtual SlangResult initBuffer(IRenderer* renderer, size_t bufferSize) override
{
uniformBufferSize = bufferSize;
hostBuffer = malloc(bufferSize);
@@ -573,14 +576,22 @@ class CUDARootShaderObject : public CUDAShaderObject
{
public:
List<RefPtr<CUDAEntryPointShaderObject>> entryPointObjects;
- virtual SlangResult init(Renderer* renderer, CUDAShaderObjectLayout* typeLayout) override;
+ virtual SlangResult init(IRenderer* renderer, CUDAShaderObjectLayout* typeLayout) override;
virtual Slang::Index getEntryPointCount() override { return entryPointObjects.getCount(); }
virtual ShaderObject* getEntryPoint(Slang::Index index) override { return entryPointObjects[index].Ptr(); }
};
-class CUDARenderer : public Renderer
+class CUDARenderer : public IRenderer, public RefObject
{
+public:
+ SLANG_REF_OBJECT_IUNKNOWN_ALL
+ IRenderer* getInterface(const Guid& guid)
+ {
+ return (guid == IID_ISlangUnknown || guid == IID_IRenderer) ? static_cast<IRenderer*>(this)
+ : nullptr;
+ }
+
private:
static const CUDAReportStyle reportType = CUDAReportStyle::Normal;
static int _calcSMCountPerMultiProcessor(int major, int minor)
@@ -709,7 +720,7 @@ private:
cuCtxDestroy(m_context);
}
}
- virtual SlangResult initialize(const Desc& desc, void* inWindowHandle) override
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL initialize(const Desc& desc, void* inWindowHandle) override
{
SLANG_RETURN_ON_FAIL(_initCuda(reportType));
@@ -728,7 +739,7 @@ private:
return SLANG_OK;
}
- virtual Result createTextureResource(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
Resource::Usage initialUsage,
const TextureResource::Desc& desc,
const TextureResource::Data* initData,
@@ -1096,7 +1107,7 @@ private:
return SLANG_OK;
}
- virtual Result createBufferResource(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
Resource::Usage initialUsage,
const BufferResource::Desc& desc,
const void* initData,
@@ -1112,7 +1123,7 @@ private:
return SLANG_OK;
}
- virtual Result createTextureView(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView(
TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) override
{
RefPtr<CUDAResourceView> view = new CUDAResourceView();
@@ -1122,7 +1133,7 @@ private:
return SLANG_OK;
}
- virtual Result createBufferView(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView(
BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) override
{
RefPtr<CUDAResourceView> view = new CUDAResourceView();
@@ -1132,7 +1143,7 @@ private:
return SLANG_OK;
}
- virtual Result createShaderObjectLayout(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObjectLayout(
slang::TypeLayoutReflection* typeLayout, ShaderObjectLayout** outLayout) override
{
RefPtr<CUDAShaderObjectLayout> cudaLayout;
@@ -1141,7 +1152,7 @@ private:
return SLANG_OK;
}
- virtual Result createRootShaderObjectLayout(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createRootShaderObjectLayout(
slang::ProgramLayout* layout, ShaderObjectLayout** outLayout) override
{
RefPtr<CUDAProgramLayout> cudaLayout;
@@ -1151,7 +1162,8 @@ private:
return SLANG_OK;
}
- virtual Result createShaderObject(ShaderObjectLayout* layout, ShaderObject** outObject) override
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createShaderObject(ShaderObjectLayout* layout, ShaderObject** outObject) override
{
RefPtr<CUDAShaderObject> result = new CUDAShaderObject();
SLANG_RETURN_ON_FAIL(result->init(this, dynamic_cast<CUDAShaderObjectLayout*>(layout)));
@@ -1159,7 +1171,8 @@ private:
return SLANG_OK;
}
- virtual Result createRootShaderObject(ShaderObjectLayout* layout, ShaderObject** outObject) override
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createRootShaderObject(ShaderObjectLayout* layout, ShaderObject** outObject) override
{
RefPtr<CUDARootShaderObject> result = new CUDARootShaderObject();
SLANG_RETURN_ON_FAIL(result->init(this, dynamic_cast<CUDAShaderObjectLayout*>(layout)));
@@ -1167,7 +1180,8 @@ private:
return SLANG_OK;
}
- virtual Result bindRootShaderObject(PipelineType pipelineType, ShaderObject* object) override
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ bindRootShaderObject(PipelineType pipelineType, ShaderObject* object) override
{
currentRootObject = dynamic_cast<CUDARootShaderObject*>(object);
if (currentRootObject)
@@ -1175,7 +1189,8 @@ private:
return SLANG_E_INVALID_ARG;
}
- virtual Result createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) override
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) override
{
if (desc.kernelCount != 1)
return SLANG_E_INVALID_ARG;
@@ -1188,7 +1203,8 @@ private:
return SLANG_OK;
}
- virtual Result createComputePipelineState(const ComputePipelineStateDesc& desc, PipelineState** outState) override
+ virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState(
+ const ComputePipelineStateDesc& desc, PipelineState** outState) override
{
RefPtr<CUDAPipelineState> state = new CUDAPipelineState();
state->shaderProgram = dynamic_cast<CUDAShaderProgram*>(desc.program);
@@ -1196,23 +1212,24 @@ private:
return Result();
}
- virtual void* map(BufferResource* buffer, MapFlavor flavor) override
+ virtual SLANG_NO_THROW void* SLANG_MCALL map(BufferResource* buffer, MapFlavor flavor) override
{
return dynamic_cast<MemoryCUDAResource*>(buffer)->m_cudaMemory;
}
- virtual void unmap(BufferResource* buffer) override
+ virtual SLANG_NO_THROW void SLANG_MCALL unmap(BufferResource* buffer) override
{
SLANG_UNUSED(buffer);
}
- virtual void setPipelineState(PipelineType pipelineType, PipelineState* state) override
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setPipelineState(PipelineType pipelineType, PipelineState* state) override
{
SLANG_ASSERT(pipelineType == PipelineType::Compute);
currentPipeline = dynamic_cast<CUDAPipelineState*>(state);
}
- virtual void dispatchCompute(int x, int y, int z) override
+ virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override
{
// Find out thread group size from program reflection.
auto& kernelName = currentPipeline->shaderProgram->kernelName;
@@ -1240,7 +1257,7 @@ private:
CUdeviceptr globalParamsCUDAData =
currentRootObject->bufferResource
- ? currentRootObject->bufferResource->getBindlessHandle()
+ ? (CUdeviceptr)currentRootObject->bufferResource->getBindlessHandle()
: 0;
cudaMemcpyAsync(
(void*)globalParamsSymbol,
@@ -1283,42 +1300,46 @@ private:
SLANG_ASSERT(cudaLaunchResult == CUDA_SUCCESS);
}
- virtual void submitGpuWork() override {}
+ virtual SLANG_NO_THROW void SLANG_MCALL submitGpuWork() override {}
- virtual void waitForGpu() override
+ virtual SLANG_NO_THROW void SLANG_MCALL waitForGpu() override
{
auto result = cudaDeviceSynchronize();
SLANG_ASSERT(result == CUDA_SUCCESS);
}
- virtual RendererType getRendererType() const override { return RendererType::CUDA; }
+ virtual SLANG_NO_THROW RendererType SLANG_MCALL getRendererType() const override
+ {
+ return RendererType::CUDA;
+ }
public:
// Unused public interfaces. These functions are not supported on CUDA.
- virtual const Slang::List<Slang::String>& getFeatures() override
+ virtual SLANG_NO_THROW const Slang::List<Slang::String>& SLANG_MCALL getFeatures() override
{
static Slang::List<Slang::String> featureSet;
return featureSet;
}
- virtual void setClearColor(const float color[4]) override
+ virtual SLANG_NO_THROW void SLANG_MCALL setClearColor(const float color[4]) override
{
SLANG_UNUSED(color);
}
- virtual void clearFrame() override {}
- virtual void presentFrame() override {}
- virtual TextureResource::Desc getSwapChainTextureDesc() override
+ virtual SLANG_NO_THROW void SLANG_MCALL clearFrame() override {}
+ virtual SLANG_NO_THROW void SLANG_MCALL presentFrame() override {}
+ virtual SLANG_NO_THROW TextureResource::Desc SLANG_MCALL getSwapChainTextureDesc() override
{
return TextureResource::Desc();
}
- virtual Result createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) override
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) override
{
SLANG_UNUSED(desc);
*outSampler = nullptr;
return SLANG_OK;
}
- virtual Result createInputLayout(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createInputLayout(
const InputElementDesc* inputElements,
UInt inputElementCount,
InputLayout** outLayout) override
@@ -1328,41 +1349,46 @@ public:
SLANG_UNUSED(outLayout);
return SLANG_E_NOT_AVAILABLE;
}
- virtual Result createDescriptorSetLayout(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createDescriptorSetLayout(
const DescriptorSetLayout::Desc& desc, DescriptorSetLayout** outLayout) override
{
SLANG_UNUSED(desc);
SLANG_UNUSED(outLayout);
return SLANG_E_NOT_AVAILABLE;
}
- virtual Result createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) override
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) override
{
SLANG_UNUSED(desc);
SLANG_UNUSED(outLayout);
return SLANG_E_NOT_AVAILABLE;
}
- virtual Result createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) override
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) override
{
SLANG_UNUSED(layout);
SLANG_UNUSED(outDescriptorSet);
return SLANG_E_NOT_AVAILABLE;
}
- virtual Result createGraphicsPipelineState(const GraphicsPipelineStateDesc& desc, PipelineState** outState) override
+ virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState(
+ const GraphicsPipelineStateDesc& desc, PipelineState** outState) override
{
SLANG_UNUSED(desc);
SLANG_UNUSED(outState);
return SLANG_E_NOT_AVAILABLE;
}
- virtual SlangResult captureScreenSurface(Surface& surfaceOut) override
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL
+ captureScreenSurface(Surface& surfaceOut) override
{
SLANG_UNUSED(surfaceOut);
return SLANG_E_NOT_AVAILABLE;
}
- virtual void setPrimitiveTopology(PrimitiveTopology topology) override
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setPrimitiveTopology(PrimitiveTopology topology) override
{
SLANG_UNUSED(topology);
}
- virtual void setDescriptorSet(
+ virtual SLANG_NO_THROW void SLANG_MCALL setDescriptorSet(
PipelineType pipelineType,
PipelineLayout* layout,
UInt index,
@@ -1373,7 +1399,7 @@ public:
SLANG_UNUSED(index);
SLANG_UNUSED(descriptorSet);
}
- virtual void setVertexBuffers(
+ virtual SLANG_NO_THROW void SLANG_MCALL setVertexBuffers(
UInt startSlot,
UInt slotCount,
BufferResource* const* buffers,
@@ -1386,32 +1412,37 @@ public:
SLANG_UNUSED(strides);
SLANG_UNUSED(offsets);
}
- virtual void setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset = 0) override
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset = 0) override
{
SLANG_UNUSED(buffer);
SLANG_UNUSED(indexFormat);
SLANG_UNUSED(offset);
}
- virtual void setDepthStencilTarget(ResourceView* depthStencilView) override
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setDepthStencilTarget(ResourceView* depthStencilView) override
{
SLANG_UNUSED(depthStencilView);
}
- virtual void setViewports(UInt count, Viewport const* viewports) override
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setViewports(UInt count, Viewport const* viewports) override
{
SLANG_UNUSED(count);
SLANG_UNUSED(viewports);
}
- virtual void setScissorRects(UInt count, ScissorRect const* rects) override
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setScissorRects(UInt count, ScissorRect const* rects) override
{
SLANG_UNUSED(count);
SLANG_UNUSED(rects);
}
- virtual void draw(UInt vertexCount, UInt startVertex) override
+ virtual SLANG_NO_THROW void SLANG_MCALL draw(UInt vertexCount, UInt startVertex) override
{
SLANG_UNUSED(vertexCount);
SLANG_UNUSED(startVertex);
}
- virtual void drawIndexed(UInt indexCount, UInt startIndex, UInt baseVertex) override
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ drawIndexed(UInt indexCount, UInt startIndex, UInt baseVertex) override
{
SLANG_UNUSED(indexCount);
SLANG_UNUSED(startIndex);
@@ -1419,7 +1450,7 @@ public:
}
};
-SlangResult CUDAShaderObject::init(Renderer* renderer, CUDAShaderObjectLayout* typeLayout)
+SlangResult CUDAShaderObject::init(IRenderer* renderer, CUDAShaderObjectLayout* typeLayout)
{
this->layout = typeLayout;
@@ -1477,7 +1508,7 @@ SlangResult CUDAShaderObject::init(Renderer* renderer, CUDAShaderObjectLayout* t
return SLANG_OK;
}
-SlangResult CUDARootShaderObject::init(Renderer* renderer, CUDAShaderObjectLayout* typeLayout)
+SlangResult CUDARootShaderObject::init(IRenderer* renderer, CUDAShaderObjectLayout* typeLayout)
{
SLANG_RETURN_ON_FAIL(CUDAShaderObject::init(renderer, typeLayout));
auto programLayout = dynamic_cast<CUDAProgramLayout*>(typeLayout);
@@ -1490,9 +1521,18 @@ SlangResult CUDARootShaderObject::init(Renderer* renderer, CUDAShaderObjectLayou
return SLANG_OK;
}
-Renderer* createCUDARenderer() { return new CUDARenderer(); }
+SlangResult createCUDARenderer(IRenderer** outRenderer)
+{
+ *outRenderer = new CUDARenderer();
+ (*outRenderer)->addRef();
+ return SLANG_OK;
+}
#else
-Renderer* createCUDARenderer() { return nullptr; }
+SlangResult createCUDARenderer(IRenderer** outRenderer)
+{
+ *outRenderer = nullptr;
+ return SLANG_OK;
+}
#endif
}
diff --git a/tools/gfx/cuda/render-cuda.h b/tools/gfx/cuda/render-cuda.h
index cf63113c8..3b403287a 100644
--- a/tools/gfx/cuda/render-cuda.h
+++ b/tools/gfx/cuda/render-cuda.h
@@ -1,8 +1,10 @@
#pragma once
+#include <cstdint>
+
namespace gfx
{
-class Renderer;
+class IRenderer;
-Renderer* createCUDARenderer();
+int32_t createCUDARenderer(IRenderer** outRenderer);
}
diff --git a/tools/gfx/d3d11/render-d3d11.cpp b/tools/gfx/d3d11/render-d3d11.cpp
index 5c04eccf1..97d294e5d 100644
--- a/tools/gfx/d3d11/render-d3d11.cpp
+++ b/tools/gfx/d3d11/render-d3d11.cpp
@@ -63,50 +63,93 @@ public:
// Renderer implementation
- virtual SlangResult initialize(const Desc& desc, void* inWindowHandle) override;
- virtual const List<String>& getFeatures() override { return m_features; }
- virtual void setClearColor(const float color[4]) override;
- virtual void clearFrame() override;
- virtual void presentFrame() override;
- TextureResource::Desc getSwapChainTextureDesc() override;
-
- Result createTextureResource(Resource::Usage initialUsage, const TextureResource::Desc& desc, const TextureResource::Data* initData, TextureResource** outResource) override;
- Result createBufferResource(Resource::Usage initialUsage, const BufferResource::Desc& desc, const void* initData, BufferResource** outResource) override;
- Result createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) override;
-
- Result createTextureView(TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) override;
- Result createBufferView(BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) override;
-
- Result createInputLayout(const InputElementDesc* inputElements, UInt inputElementCount, InputLayout** outLayout) override;
-
- Result createDescriptorSetLayout(const DescriptorSetLayout::Desc& desc, DescriptorSetLayout** outLayout) override;
- Result createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) override;
- Result createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) override;
-
- Result createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) override;
- Result createGraphicsPipelineState(const GraphicsPipelineStateDesc& desc, PipelineState** outState) override;
- Result createComputePipelineState(const ComputePipelineStateDesc& desc, PipelineState** outState) override;
-
- virtual SlangResult captureScreenSurface(Surface& surfaceOut) override;
-
- virtual void* map(BufferResource* buffer, MapFlavor flavor) override;
- virtual void unmap(BufferResource* buffer) override;
- virtual void setPrimitiveTopology(PrimitiveTopology topology) override;
-
- virtual void setDescriptorSet(PipelineType pipelineType, PipelineLayout* layout, UInt index, DescriptorSet* descriptorSet) override;
-
- virtual void setVertexBuffers(UInt startSlot, UInt slotCount, BufferResource*const* buffers, const UInt* strides, const UInt* offsets) override;
- virtual void setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset) override;
- virtual void setDepthStencilTarget(ResourceView* depthStencilView) override;
- void setViewports(UInt count, Viewport const* viewports) override;
- void setScissorRects(UInt count, ScissorRect const* rects) override;
- virtual void setPipelineState(PipelineType pipelineType, PipelineState* state) override;
- virtual void draw(UInt vertexCount, UInt startVertex) override;
- virtual void drawIndexed(UInt indexCount, UInt startIndex, UInt baseVertex) override;
- virtual void dispatchCompute(int x, int y, int z) override;
- virtual void submitGpuWork() override {}
- virtual void waitForGpu() override {}
- virtual RendererType getRendererType() const override { return RendererType::DirectX11; }
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL initialize(const Desc& desc, void* inWindowHandle) override;
+ virtual SLANG_NO_THROW const List<String>& SLANG_MCALL getFeatures() override
+ {
+ return m_features;
+ }
+ virtual SLANG_NO_THROW void SLANG_MCALL setClearColor(const float color[4]) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL clearFrame() override;
+ virtual SLANG_NO_THROW void SLANG_MCALL presentFrame() override;
+ virtual SLANG_NO_THROW TextureResource::Desc SLANG_MCALL getSwapChainTextureDesc() override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
+ Resource::Usage initialUsage,
+ const TextureResource::Desc& desc,
+ const TextureResource::Data* initData,
+ TextureResource** outResource) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
+ Resource::Usage initialUsage,
+ const BufferResource::Desc& desc,
+ const void* initData,
+ BufferResource** outResource) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView(
+ TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView(
+ BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createInputLayout(
+ const InputElementDesc* inputElements,
+ UInt inputElementCount,
+ InputLayout** outLayout) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createDescriptorSetLayout(
+ const DescriptorSetLayout::Desc& desc, DescriptorSetLayout** outLayout) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState(
+ const GraphicsPipelineStateDesc& desc, PipelineState** outState) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState(
+ const ComputePipelineStateDesc& desc, PipelineState** outState) override;
+
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL
+ captureScreenSurface(Surface& surfaceOut) override;
+
+ virtual SLANG_NO_THROW void* SLANG_MCALL map(BufferResource* buffer, MapFlavor flavor) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL unmap(BufferResource* buffer) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setPrimitiveTopology(PrimitiveTopology topology) override;
+
+ virtual SLANG_NO_THROW void SLANG_MCALL setDescriptorSet(
+ PipelineType pipelineType,
+ PipelineLayout* layout,
+ UInt index,
+ DescriptorSet* descriptorSet) override;
+
+ virtual SLANG_NO_THROW void SLANG_MCALL setVertexBuffers(
+ UInt startSlot,
+ UInt slotCount,
+ BufferResource* const* buffers,
+ const UInt* strides,
+ const UInt* offsets) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setDepthStencilTarget(ResourceView* depthStencilView) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setViewports(UInt count, Viewport const* viewports) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setScissorRects(UInt count, ScissorRect const* rects) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setPipelineState(PipelineType pipelineType, PipelineState* state) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL draw(UInt vertexCount, UInt startVertex) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ drawIndexed(UInt indexCount, UInt startIndex, UInt baseVertex) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL submitGpuWork() override {}
+ virtual SLANG_NO_THROW void SLANG_MCALL waitForGpu() override {}
+ virtual SLANG_NO_THROW RendererType SLANG_MCALL getRendererType() const override
+ {
+ return RendererType::DirectX11;
+ }
~D3D11Renderer() {}
@@ -417,9 +460,11 @@ public:
bool m_nvapi = false;
};
-Renderer* createD3D11Renderer()
+SlangResult createD3D11Renderer(IRenderer** outRenderer)
{
- return new D3D11Renderer();
+ *outRenderer = new D3D11Renderer();
+ (*outRenderer)->addRef();
+ return SLANG_OK;
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ScopeNVAPI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
diff --git a/tools/gfx/d3d11/render-d3d11.h b/tools/gfx/d3d11/render-d3d11.h
index 9e671d541..63b4818ce 100644
--- a/tools/gfx/d3d11/render-d3d11.h
+++ b/tools/gfx/d3d11/render-d3d11.h
@@ -1,10 +1,12 @@
// render-d3d11.h
#pragma once
+#include <cstdint>
+
namespace gfx {
-class Renderer;
+class IRenderer;
-Renderer* createD3D11Renderer();
+int32_t createD3D11Renderer(IRenderer** outRenderer);
} // gfx
diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp
index 0376ee304..c533fe1fd 100644
--- a/tools/gfx/d3d12/render-d3d12.cpp
+++ b/tools/gfx/d3d12/render-d3d12.cpp
@@ -66,51 +66,93 @@ class D3D12Renderer : public GraphicsAPIRenderer
{
public:
// Renderer implementation
- virtual SlangResult initialize(const Desc& desc, void* inWindowHandle) override;
- virtual const List<String>& getFeatures() override { return m_features; }
- virtual void setClearColor(const float color[4]) override;
- virtual void clearFrame() override;
- virtual void presentFrame() override;
- TextureResource::Desc getSwapChainTextureDesc() override;
-
- Result createTextureResource(Resource::Usage initialUsage, const TextureResource::Desc& desc, const TextureResource::Data* initData, TextureResource** outResource) override;
- Result createBufferResource(Resource::Usage initialUsage, const BufferResource::Desc& desc, const void* initData, BufferResource** outResource) override;
- Result createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) override;
-
- Result createTextureView(TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) override;
- Result createBufferView(BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) override;
-
- Result createInputLayout(const InputElementDesc* inputElements, UInt inputElementCount, InputLayout** outLayout) override;
-
- Result createDescriptorSetLayout(const DescriptorSetLayout::Desc& desc, DescriptorSetLayout** outLayout) override;
- Result createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) override;
- Result createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) override;
-
- Result createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) override;
- Result createGraphicsPipelineState(const GraphicsPipelineStateDesc& desc, PipelineState** outState) override;
- Result createComputePipelineState(const ComputePipelineStateDesc& desc, PipelineState** outState) override;
-
- virtual SlangResult captureScreenSurface(Surface& surfaceOut) override;
-
- virtual void* map(BufferResource* buffer, MapFlavor flavor) override;
- virtual void unmap(BufferResource* buffer) override;
-// virtual void setInputLayout(InputLayout* inputLayout) override;
- virtual void setPrimitiveTopology(PrimitiveTopology topology) override;
-
- virtual void setDescriptorSet(PipelineType pipelineType, PipelineLayout* layout, UInt index, DescriptorSet* descriptorSet) override;
-
- virtual void setVertexBuffers(UInt startSlot, UInt slotCount, BufferResource*const* buffers, const UInt* strides, const UInt* offsets) override;
- virtual void setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset) override;
- virtual void setDepthStencilTarget(ResourceView* depthStencilView) override;
- void setViewports(UInt count, Viewport const* viewports) override;
- void setScissorRects(UInt count, ScissorRect const* rects) override;
- virtual void setPipelineState(PipelineType pipelineType, PipelineState* state) override;
- virtual void draw(UInt vertexCount, UInt startVertex) override;
- virtual void drawIndexed(UInt indexCount, UInt startIndex, UInt baseVertex) override;
- virtual void dispatchCompute(int x, int y, int z) override;
- virtual void submitGpuWork() override;
- virtual void waitForGpu() override;
- virtual RendererType getRendererType() const override { return RendererType::DirectX12; }
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL initialize(const Desc& desc, void* inWindowHandle) override;
+ virtual SLANG_NO_THROW const List<String>& SLANG_MCALL getFeatures() override
+ {
+ return m_features;
+ }
+ virtual SLANG_NO_THROW void SLANG_MCALL setClearColor(const float color[4]) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL clearFrame() override;
+ virtual SLANG_NO_THROW void SLANG_MCALL presentFrame() override;
+ virtual SLANG_NO_THROW TextureResource::Desc SLANG_MCALL getSwapChainTextureDesc() override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
+ Resource::Usage initialUsage,
+ const TextureResource::Desc& desc,
+ const TextureResource::Data* initData,
+ TextureResource** outResource) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
+ Resource::Usage initialUsage,
+ const BufferResource::Desc& desc,
+ const void* initData,
+ BufferResource** outResource) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView(
+ TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView(
+ BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createInputLayout(
+ const InputElementDesc* inputElements,
+ UInt inputElementCount,
+ InputLayout** outLayout) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createDescriptorSetLayout(
+ const DescriptorSetLayout::Desc& desc, DescriptorSetLayout** outLayout) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState(
+ const GraphicsPipelineStateDesc& desc, PipelineState** outState) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState(
+ const ComputePipelineStateDesc& desc, PipelineState** outState) override;
+
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL
+ captureScreenSurface(Surface& surfaceOut) override;
+
+ virtual SLANG_NO_THROW void* SLANG_MCALL map(BufferResource* buffer, MapFlavor flavor) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL unmap(BufferResource* buffer) override;
+ // virtual void setInputLayout(InputLayout* inputLayout) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setPrimitiveTopology(PrimitiveTopology topology) override;
+
+ virtual SLANG_NO_THROW void SLANG_MCALL setDescriptorSet(
+ PipelineType pipelineType,
+ PipelineLayout* layout,
+ UInt index,
+ DescriptorSet* descriptorSet) override;
+
+ virtual SLANG_NO_THROW void SLANG_MCALL setVertexBuffers(
+ UInt startSlot,
+ UInt slotCount,
+ BufferResource* const* buffers,
+ const UInt* strides,
+ const UInt* offsets) override;
+ virtual SLANG_NO_THROW void
+ SLANG_MCALL setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset) override;
+ virtual void SLANG_MCALL setDepthStencilTarget(ResourceView* depthStencilView) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setViewports(UInt count, Viewport const* viewports) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setScissorRects(UInt count, ScissorRect const* rects) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setPipelineState(PipelineType pipelineType, PipelineState* state) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL draw(UInt vertexCount, UInt startVertex) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ drawIndexed(UInt indexCount, UInt startIndex, UInt baseVertex) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL submitGpuWork() override;
+ virtual SLANG_NO_THROW void SLANG_MCALL waitForGpu() override;
+ virtual SLANG_NO_THROW RendererType SLANG_MCALL getRendererType() const override
+ {
+ return RendererType::DirectX12;
+ }
~D3D12Renderer();
@@ -706,9 +748,11 @@ protected:
bool m_nvapi = false;
};
-Renderer* createD3D12Renderer()
+SlangResult createD3D12Renderer(IRenderer** outRenderer)
{
- return new D3D12Renderer;
+ *outRenderer = new D3D12Renderer();
+ (*outRenderer)->addRef();
+ return SLANG_OK;
}
/* static */PROC D3D12Renderer::loadProc(HMODULE module, char const* name)
diff --git a/tools/gfx/d3d12/render-d3d12.h b/tools/gfx/d3d12/render-d3d12.h
index b8a3104c0..cdbbc3996 100644
--- a/tools/gfx/d3d12/render-d3d12.h
+++ b/tools/gfx/d3d12/render-d3d12.h
@@ -1,10 +1,12 @@
// render-d3d12.h
#pragma once
+#include <cstdint>
+
namespace gfx {
-class Renderer;
+class IRenderer;
-Renderer* createD3D12Renderer();
+int32_t createD3D12Renderer(IRenderer** outRenderer);
} // gfx
diff --git a/tools/gfx/open-gl/render-gl.cpp b/tools/gfx/open-gl/render-gl.cpp
index 8be8165aa..4874c4c69 100644
--- a/tools/gfx/open-gl/render-gl.cpp
+++ b/tools/gfx/open-gl/render-gl.cpp
@@ -82,50 +82,93 @@ class GLRenderer : public GraphicsAPIRenderer
public:
// Renderer implementation
- virtual SlangResult initialize(const Desc& desc, void* inWindowHandle) override;
- virtual const List<String>& getFeatures() override { return m_features; }
- virtual void setClearColor(const float color[4]) override;
- virtual void clearFrame() override;
- virtual void presentFrame() override;
- TextureResource::Desc getSwapChainTextureDesc() override;
-
- Result createTextureResource(Resource::Usage initialUsage, const TextureResource::Desc& desc, const TextureResource::Data* initData, TextureResource** outResource) override;
- Result createBufferResource(Resource::Usage initialUsage, const BufferResource::Desc& desc, const void* initData, BufferResource** outResource) override;
- Result createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) override;
-
- Result createTextureView(TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) override;
- Result createBufferView(BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) override;
-
- Result createInputLayout(const InputElementDesc* inputElements, UInt inputElementCount, InputLayout** outLayout) override;
-
- Result createDescriptorSetLayout(const DescriptorSetLayout::Desc& desc, DescriptorSetLayout** outLayout) override;
- Result createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) override;
- Result createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) override;
-
- Result createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) override;
- Result createGraphicsPipelineState(const GraphicsPipelineStateDesc& desc, PipelineState** outState) override;
- Result createComputePipelineState(const ComputePipelineStateDesc& desc, PipelineState** outState) override;
-
- virtual SlangResult captureScreenSurface(Surface& surfaceOut) override;
-
- virtual void* map(BufferResource* buffer, MapFlavor flavor) override;
- virtual void unmap(BufferResource* buffer) override;
- virtual void setPrimitiveTopology(PrimitiveTopology topology) override;
-
- virtual void setDescriptorSet(PipelineType pipelineType, PipelineLayout* layout, UInt index, DescriptorSet* descriptorSet) override;
-
- virtual void setVertexBuffers(UInt startSlot, UInt slotCount, BufferResource*const* buffers, const UInt* strides, const UInt* offsets) override;
- virtual void setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset) override;
- virtual void setDepthStencilTarget(ResourceView* depthStencilView) override;
- void setViewports(UInt count, Viewport const* viewports) override;
- void setScissorRects(UInt count, ScissorRect const* rects) override;
- virtual void setPipelineState(PipelineType pipelineType, PipelineState* state) override;
- virtual void draw(UInt vertexCount, UInt startVertex) override;
- virtual void drawIndexed(UInt indexCount, UInt startIndex, UInt baseVertex) override;
- virtual void dispatchCompute(int x, int y, int z) override;
- virtual void submitGpuWork() override {}
- virtual void waitForGpu() override {}
- virtual RendererType getRendererType() const override { return RendererType::OpenGl; }
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL initialize(const Desc& desc, void* inWindowHandle) override;
+ virtual SLANG_NO_THROW const List<String>& SLANG_MCALL getFeatures() override
+ {
+ return m_features;
+ }
+ virtual SLANG_NO_THROW void SLANG_MCALL setClearColor(const float color[4]) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL clearFrame() override;
+ virtual SLANG_NO_THROW void SLANG_MCALL presentFrame() override;
+ virtual SLANG_NO_THROW TextureResource::Desc SLANG_MCALL getSwapChainTextureDesc() override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
+ Resource::Usage initialUsage,
+ const TextureResource::Desc& desc,
+ const TextureResource::Data* initData,
+ TextureResource** outResource) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
+ Resource::Usage initialUsage,
+ const BufferResource::Desc& desc,
+ const void* initData,
+ BufferResource** outResource) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView(
+ TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView(
+ BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createInputLayout(
+ const InputElementDesc* inputElements,
+ UInt inputElementCount,
+ InputLayout** outLayout) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createDescriptorSetLayout(
+ const DescriptorSetLayout::Desc& desc, DescriptorSetLayout** outLayout) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState(
+ const GraphicsPipelineStateDesc& desc, PipelineState** outState) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState(
+ const ComputePipelineStateDesc& desc, PipelineState** outState) override;
+
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL
+ captureScreenSurface(Surface& surfaceOut) override;
+
+ virtual SLANG_NO_THROW void* SLANG_MCALL map(BufferResource* buffer, MapFlavor flavor) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL unmap(BufferResource* buffer) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setPrimitiveTopology(PrimitiveTopology topology) override;
+
+ virtual SLANG_NO_THROW void SLANG_MCALL setDescriptorSet(
+ PipelineType pipelineType,
+ PipelineLayout* layout,
+ UInt index,
+ DescriptorSet* descriptorSet) override;
+
+ virtual SLANG_NO_THROW void SLANG_MCALL setVertexBuffers(
+ UInt startSlot,
+ UInt slotCount,
+ BufferResource* const* buffers,
+ const UInt* strides,
+ const UInt* offsets) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setDepthStencilTarget(ResourceView* depthStencilView) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setViewports(UInt count, Viewport const* viewports) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setScissorRects(UInt count, ScissorRect const* rects) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setPipelineState(PipelineType pipelineType, PipelineState* state) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL draw(UInt vertexCount, UInt startVertex) override;
+ virtual void SLANG_MCALL
+ drawIndexed(UInt indexCount, UInt startIndex, UInt baseVertex) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL submitGpuWork() override {}
+ virtual SLANG_NO_THROW void SLANG_MCALL waitForGpu() override {}
+ virtual SLANG_NO_THROW RendererType SLANG_MCALL getRendererType() const override
+ {
+ return RendererType::OpenGl;
+ }
GLRenderer();
~GLRenderer();
@@ -395,9 +438,11 @@ public:
SLANG_COMPILE_TIME_ASSERT(SLANG_COUNT_OF(s_pixelFormatInfos) == int(GlPixelFormat::CountOf));
}
-Renderer* createGLRenderer()
+SlangResult createGLRenderer(IRenderer** outRenderer)
{
- return new GLRenderer();
+ *outRenderer = new GLRenderer();
+ (*outRenderer)->addRef();
+ return SLANG_OK;
}
void GLRenderer::debugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message)
diff --git a/tools/gfx/open-gl/render-gl.h b/tools/gfx/open-gl/render-gl.h
index 055031d38..04a6eaa9f 100644
--- a/tools/gfx/open-gl/render-gl.h
+++ b/tools/gfx/open-gl/render-gl.h
@@ -1,10 +1,12 @@
// render-d3d11.h
#pragma once
+#include <cstdint>
+
namespace gfx {
-class Renderer;
+class IRenderer;
-Renderer* createGLRenderer();
+int32_t createGLRenderer(IRenderer** outRenderer);
} // gfx
diff --git a/tools/gfx/render-graphics-common.cpp b/tools/gfx/render-graphics-common.cpp
index d3d469fc2..beaa6a55c 100644
--- a/tools/gfx/render-graphics-common.cpp
+++ b/tools/gfx/render-graphics-common.cpp
@@ -4,6 +4,9 @@ using namespace Slang;
namespace gfx
{
+static const Slang::Guid IID_ISlangUnknown = SLANG_UUID_ISlangUnknown;
+static const Slang::Guid IID_IRenderer = SLANG_UUID_IRenderer;
+
gfx::StageType translateStage(SlangStage slangStage)
{
switch (slangStage)
@@ -65,7 +68,7 @@ public:
struct Builder
{
public:
- Builder(Renderer* renderer)
+ Builder(IRenderer* renderer)
: m_renderer(renderer)
{}
@@ -339,12 +342,12 @@ public:
return SLANG_OK;
}
- Renderer* m_renderer = nullptr;
+ IRenderer* m_renderer = nullptr;
slang::TypeLayoutReflection* m_elementTypeLayout = nullptr;
};
static Result createForElementType(
- Renderer* renderer,
+ IRenderer* renderer,
slang::TypeLayoutReflection* elementType,
GraphicsCommonShaderObjectLayout** outLayout)
{
@@ -371,7 +374,7 @@ public:
SubObjectRangeInfo const& getSubObjectRange(Index index) { return m_subObjectRanges[index]; }
List<SubObjectRangeInfo> const& getSubObjectRanges() { return m_subObjectRanges; }
- Renderer* getRenderer() { return m_renderer; }
+ IRenderer* getRenderer() { return m_renderer; }
protected:
Result _init(Builder const* builder)
@@ -410,7 +413,7 @@ protected:
return SLANG_OK;
}
- Renderer* m_renderer;
+ IRenderer* m_renderer;
List<RefPtr<DescriptorSetInfo>> m_descriptorSets;
List<BindingRangeInfo> m_bindingRanges;
slang::TypeLayoutReflection* m_elementTypeLayout;
@@ -434,7 +437,7 @@ public:
struct Builder : Super::Builder
{
- Builder(Renderer* renderer)
+ Builder(IRenderer* renderer)
: Super::Builder(renderer)
{}
@@ -539,7 +542,7 @@ public:
struct Builder : Super::Builder
{
- Builder(Renderer* renderer)
+ Builder(IRenderer* renderer)
: Super::Builder(renderer)
{}
@@ -670,7 +673,7 @@ class GraphicsCommonShaderObject : public ShaderObject
{
public:
static Result create(
- Renderer* renderer,
+ IRenderer* renderer,
GraphicsCommonShaderObjectLayout* layout,
GraphicsCommonShaderObject** outShaderObject)
{
@@ -681,7 +684,7 @@ public:
return SLANG_OK;
}
- Renderer* getRenderer() { return m_layout->getRenderer(); }
+ IRenderer* getRenderer() { return m_layout->getRenderer(); }
Index getEntryPointCount() { return 0; }
@@ -693,7 +696,7 @@ public:
SlangResult setData(ShaderOffset const& offset, void const* data, size_t size)
{
- Renderer* renderer = getRenderer();
+ IRenderer* renderer = getRenderer();
char* dest = (char*)renderer->map(m_buffer, MapFlavor::HostWrite);
memcpy(dest + offset.uniformOffset, data, size);
@@ -807,7 +810,7 @@ public:
protected:
friend class ProgramVars;
- Result init(Renderer* renderer, GraphicsCommonShaderObjectLayout* layout)
+ Result init(IRenderer* renderer, GraphicsCommonShaderObjectLayout* layout)
{
m_layout = layout;
@@ -883,7 +886,7 @@ protected:
}
Result apply(
- Renderer* renderer,
+ IRenderer* renderer,
PipelineType pipelineType,
PipelineLayout* pipelineLayout,
Index& ioRootIndex)
@@ -1093,7 +1096,7 @@ class EntryPointVars : public GraphicsCommonShaderObject
public:
static Result
- create(Renderer* renderer, EntryPointLayout* layout, EntryPointVars** outShaderObject)
+ create(IRenderer* renderer, EntryPointLayout* layout, EntryPointVars** outShaderObject)
{
RefPtr<EntryPointVars> object = new EntryPointVars();
SLANG_RETURN_ON_FAIL(object->init(renderer, layout));
@@ -1105,7 +1108,7 @@ public:
EntryPointLayout* getLayout() { return static_cast<EntryPointLayout*>(m_layout.Ptr()); }
protected:
- Result init(Renderer* renderer, EntryPointLayout* layout)
+ Result init(IRenderer* renderer, EntryPointLayout* layout)
{
SLANG_RETURN_ON_FAIL(Super::init(renderer, layout));
return SLANG_OK;
@@ -1117,7 +1120,7 @@ class ProgramVars : public GraphicsCommonShaderObject
typedef GraphicsCommonShaderObject Super;
public:
- static Result create(Renderer* renderer, GraphicsCommonProgramLayout* layout, ProgramVars** outShaderObject)
+ static Result create(IRenderer* renderer, GraphicsCommonProgramLayout* layout, ProgramVars** outShaderObject)
{
RefPtr<ProgramVars> object = new ProgramVars();
SLANG_RETURN_ON_FAIL(object->init(renderer, layout));
@@ -1128,7 +1131,7 @@ public:
GraphicsCommonProgramLayout* getLayout() { return static_cast<GraphicsCommonProgramLayout*>(m_layout.Ptr()); }
- void apply(Renderer* renderer, PipelineType pipelineType)
+ void apply(IRenderer* renderer, PipelineType pipelineType)
{
auto pipelineLayout = getLayout()->getPipelineLayout();
@@ -1177,7 +1180,7 @@ protected:
return SLANG_OK;
}
- Result init(Renderer* renderer, GraphicsCommonProgramLayout* layout)
+ Result init(IRenderer* renderer, GraphicsCommonProgramLayout* layout)
{
SLANG_RETURN_ON_FAIL(Super::init(renderer, layout));
@@ -1286,4 +1289,11 @@ void GraphicsAPIRenderer::preparePipelineDesc(ComputePipelineStateDesc& desc)
}
}
+IRenderer* gfx::GraphicsAPIRenderer::getInterface(const Guid& guid)
+{
+ return (guid == IID_ISlangUnknown || guid == IID_IRenderer)
+ ? static_cast<IRenderer*>(this)
+ : nullptr;
+}
+
}
diff --git a/tools/gfx/render-graphics-common.h b/tools/gfx/render-graphics-common.h
index 5bb4cb59e..af2677905 100644
--- a/tools/gfx/render-graphics-common.h
+++ b/tools/gfx/render-graphics-common.h
@@ -5,18 +5,20 @@
namespace gfx
{
-class GraphicsAPIRenderer : public Renderer
+class GraphicsAPIRenderer : public IRenderer, public Slang::RefObject
{
public:
- virtual Result createShaderObjectLayout(
+ SLANG_REF_OBJECT_IUNKNOWN_ALL
+ virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObjectLayout(
slang::TypeLayoutReflection* typeLayout, ShaderObjectLayout** outLayout) SLANG_OVERRIDE;
- virtual Result createRootShaderObjectLayout(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createRootShaderObjectLayout(
slang::ProgramLayout* programLayout, ShaderObjectLayout** outLayout) SLANG_OVERRIDE;
- virtual Result createShaderObject(ShaderObjectLayout* layout, ShaderObject** outObject) SLANG_OVERRIDE;
- virtual Result createRootShaderObject(ShaderObjectLayout* rootLayout, ShaderObject** outObject) SLANG_OVERRIDE;
- virtual Result bindRootShaderObject(PipelineType pipelineType, ShaderObject* object) SLANG_OVERRIDE;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObject(ShaderObjectLayout* layout, ShaderObject** outObject) SLANG_OVERRIDE;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createRootShaderObject(ShaderObjectLayout* rootLayout, ShaderObject** outObject) SLANG_OVERRIDE;
+ virtual SLANG_NO_THROW Result SLANG_MCALL bindRootShaderObject(PipelineType pipelineType, ShaderObject* object) SLANG_OVERRIDE;
void preparePipelineDesc(GraphicsPipelineStateDesc& desc);
void preparePipelineDesc(ComputePipelineStateDesc& desc);
+ IRenderer* getInterface(const Slang::Guid& guid);
};
}
diff --git a/tools/gfx/render.h b/tools/gfx/render.h
index ab9af8afb..bcba27dc5 100644
--- a/tools/gfx/render.h
+++ b/tools/gfx/render.h
@@ -852,7 +852,7 @@ struct Viewport
float maxZ = 1.0f;
};
-class Renderer: public Slang::RefObject
+class IRenderer: public ISlangUnknown
{
public:
@@ -866,23 +866,30 @@ public:
};
// Will return with SLANG_E_NOT_AVAILABLE if NVAPI can't be initialized and nvapiExtnSlot >= 0
- virtual SlangResult initialize(const Desc& desc, void* inWindowHandle) = 0;
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL initialize(const Desc& desc, void* inWindowHandle) = 0;
bool hasFeature(const Slang::UnownedStringSlice& feature) { return getFeatures().indexOf(Slang::String(feature)) != Slang::Index(-1); }
- virtual const Slang::List<Slang::String>& getFeatures() = 0;
+ virtual SLANG_NO_THROW const Slang::List<Slang::String>& SLANG_MCALL getFeatures() = 0;
- virtual void setClearColor(const float color[4]) = 0;
- virtual void clearFrame() = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL setClearColor(const float color[4]) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL clearFrame() = 0;
- virtual void presentFrame() = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL presentFrame() = 0;
- virtual TextureResource::Desc getSwapChainTextureDesc() = 0;
+ virtual SLANG_NO_THROW TextureResource::Desc SLANG_MCALL getSwapChainTextureDesc() = 0;
/// Create a texture resource. initData holds the initialize data to set the contents of the texture when constructed.
- virtual Result createTextureResource(Resource::Usage initialUsage, const TextureResource::Desc& desc, const TextureResource::Data* initData, TextureResource** outResource) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
+ Resource::Usage initialUsage,
+ const TextureResource::Desc& desc,
+ const TextureResource::Data* initData,
+ TextureResource** outResource) = 0;
/// Create a texture resource. initData holds the initialize data to set the contents of the texture when constructed.
- inline RefPtr<TextureResource> createTextureResource(Resource::Usage initialUsage, const TextureResource::Desc& desc, const TextureResource::Data* initData = nullptr)
+ inline SLANG_NO_THROW RefPtr<TextureResource> SLANG_MCALL createTextureResource(
+ Resource::Usage initialUsage,
+ const TextureResource::Desc& desc,
+ const TextureResource::Data* initData = nullptr)
{
RefPtr<TextureResource> resource;
SLANG_RETURN_NULL_ON_FAIL(createTextureResource(initialUsage, desc, initData, resource.writeRef()));
@@ -890,16 +897,23 @@ public:
}
/// Create a buffer resource
- virtual Result createBufferResource(Resource::Usage initialUsage, const BufferResource::Desc& desc, const void* initData, BufferResource** outResource) = 0;
-
- inline RefPtr<BufferResource> createBufferResource(Resource::Usage initialUsage, const BufferResource::Desc& desc, const void* initData = nullptr)
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
+ Resource::Usage initialUsage,
+ const BufferResource::Desc& desc,
+ const void* initData,
+ BufferResource** outResource) = 0;
+
+ inline SLANG_NO_THROW RefPtr<BufferResource> SLANG_MCALL createBufferResource(
+ Resource::Usage initialUsage,
+ const BufferResource::Desc& desc,
+ const void* initData = nullptr)
{
RefPtr<BufferResource> resource;
SLANG_RETURN_NULL_ON_FAIL(createBufferResource(initialUsage, desc, initData, resource.writeRef()));
return resource;
}
- virtual Result createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) = 0;
inline RefPtr<SamplerState> createSamplerState(SamplerState::Desc const& desc)
{
@@ -908,7 +922,8 @@ public:
return sampler;
}
- virtual Result createTextureView(TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView(
+ TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) = 0;
inline RefPtr<ResourceView> createTextureView(TextureResource* texture, ResourceView::Desc const& desc)
{
@@ -917,7 +932,8 @@ public:
return view;
}
- virtual Result createBufferView(BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView(
+ BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) = 0;
inline RefPtr<ResourceView> createBufferView(BufferResource* buffer, ResourceView::Desc const& desc)
{
@@ -926,7 +942,8 @@ public:
return view;
}
- virtual Result createInputLayout(const InputElementDesc* inputElements, UInt inputElementCount, InputLayout** outLayout) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createInputLayout(
+ const InputElementDesc* inputElements, UInt inputElementCount, InputLayout** outLayout) = 0;
inline RefPtr<InputLayout> createInputLayout(const InputElementDesc* inputElements, UInt inputElementCount)
{
@@ -935,7 +952,8 @@ public:
return layout;
}
- virtual Result createDescriptorSetLayout(const DescriptorSetLayout::Desc& desc, DescriptorSetLayout** outLayout) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createDescriptorSetLayout(
+ const DescriptorSetLayout::Desc& desc, DescriptorSetLayout** outLayout) = 0;
inline RefPtr<DescriptorSetLayout> createDescriptorSetLayout(const DescriptorSetLayout::Desc& desc)
{
@@ -944,7 +962,7 @@ public:
return layout;
}
- virtual Result createShaderObjectLayout(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObjectLayout(
slang::TypeLayoutReflection* typeLayout, ShaderObjectLayout** outLayout) = 0;
inline RefPtr<ShaderObjectLayout> createShaderObjectLayout(slang::TypeLayoutReflection* typeLayout)
@@ -954,7 +972,7 @@ public:
return layout;
}
- virtual Result createRootShaderObjectLayout(slang::ProgramLayout* layout, ShaderObjectLayout** outLayout) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createRootShaderObjectLayout(slang::ProgramLayout* layout, ShaderObjectLayout** outLayout) = 0;
inline RefPtr<ShaderObjectLayout> createRootShaderObjectLayout(slang::ProgramLayout* layout)
{
@@ -963,7 +981,7 @@ public:
return result;
}
- virtual Result createShaderObject(ShaderObjectLayout* layout, ShaderObject** outObject) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObject(ShaderObjectLayout* layout, ShaderObject** outObject) = 0;
inline RefPtr<ShaderObject> createShaderObject(ShaderObjectLayout* layout)
{
@@ -972,7 +990,7 @@ public:
return object;
}
- virtual Result createRootShaderObject(ShaderObjectLayout* layout, ShaderObject** outObject) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createRootShaderObject(ShaderObjectLayout* layout, ShaderObject** outObject) = 0;
inline RefPtr<ShaderObject> createRootShaderObject(ShaderObjectLayout* layout)
{
@@ -981,9 +999,9 @@ public:
return object;
}
- virtual Result bindRootShaderObject(PipelineType pipelineType, ShaderObject* object) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL bindRootShaderObject(PipelineType pipelineType, ShaderObject* object) = 0;
- virtual Result createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) = 0;
inline RefPtr<PipelineLayout> createPipelineLayout(const PipelineLayout::Desc& desc)
{
@@ -992,7 +1010,7 @@ public:
return layout;
}
- virtual Result createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) = 0;
inline RefPtr<DescriptorSet> createDescriptorSet(DescriptorSetLayout* layout)
{
@@ -1001,7 +1019,7 @@ public:
return descriptorSet;
}
- virtual Result createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) = 0;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) = 0;
inline RefPtr<ShaderProgram> createProgram(const ShaderProgram::Desc& desc)
{
@@ -1010,7 +1028,7 @@ public:
return program;
}
- virtual Result createGraphicsPipelineState(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState(
const GraphicsPipelineStateDesc& desc,
PipelineState** outState) = 0;
@@ -1022,7 +1040,7 @@ public:
return state;
}
- virtual Result createComputePipelineState(
+ virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState(
const ComputePipelineStateDesc& desc,
PipelineState** outState) = 0;
@@ -1035,53 +1053,67 @@ public:
}
/// Captures the back buffer and stores the result in surfaceOut. If the surface contains data - it will either be overwritten (if same size and format), or freed and a re-allocated.
- virtual SlangResult captureScreenSurface(Surface& surfaceOut) = 0;
-
- virtual void* map(BufferResource* buffer, MapFlavor flavor) = 0;
- virtual void unmap(BufferResource* buffer) = 0;
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL captureScreenSurface(Surface& surfaceOut) = 0;
- virtual void setPrimitiveTopology(PrimitiveTopology topology) = 0;
+ virtual SLANG_NO_THROW void* SLANG_MCALL map(BufferResource* buffer, MapFlavor flavor) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL unmap(BufferResource* buffer) = 0;
- virtual void setDescriptorSet(PipelineType pipelineType, PipelineLayout* layout, UInt index, DescriptorSet* descriptorSet) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL setPrimitiveTopology(PrimitiveTopology topology) = 0;
- virtual void setVertexBuffers(UInt startSlot, UInt slotCount, BufferResource*const* buffers, const UInt* strides, const UInt* offsets) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL setDescriptorSet(
+ PipelineType pipelineType,
+ PipelineLayout* layout,
+ UInt index,
+ DescriptorSet* descriptorSet) = 0;
+
+ virtual SLANG_NO_THROW void SLANG_MCALL setVertexBuffers(
+ UInt startSlot,
+ UInt slotCount,
+ BufferResource* const* buffers,
+ const UInt* strides,
+ const UInt* offsets) = 0;
inline void setVertexBuffer(UInt slot, BufferResource* buffer, UInt stride, UInt offset = 0);
- virtual void setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset = 0) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset = 0) = 0;
- virtual void setDepthStencilTarget(ResourceView* depthStencilView) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL setDepthStencilTarget(ResourceView* depthStencilView) = 0;
- virtual void setViewports(UInt count, Viewport const* viewports) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL setViewports(UInt count, Viewport const* viewports) = 0;
inline void setViewport(Viewport const& viewport)
{
setViewports(1, &viewport);
}
- virtual void setScissorRects(UInt count, ScissorRect const* rects) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL setScissorRects(UInt count, ScissorRect const* rects) = 0;
inline void setScissorRect(ScissorRect const& rect)
{
setScissorRects(1, &rect);
}
- virtual void setPipelineState(PipelineType pipelineType, PipelineState* state) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL setPipelineState(PipelineType pipelineType, PipelineState* state) = 0;
- virtual void draw(UInt vertexCount, UInt startVertex = 0) = 0;
- virtual void drawIndexed(UInt indexCount, UInt startIndex = 0, UInt baseVertex = 0) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL draw(UInt vertexCount, UInt startVertex = 0) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL drawIndexed(UInt indexCount, UInt startIndex = 0, UInt baseVertex = 0) = 0;
- virtual void dispatchCompute(int x, int y, int z) = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) = 0;
/// Commit any buffered state changes or draw calls.
/// presentFrame will commitAll implicitly before doing a present
- virtual void submitGpuWork() = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL submitGpuWork() = 0;
/// Blocks until Gpu work is complete
- virtual void waitForGpu() = 0;
+ virtual SLANG_NO_THROW void SLANG_MCALL waitForGpu() = 0;
/// Get the type of this renderer
- virtual RendererType getRendererType() const = 0;
+ virtual SLANG_NO_THROW RendererType SLANG_MCALL getRendererType() const = 0;
};
+#define SLANG_UUID_IRenderer \
+ { \
+ 0x715bdf26, 0x5135, 0x11eb, { 0xAE, 0x93, 0x02, 0x42, 0xAC, 0x13, 0x00, 0x02 } \
+ }
+
// ----------------------------------------------------------------------------------------
-inline void Renderer::setVertexBuffer(UInt slot, BufferResource* buffer, UInt stride, UInt offset)
+inline void IRenderer::setVertexBuffer(UInt slot, BufferResource* buffer, UInt stride, UInt offset)
{
setVertexBuffers(slot, 1, &buffer, &stride, &offset);
}
@@ -1089,7 +1121,7 @@ inline void Renderer::setVertexBuffer(UInt slot, BufferResource* buffer, UInt st
/// Functions that are around Renderer and it's types
struct RendererUtil
{
- typedef Renderer* (*CreateFunc)();
+ typedef SlangResult (*CreateFunc)(IRenderer** outRenderer);
/// Gets the size in bytes of a Format type. Returns 0 if a size is not defined/invalid
SLANG_FORCE_INLINE static size_t getFormatSize(Format format) { return s_formatSize[int(format)]; }
diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp
index 80393904c..3cd10902b 100644
--- a/tools/gfx/vulkan/render-vk.cpp
+++ b/tools/gfx/vulkan/render-vk.cpp
@@ -42,50 +42,95 @@ public:
};
// Renderer implementation
- virtual SlangResult initialize(const Desc& desc, void* inWindowHandle) override;
- virtual const List<String>& getFeatures() override { return m_features; }
- virtual void setClearColor(const float color[4]) override;
- virtual void clearFrame() override;
- virtual void presentFrame() override;
- TextureResource::Desc getSwapChainTextureDesc() override;
-
- Result createTextureResource(Resource::Usage initialUsage, const TextureResource::Desc& desc, const TextureResource::Data* initData, TextureResource** outResource) override;
- Result createBufferResource(Resource::Usage initialUsage, const BufferResource::Desc& desc, const void* initData, BufferResource** outResource) override;
- Result createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) override;
-
- Result createTextureView(TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) override;
- Result createBufferView(BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) override;
-
- Result createInputLayout(const InputElementDesc* inputElements, UInt inputElementCount, InputLayout** outLayout) override;
-
- Result createDescriptorSetLayout(const DescriptorSetLayout::Desc& desc, DescriptorSetLayout** outLayout) override;
- Result createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) override;
- Result createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) override;
-
- Result createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) override;
- Result createGraphicsPipelineState(const GraphicsPipelineStateDesc& desc, PipelineState** outState) override;
- Result createComputePipelineState(const ComputePipelineStateDesc& desc, PipelineState** outState) override;
-
- virtual SlangResult captureScreenSurface(Surface& surface) override;
-
- virtual void* map(BufferResource* buffer, MapFlavor flavor) override;
- virtual void unmap(BufferResource* buffer) override;
- virtual void setPrimitiveTopology(PrimitiveTopology topology) override;
-
- virtual void setDescriptorSet(PipelineType pipelineType, PipelineLayout* layout, UInt index, DescriptorSet* descriptorSet) override;
-
- virtual void setVertexBuffers(UInt startSlot, UInt slotCount, BufferResource*const* buffers, const UInt* strides, const UInt* offsets) override;
- virtual void setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset) override;
- virtual void setDepthStencilTarget(ResourceView* depthStencilView) override;
- void setViewports(UInt count, Viewport const* viewports) override;
- void setScissorRects(UInt count, ScissorRect const* rects) override;
- virtual void setPipelineState(PipelineType pipelineType, PipelineState* state) override;
- virtual void draw(UInt vertexCount, UInt startVertex) override;
- virtual void drawIndexed(UInt indexCount, UInt startIndex, UInt baseVertex) override;
- virtual void dispatchCompute(int x, int y, int z) override;
- virtual void submitGpuWork() override;
- virtual void waitForGpu() override;
- virtual RendererType getRendererType() const override { return RendererType::Vulkan; }
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL initialize(const Desc& desc, void* inWindowHandle) override;
+ virtual SLANG_NO_THROW const List<String>& SLANG_MCALL getFeatures() override
+ {
+ return m_features;
+ }
+ virtual SLANG_NO_THROW void SLANG_MCALL setClearColor(const float color[4]) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL clearFrame() override;
+ virtual SLANG_NO_THROW void SLANG_MCALL presentFrame() override;
+ virtual SLANG_NO_THROW TextureResource::Desc SLANG_MCALL getSwapChainTextureDesc() override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
+ Resource::Usage initialUsage,
+ const TextureResource::Desc& desc,
+ const TextureResource::Data* initData,
+ TextureResource** outResource) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
+ Resource::Usage initialUsage,
+ const BufferResource::Desc& desc,
+ const void* initData,
+ BufferResource** outResource) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createSamplerState(SamplerState::Desc const& desc, SamplerState** outSampler) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView(
+ TextureResource* texture, ResourceView::Desc const& desc, ResourceView** outView) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView(
+ BufferResource* buffer, ResourceView::Desc const& desc, ResourceView** outView) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createInputLayout(
+ const InputElementDesc* inputElements,
+ UInt inputElementCount,
+ InputLayout** outLayout) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL createDescriptorSetLayout(
+ const DescriptorSetLayout::Desc& desc,
+ DescriptorSetLayout** outLayout) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createPipelineLayout(const PipelineLayout::Desc& desc, PipelineLayout** outLayout) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createDescriptorSet(DescriptorSetLayout* layout, DescriptorSet** outDescriptorSet) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ createProgram(const ShaderProgram::Desc& desc, ShaderProgram** outProgram) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState(
+ const GraphicsPipelineStateDesc& desc,
+ PipelineState** outState) override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState(
+ const ComputePipelineStateDesc& desc,
+ PipelineState** outState) override;
+
+ virtual SLANG_NO_THROW SlangResult SLANG_MCALL captureScreenSurface(Surface& surface) override;
+
+ virtual SLANG_NO_THROW void* SLANG_MCALL map(BufferResource* buffer, MapFlavor flavor) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL unmap(BufferResource* buffer) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setPrimitiveTopology(PrimitiveTopology topology) override;
+
+ virtual SLANG_NO_THROW void SLANG_MCALL setDescriptorSet(
+ PipelineType pipelineType,
+ PipelineLayout* layout,
+ UInt index,
+ DescriptorSet* descriptorSet) override;
+
+ virtual SLANG_NO_THROW void SLANG_MCALL setVertexBuffers(
+ UInt startSlot,
+ UInt slotCount,
+ BufferResource* const* buffers,
+ const UInt* strides,
+ const UInt* offsets) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setIndexBuffer(BufferResource* buffer, Format indexFormat, UInt offset) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setDepthStencilTarget(ResourceView* depthStencilView) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setViewports(UInt count, Viewport const* viewports) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setScissorRects(UInt count, ScissorRect const* rects) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ setPipelineState(PipelineType pipelineType, PipelineState* state) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL draw(UInt vertexCount, UInt startVertex) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ drawIndexed(UInt indexCount, UInt startIndex, UInt baseVertex) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL submitGpuWork() override;
+ virtual SLANG_NO_THROW void SLANG_MCALL waitForGpu() override;
+ virtual SLANG_NO_THROW RendererType SLANG_MCALL getRendererType() const override
+ {
+ return RendererType::Vulkan;
+ }
/// Dtor
~VKRenderer();
@@ -813,9 +858,11 @@ void VKRenderer::_endRender()
m_deviceQueue.flush();
}
-Renderer* createVKRenderer()
+SlangResult createVKRenderer(IRenderer** outRenderer)
{
- return new VKRenderer;
+ *outRenderer = new VKRenderer();
+ (*outRenderer)->addRef();
+ return SLANG_OK;
}
VKRenderer::~VKRenderer()
diff --git a/tools/gfx/vulkan/render-vk.h b/tools/gfx/vulkan/render-vk.h
index 14a8e403a..2e101c999 100644
--- a/tools/gfx/vulkan/render-vk.h
+++ b/tools/gfx/vulkan/render-vk.h
@@ -1,10 +1,12 @@
// render-vk.h
#pragma once
+#include <cstdint>
+
namespace gfx {
-class Renderer;
+class IRenderer;
-Renderer* createVKRenderer();
+int32_t createVKRenderer(IRenderer** outRenderer);
} // gfx
diff --git a/tools/graphics-app-framework/gui.cpp b/tools/graphics-app-framework/gui.cpp
index 8208bd606..3d6039f27 100644
--- a/tools/graphics-app-framework/gui.cpp
+++ b/tools/graphics-app-framework/gui.cpp
@@ -36,7 +36,7 @@ void setNativeWindowHook(Window* window, WNDPROC proc);
#endif
-GUI::GUI(Window* window, Renderer* inRenderer)
+GUI::GUI(Window* window, IRenderer* inRenderer)
: renderer(inRenderer)
{
ImGui::CreateContext();
diff --git a/tools/graphics-app-framework/gui.h b/tools/graphics-app-framework/gui.h
index d2c52de3c..fa6fda1d1 100644
--- a/tools/graphics-app-framework/gui.h
+++ b/tools/graphics-app-framework/gui.h
@@ -4,21 +4,21 @@
#include "tools/gfx/render.h"
#include "vector-math.h"
#include "window.h"
-
+#include "slang-com-ptr.h"
#include "external/imgui/imgui.h"
namespace gfx {
struct GUI : RefObject
{
- GUI(Window* window, Renderer* renderer);
+ GUI(Window* window, IRenderer* renderer);
~GUI();
void beginFrame();
void endFrame();
private:
- RefPtr<Renderer> renderer;
+ Slang::ComPtr<IRenderer> renderer;
RefPtr<PipelineState> pipelineState;
RefPtr<DescriptorSetLayout> descriptorSetLayout;
RefPtr<PipelineLayout> pipelineLayout;
diff --git a/tools/graphics-app-framework/model.cpp b/tools/graphics-app-framework/model.cpp
index 5d3a850e4..6a61c64e5 100644
--- a/tools/graphics-app-framework/model.cpp
+++ b/tools/graphics-app-framework/model.cpp
@@ -98,7 +98,7 @@ namespace gfx
{
RefPtr<TextureResource> loadTextureImage(
- Renderer* renderer,
+ IRenderer* renderer,
char const* path)
{
int extentX = 0;
diff --git a/tools/graphics-app-framework/model.h b/tools/graphics-app-framework/model.h
index e86940244..446f57943 100644
--- a/tools/graphics-app-framework/model.h
+++ b/tools/graphics-app-framework/model.h
@@ -3,7 +3,7 @@
#include "tools/gfx/render.h"
#include "vector-math.h"
-
+#include "slang-com-ptr.h"
#include <vector>
#include <string>
@@ -65,10 +65,10 @@ struct ModelLoader
FlipWinding = 1 << 0,
};
- ICallbacks* callbacks = nullptr;
- RefPtr<Renderer> renderer;
- LoadFlags loadFlags = 0;
- float scale = 1.0f;
+ ICallbacks* callbacks = nullptr;
+ Slang::ComPtr<IRenderer> renderer;
+ LoadFlags loadFlags = 0;
+ float scale = 1.0f;
Result load(char const* inputPath, void** outModel);
};
diff --git a/tools/render-test/render-test-main.cpp b/tools/render-test/render-test-main.cpp
index 1c8dc1d72..533932eab 100644
--- a/tools/render-test/render-test-main.cpp
+++ b/tools/render-test/render-test-main.cpp
@@ -90,7 +90,7 @@ public:
// code, and then create the API objects we need for rendering.
virtual Result initialize(
SlangSession* session,
- Renderer* renderer,
+ IRenderer* renderer,
const Options& options,
const ShaderCompilerUtil::Input& input) = 0;
void runCompute();
@@ -107,7 +107,7 @@ protected:
/// Called in initialize
Result _initializeShaders(
SlangSession* session,
- Renderer* renderer,
+ IRenderer* renderer,
Options::ShaderProgramType shaderType,
const ShaderCompilerUtil::Input& input);
@@ -116,7 +116,7 @@ protected:
// variables for state to be used for rendering...
uintptr_t m_constantBufferSize;
- RefPtr<Renderer> m_renderer;
+ ComPtr<IRenderer> m_renderer;
RefPtr<InputLayout> m_inputLayout;
RefPtr<BufferResource> m_vertexBuffer;
@@ -137,7 +137,7 @@ public:
virtual void setProjectionMatrix() SLANG_OVERRIDE;
virtual Result initialize(
SlangSession* session,
- Renderer* renderer,
+ IRenderer* renderer,
const Options& options,
const ShaderCompilerUtil::Input& input) SLANG_OVERRIDE;
@@ -159,7 +159,7 @@ public:
virtual void setProjectionMatrix() SLANG_OVERRIDE;
virtual Result initialize(
SlangSession* session,
- Renderer* renderer,
+ IRenderer* renderer,
const Options& options,
const ShaderCompilerUtil::Input& input) SLANG_OVERRIDE;
virtual Result writeBindingOutput(BindRoot* bindRoot, const char* fileName) override;
@@ -170,7 +170,7 @@ protected:
};
SlangResult _assignVarsFromLayout(
- Renderer* renderer,
+ IRenderer* renderer,
ShaderObject* shaderObject,
ShaderInputLayout const& layout,
ShaderOutputPlan& ioOutputPlan,
@@ -421,7 +421,7 @@ SlangResult _assignVarsFromLayout(
void LegacyRenderTestApp::applyBinding(PipelineType pipelineType)
{
- m_bindingState->apply(m_renderer.Ptr(), pipelineType);
+ m_bindingState->apply(m_renderer.get(), pipelineType);
}
void ShaderObjectRenderTestApp::applyBinding(PipelineType pipelineType)
@@ -431,7 +431,7 @@ void ShaderObjectRenderTestApp::applyBinding(PipelineType pipelineType)
SlangResult LegacyRenderTestApp::initialize(
SlangSession* session,
- Renderer* renderer,
+ IRenderer* renderer,
const Options& options,
const ShaderCompilerUtil::Input& input)
{
@@ -536,7 +536,7 @@ SlangResult LegacyRenderTestApp::initialize(
SlangResult ShaderObjectRenderTestApp::initialize(
SlangSession* session,
- Renderer* renderer,
+ IRenderer* renderer,
const Options& options,
const ShaderCompilerUtil::Input& input)
{
@@ -631,7 +631,11 @@ SlangResult ShaderObjectRenderTestApp::initialize(
return m_pipelineState ? SLANG_OK : SLANG_FAIL;
}
-Result RenderTestApp::_initializeShaders(SlangSession* session, Renderer* renderer, Options::ShaderProgramType shaderType, const ShaderCompilerUtil::Input& input)
+Result RenderTestApp::_initializeShaders(
+ SlangSession* session,
+ IRenderer* renderer,
+ Options::ShaderProgramType shaderType,
+ const ShaderCompilerUtil::Input& input)
{
SLANG_RETURN_ON_FAIL(ShaderCompilerUtil::compileWithLayout(session, m_options, input, m_compilationOutput));
m_shaderInputLayout = m_compilationOutput.layout;
@@ -1211,12 +1215,12 @@ static SlangResult _innerMain(Slang::StdWriters* stdWriters, SlangSession* sessi
#endif
}
- Slang::RefPtr<Renderer> renderer;
+ Slang::ComPtr<IRenderer> renderer;
{
RendererUtil::CreateFunc createFunc = RendererUtil::getCreateFunc(options.rendererType);
if (createFunc)
{
- renderer = createFunc();
+ createFunc(renderer.writeRef());
}
if (!renderer)
@@ -1228,7 +1232,7 @@ static SlangResult _innerMain(Slang::StdWriters* stdWriters, SlangSession* sessi
return SLANG_FAIL;
}
- Renderer::Desc desc;
+ IRenderer::Desc desc;
desc.width = gWindowWidth;
desc.height = gWindowHeight;
desc.adapter = options.adapter;
diff --git a/tools/render-test/shader-renderer-util.cpp b/tools/render-test/shader-renderer-util.cpp
index 5e77cf1fd..d24909bca 100644
--- a/tools/render-test/shader-renderer-util.cpp
+++ b/tools/render-test/shader-renderer-util.cpp
@@ -7,7 +7,7 @@ namespace renderer_test {
using namespace Slang;
using Slang::Result;
-void BindingStateImpl::apply(Renderer* renderer, PipelineType pipelineType)
+void BindingStateImpl::apply(IRenderer* renderer, PipelineType pipelineType)
{
renderer->setDescriptorSet(
pipelineType,
@@ -16,14 +16,23 @@ void BindingStateImpl::apply(Renderer* renderer, PipelineType pipelineType)
descriptorSet);
}
-/* static */Result ShaderRendererUtil::generateTextureResource(const InputTextureDesc& inputDesc, int bindFlags, Renderer* renderer, RefPtr<TextureResource>& textureOut)
+/* static */ Result ShaderRendererUtil::generateTextureResource(
+ const InputTextureDesc& inputDesc,
+ int bindFlags,
+ IRenderer* renderer,
+ RefPtr<TextureResource>& textureOut)
{
TextureData texData;
generateTextureData(texData, inputDesc);
return createTextureResource(inputDesc, texData, bindFlags, renderer, textureOut);
}
-/* static */Result ShaderRendererUtil::createTextureResource(const InputTextureDesc& inputDesc, const TextureData& texData, int bindFlags, Renderer* renderer, RefPtr<TextureResource>& textureOut)
+/* static */ Result ShaderRendererUtil::createTextureResource(
+ const InputTextureDesc& inputDesc,
+ const TextureData& texData,
+ int bindFlags,
+ IRenderer* renderer,
+ RefPtr<TextureResource>& textureOut)
{
TextureResource::Desc textureResourceDesc;
textureResourceDesc.init(Resource::Type::Unknown);
@@ -99,7 +108,13 @@ void BindingStateImpl::apply(Renderer* renderer, PipelineType pipelineType)
return textureOut ? SLANG_OK : SLANG_FAIL;
}
-/* static */Result ShaderRendererUtil::createBufferResource(const InputBufferDesc& inputDesc, bool isOutput, size_t bufferSize, const void* initData, Renderer* renderer, Slang::RefPtr<BufferResource>& bufferOut)
+/* static */ Result ShaderRendererUtil::createBufferResource(
+ const InputBufferDesc& inputDesc,
+ bool isOutput,
+ size_t bufferSize,
+ const void* initData,
+ IRenderer* renderer,
+ Slang::RefPtr<BufferResource>& bufferOut)
{
Resource::Usage initialUsage = Resource::Usage::GenericRead;
@@ -149,14 +164,17 @@ static SamplerState::Desc _calcSamplerDesc(const InputSamplerDesc& srcDesc)
return dstDesc;
}
-RefPtr<SamplerState> _createSamplerState(
- Renderer* renderer,
+RefPtr<SamplerState> _createSamplerState(IRenderer* renderer,
const InputSamplerDesc& srcDesc)
{
return renderer->createSamplerState(_calcSamplerDesc(srcDesc));
}
-/* static */Result ShaderRendererUtil::createBindingState(const ShaderInputLayout& layout, Renderer* renderer, BufferResource* addedConstantBuffer, BindingStateImpl** outBindingState)
+/* static */ Result ShaderRendererUtil::createBindingState(
+ const ShaderInputLayout& layout,
+ IRenderer* renderer,
+ BufferResource* addedConstantBuffer,
+ BindingStateImpl** outBindingState)
{
auto srcEntries = layout.entries.getBuffer();
auto numEntries = layout.entries.getCount();
diff --git a/tools/render-test/shader-renderer-util.h b/tools/render-test/shader-renderer-util.h
index 76f3b6d87..5bb2d342e 100644
--- a/tools/render-test/shader-renderer-util.h
+++ b/tools/render-test/shader-renderer-util.h
@@ -33,7 +33,7 @@ struct BindingStateImpl : public Slang::RefObject
uint16_t size; ///< The amount of register indices
};
- void apply(Renderer* renderer, PipelineType pipelineType);
+ void apply(IRenderer* renderer, PipelineType pipelineType);
struct OutputBinding
{
@@ -48,27 +48,47 @@ struct BindingStateImpl : public Slang::RefObject
};
RefPtr<SamplerState> _createSamplerState(
- Renderer* renderer,
+ IRenderer* renderer,
const InputSamplerDesc& srcDesc);
/// Utility class containing functions that construct items on the renderer using the ShaderInputLayout representation
struct ShaderRendererUtil
{
/// Generate a texture using the InputTextureDesc and construct a TextureResource using the Renderer with the contents
- static Slang::Result generateTextureResource(const InputTextureDesc& inputDesc, int bindFlags, Renderer* renderer, Slang::RefPtr<TextureResource>& textureOut);
+ static Slang::Result generateTextureResource(const InputTextureDesc& inputDesc, int bindFlags, IRenderer* renderer, Slang::RefPtr<TextureResource>& textureOut);
/// Create texture resource using inputDesc, and texData to describe format, and contents
- static Slang::Result createTextureResource(const InputTextureDesc& inputDesc, const TextureData& texData, int bindFlags, Renderer* renderer, Slang::RefPtr<TextureResource>& textureOut);
+ static Slang::Result createTextureResource(
+ const InputTextureDesc& inputDesc,
+ const TextureData& texData,
+ int bindFlags,
+ IRenderer* renderer,
+ Slang::RefPtr<TextureResource>& textureOut);
/// Create the BufferResource using the renderer from the contents of inputDesc
- static Slang::Result createBufferResource(const InputBufferDesc& inputDesc, bool isOutput, size_t bufferSize, const void* initData, Renderer* renderer, Slang::RefPtr<BufferResource>& bufferOut);
+ static Slang::Result createBufferResource(
+ const InputBufferDesc& inputDesc,
+ bool isOutput,
+ size_t bufferSize,
+ const void* initData,
+ IRenderer* renderer,
+ Slang::RefPtr<BufferResource>& bufferOut);
/// Create BindingState::Desc from the contents of layout
- static Slang::Result createBindingState(const ShaderInputLayout& layout, Renderer* renderer, BufferResource* addedConstantBuffer, BindingStateImpl** outBindingState);
+ static Slang::Result createBindingState(
+ const ShaderInputLayout& layout,
+ IRenderer* renderer,
+ BufferResource* addedConstantBuffer,
+ BindingStateImpl** outBindingState);
private:
/// Create BindingState::Desc from a list of ShaderInputLayout entries
- static Slang::Result _createBindingState(ShaderInputLayoutEntry* srcEntries, int numEntries, Renderer* renderer, BufferResource* addedConstantBuffer, BindingStateImpl** outBindingState);
+ static Slang::Result _createBindingState(
+ ShaderInputLayoutEntry* srcEntries,
+ int numEntries,
+ IRenderer* renderer,
+ BufferResource* addedConstantBuffer,
+ BindingStateImpl** outBindingState);
};
} // renderer_test