diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2021-01-26 13:32:03 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-26 13:32:03 -0800 |
| commit | a90c850735664e2928e4cc961442a126c6859b97 (patch) | |
| tree | 8b5e12113319ae87c57f5e616408eb955fe85a2c /tools/render-test | |
| parent | 50676c741e10ffe6f710c5de86387eaacd274a9a (diff) | |
Integrate reflection more deeply into gfx layer (#1677)
Diffstat (limited to 'tools/render-test')
| -rw-r--r-- | tools/render-test/render-test-main.cpp | 34 | ||||
| -rw-r--r-- | tools/render-test/slang-support.cpp | 45 | ||||
| -rw-r--r-- | tools/render-test/slang-support.h | 38 |
3 files changed, 77 insertions, 40 deletions
diff --git a/tools/render-test/render-test-main.cpp b/tools/render-test/render-test-main.cpp index 926887a77..6e35db639 100644 --- a/tools/render-test/render-test-main.cpp +++ b/tools/render-test/render-test-main.cpp @@ -111,6 +111,8 @@ protected: Options::ShaderProgramType shaderType, const ShaderCompilerUtil::Input& input); + virtual void finalizeImpl(); + uint64_t m_startTicks; // variables for state to be used for rendering... @@ -165,6 +167,8 @@ public: virtual Result writeBindingOutput(BindRoot* bindRoot, const char* fileName) override; protected: + virtual void finalizeImpl() SLANG_OVERRIDE; + ComPtr<IShaderObject> m_programVars; ShaderOutputPlan m_outputPlan; }; @@ -586,12 +590,11 @@ SlangResult ShaderObjectRenderTestApp::initialize( // Slang's reflection API to tell us what the parameters of the program are. // auto slangReflection = (slang::ProgramLayout*) spGetReflection(m_compilationOutput.output.getRequestForReflection()); - ComPtr<IShaderObjectLayout> programLayout = renderer->createRootShaderObjectLayout(slangReflection); // Once we have determined the layout of all the parameters we need to bind, // we will create a shader object to use for storing and binding those parameters. // - m_programVars = renderer->createRootShaderObject(programLayout); + m_programVars = renderer->createRootShaderObject(m_shaderProgram); // Now we need to assign from the input parameter data that was parsed into // the program vars we allocated. @@ -601,9 +604,6 @@ SlangResult ShaderObjectRenderTestApp::initialize( m_renderer = renderer; - // TODO(tfoley): use each API's reflection interface to query the constant-buffer size needed -// m_constantBufferSize = 16 * sizeof(float); - { switch(m_options.shaderType) { @@ -614,7 +614,6 @@ SlangResult ShaderObjectRenderTestApp::initialize( case Options::ShaderProgramType::Compute: { ComputePipelineStateDesc desc; - desc.rootShaderObjectLayout = programLayout.get(); desc.program = m_shaderProgram; m_pipelineState = renderer->createComputePipelineState(desc); @@ -648,7 +647,6 @@ SlangResult ShaderObjectRenderTestApp::initialize( SLANG_RETURN_ON_FAIL(renderer->createBufferResource(IResource::Usage::VertexBuffer, vertexBufferDesc, kVertexData, m_vertexBuffer.writeRef())); GraphicsPipelineStateDesc desc; - desc.rootShaderObjectLayout = programLayout.get(); desc.program = m_shaderProgram; desc.inputLayout = inputLayout; @@ -662,6 +660,12 @@ SlangResult ShaderObjectRenderTestApp::initialize( return m_pipelineState ? SLANG_OK : SLANG_FAIL; } +void ShaderObjectRenderTestApp::finalizeImpl() +{ + m_programVars = nullptr; + RenderTestApp::finalizeImpl(); +} + Result RenderTestApp::_initializeShaders( SlangSession* session, IRenderer* renderer, @@ -730,6 +734,18 @@ void RenderTestApp::runCompute() void RenderTestApp::finalize() { + finalizeImpl(); + + m_inputLayout = nullptr; + m_vertexBuffer = nullptr; + m_shaderProgram = nullptr; + m_pipelineState = nullptr; + + m_renderer = nullptr; +} + +void RenderTestApp::finalizeImpl() +{ } Result LegacyRenderTestApp::writeBindingOutput(BindRoot* bindRoot, const char* fileName) @@ -1328,7 +1344,9 @@ static SlangResult _innerMain(Slang::StdWriters* stdWriters, SlangSession* sessi app = new LegacyRenderTestApp(); SLANG_RETURN_ON_FAIL(app->initialize(session, renderer, options, input)); window->show(); - return window->runLoop(app); + SLANG_RETURN_ON_FAIL(window->runLoop(app)); + app->finalize(); + return SLANG_OK; } } diff --git a/tools/render-test/slang-support.cpp b/tools/render-test/slang-support.cpp index 300cab4d7..c6d2b971e 100644 --- a/tools/render-test/slang-support.cpp +++ b/tools/render-test/slang-support.cpp @@ -50,6 +50,44 @@ gfx::StageType translateStage(SlangStage slangStage) } } +void ShaderCompilerUtil::Output::set( + PipelineType pipelineType, + const IShaderProgram::KernelDesc* inKernelDescs, + Slang::Index kernelDescCount, + slang::IComponentType* inSlangProgram) +{ + kernelDescs.clear(); + kernelDescs.addRange(inKernelDescs, kernelDescCount); + slangProgram = inSlangProgram; + desc.pipelineType = pipelineType; + desc.kernels = kernelDescs.getBuffer(); + desc.kernelCount = kernelDescCount; + desc.slangProgram = inSlangProgram; +} + +void ShaderCompilerUtil::Output::reset() +{ + { + desc.pipelineType = PipelineType::Unknown; + desc.slangProgram = nullptr; + desc.kernels = nullptr; + desc.kernelCount = 0; + } + + kernelDescs.clear(); + if (m_requestForKernels && session) + { + spDestroyCompileRequest(m_requestForKernels); + } + if (m_extraRequestForReflection && session) + { + spDestroyCompileRequest(m_extraRequestForReflection); + } + session = nullptr; + m_requestForKernels = nullptr; + m_extraRequestForReflection = nullptr; +} + /* static */ SlangResult ShaderCompilerUtil::_compileProgramImpl(SlangSession* session, const Options& options, const Input& input, const ShaderCompileRequest& request, Output& out) { out.reset(); @@ -168,7 +206,8 @@ gfx::StageType translateStage(SlangStage slangStage) SLANG_RETURN_ON_FAIL(res); - + ComPtr<slang::IComponentType> linkedSlangProgram; + List<ShaderCompileRequest::EntryPoint> actualEntryPoints; if(input.passThrough == SLANG_PASS_THROUGH_NONE) { @@ -178,6 +217,7 @@ gfx::StageType translateStage(SlangStage slangStage) // loading of code. // auto reflection = slang::ProgramLayout::get(slangRequest); + SLANG_RETURN_ON_FAIL(spCompileRequest_getProgramWithEntryPoints(slangRequest, linkedSlangProgram.writeRef())); // Get the amount of entry points in reflection Index entryPointCount = Index(reflection->getEntryPointCount()); @@ -226,7 +266,7 @@ gfx::StageType translateStage(SlangStage slangStage) kernelDescs.add(kernelDesc); } - out.set(input.pipelineType, kernelDescs.getBuffer(), kernelDescs.getCount()); + out.set(input.pipelineType, kernelDescs.getBuffer(), kernelDescs.getCount(), linkedSlangProgram); return SLANG_OK; } @@ -277,6 +317,7 @@ gfx::StageType translateStage(SlangStage slangStage) SLANG_RETURN_ON_FAIL(_compileProgramImpl(session, options, input, request, out)); out.m_extraRequestForReflection = slangOutput.getRequestForReflection(); + out.desc.slangProgram = slangOutput.desc.slangProgram; slangOutput.m_requestForKernels = nullptr; return SLANG_OK; diff --git a/tools/render-test/slang-support.h b/tools/render-test/slang-support.h index 06651ec73..c08d18567 100644 --- a/tools/render-test/slang-support.h +++ b/tools/render-test/slang-support.h @@ -58,35 +58,12 @@ struct ShaderCompilerUtil struct Output { - void set(PipelineType pipelineType, const IShaderProgram::KernelDesc* inKernelDescs, Slang::Index kernelDescCount) - { - kernelDescs.clear(); - kernelDescs.addRange(inKernelDescs, kernelDescCount); - desc.pipelineType = pipelineType; - desc.kernels = kernelDescs.getBuffer(); - desc.kernelCount = kernelDescCount; - } - void reset() - { - { - desc.pipelineType = PipelineType::Unknown; - desc.kernels = nullptr; - desc.kernelCount = 0; - } - - kernelDescs.clear(); - if (m_requestForKernels && session) - { - spDestroyCompileRequest(m_requestForKernels); - } - if (m_extraRequestForReflection && session) - { - spDestroyCompileRequest(m_extraRequestForReflection); - } - session = nullptr; - m_requestForKernels = nullptr; - m_extraRequestForReflection = nullptr; - } + void set( + PipelineType pipelineType, + const IShaderProgram::KernelDesc* kernelDescs, + Slang::Index kernelDescCount, + slang::IComponentType* slangProgram); + void reset(); ~Output() { reset(); @@ -105,7 +82,8 @@ struct ShaderCompilerUtil } Slang::List<IShaderProgram::KernelDesc> kernelDescs; - IShaderProgram::Desc desc; + ComPtr<slang::IComponentType> slangProgram; + IShaderProgram::Desc desc = {}; /// Compile request that owns the lifetime of compiled kernel code. SlangCompileRequest* m_requestForKernels = nullptr; |
