summaryrefslogtreecommitdiff
path: root/tools/gfx/vulkan/render-vk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx/vulkan/render-vk.cpp')
-rw-r--r--tools/gfx/vulkan/render-vk.cpp48
1 files changed, 31 insertions, 17 deletions
diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp
index 21034d167..565a8e96f 100644
--- a/tools/gfx/vulkan/render-vk.cpp
+++ b/tools/gfx/vulkan/render-vk.cpp
@@ -114,8 +114,7 @@ public:
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, IPipelineState* state) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL setPipelineState(IPipelineState* 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;
@@ -126,7 +125,10 @@ public:
{
return RendererType::Vulkan;
}
-
+ virtual PipelineStateBase* getCurrentPipeline() override
+ {
+ return m_currentPipeline.Ptr();
+ }
/// Dtor
~VKRenderer();
@@ -515,17 +517,9 @@ public:
int m_offset;
};
- class PipelineStateImpl : public IPipelineState, public RefObject
+ class PipelineStateImpl : public PipelineStateBase
{
public:
- SLANG_REF_OBJECT_IUNKNOWN_ALL
- IPipelineState* getInterface(const Guid& guid)
- {
- if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_IPipelineState)
- return static_cast<IPipelineState*>(this);
- return nullptr;
- }
- public:
PipelineStateImpl(const VulkanApi& api):
m_api(&api)
{
@@ -538,6 +532,21 @@ public:
}
}
+ void init(const GraphicsPipelineStateDesc& inDesc)
+ {
+ PipelineStateDesc pipelineDesc;
+ pipelineDesc.type = PipelineType::Graphics;
+ pipelineDesc.graphics = inDesc;
+ initializeBase(pipelineDesc);
+ }
+ void init(const ComputePipelineStateDesc& inDesc)
+ {
+ PipelineStateDesc pipelineDesc;
+ pipelineDesc.type = PipelineType::Compute;
+ pipelineDesc.compute = inDesc;
+ initializeBase(pipelineDesc);
+ }
+
const VulkanApi* m_api;
RefPtr<PipelineLayoutImpl> m_pipelineLayout;
@@ -913,10 +922,11 @@ void VKRenderer::_endRender()
m_deviceQueue.flush();
}
-Result SLANG_MCALL createVKRenderer(IRenderer** outRenderer)
+Result SLANG_MCALL createVKRenderer(const IRenderer::Desc* desc, void* windowHandle, IRenderer** outRenderer)
{
- *outRenderer = new VKRenderer();
- (*outRenderer)->addRef();
+ RefPtr<VKRenderer> result = new VKRenderer();
+ SLANG_RETURN_ON_FAIL(result->initialize(*desc, windowHandle));
+ *outRenderer = result.detach();
return SLANG_OK;
}
@@ -1035,6 +1045,8 @@ SlangResult VKRenderer::initialize(const Desc& desc, void* inWindowHandle)
{
SLANG_RETURN_ON_FAIL(slangContext.initialize(desc.slang, SLANG_SPIRV, "sm_5_1"));
+ SLANG_RETURN_ON_FAIL(GraphicsAPIRenderer::initialize(desc, inWindowHandle));
+
SLANG_RETURN_ON_FAIL(m_module.init());
SLANG_RETURN_ON_FAIL(m_api.initGlobalProcs(m_module));
@@ -2274,9 +2286,9 @@ void VKRenderer::setScissorRects(UInt count, ScissorRect const* rects)
m_api.vkCmdSetScissor(commandBuffer, 0, uint32_t(count), vkRects);
}
-void VKRenderer::setPipelineState(PipelineType pipelineType, IPipelineState* state)
+void VKRenderer::setPipelineState(IPipelineState* state)
{
- m_currentPipeline = (PipelineStateImpl*)state;
+ m_currentPipeline = static_cast<PipelineStateImpl*>(state);
}
void VKRenderer::_flushBindingState(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint)
@@ -2980,6 +2992,7 @@ Result VKRenderer::createGraphicsPipelineState(const GraphicsPipelineStateDesc&
pipelineStateImpl->m_pipeline = pipeline;
pipelineStateImpl->m_pipelineLayout = pipelineLayoutImpl;
pipelineStateImpl->m_shaderProgram = programImpl;
+ pipelineStateImpl->init(desc);
*outState = pipelineStateImpl.detach();
return SLANG_OK;
}
@@ -3005,6 +3018,7 @@ Result VKRenderer::createComputePipelineState(const ComputePipelineStateDesc& in
pipelineStateImpl->m_pipeline = pipeline;
pipelineStateImpl->m_pipelineLayout = pipelineLayoutImpl;
pipelineStateImpl->m_shaderProgram = programImpl;
+ pipelineStateImpl->init(desc);
*outState = pipelineStateImpl.detach();
return SLANG_OK;
}