summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/gfx/vulkan/render-vk.cpp15
-rw-r--r--tools/render-test/options.cpp4
-rw-r--r--tools/render-test/options.h2
-rw-r--r--tools/render-test/render-test-main.cpp2
-rw-r--r--tools/render-test/slang-support.cpp2
5 files changed, 23 insertions, 2 deletions
diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp
index 88770dbb9..f56a21d20 100644
--- a/tools/gfx/vulkan/render-vk.cpp
+++ b/tools/gfx/vulkan/render-vk.cpp
@@ -4944,6 +4944,7 @@ public:
/// Note that the outShaderModule value should be cleaned up when no longer needed by caller
/// via vkShaderModuleDestroy()
VkPipelineShaderStageCreateInfo compileEntryPoint(
+ const char* entryPointName,
ISlangBlob* code,
VkShaderStageFlagBits stage,
VkShaderModule& outShaderModule);
@@ -5188,6 +5189,7 @@ VkBool32 VKDevice::handleDebugMessage(VkDebugReportFlagsEXT flags, VkDebugReport
}
VkPipelineShaderStageCreateInfo VKDevice::compileEntryPoint(
+ const char* entryPointName,
ISlangBlob* code,
VkShaderStageFlagBits stage,
VkShaderModule& outShaderModule)
@@ -5210,7 +5212,7 @@ VkPipelineShaderStageCreateInfo VKDevice::compileEntryPoint(
shaderStageCreateInfo.stage = stage;
shaderStageCreateInfo.module = module;
- shaderStageCreateInfo.pName = "main";
+ shaderStageCreateInfo.pName = entryPointName;
return shaderStageCreateInfo;
}
@@ -6861,7 +6863,16 @@ Result VKDevice::createProgram(const IShaderProgram::Desc& desc, IShaderProgram*
SLANG_RETURN_ON_FAIL(compileResult);
shaderProgram->m_codeBlobs.add(kernelCode);
VkShaderModule shaderModule;
+ // HACK: our direct-spirv-emit path generates SPIRV that respects
+ // the original entry point name, while the glslang path always
+ // uses "main" as the name. We should introduce a compiler parameter
+ // to control the entry point naming behavior in SPIRV-direct path
+ // so we can remove the ad-hoc logic here.
+ const char* entryPointName = "main";
+ if (m_desc.slang.targetFlags & SLANG_TARGET_FLAG_GENERATE_SPIRV_DIRECTLY)
+ entryPointName = entryPointInfo->getName();
shaderProgram->m_stageCreateInfos.add(compileEntryPoint(
+ entryPointName,
kernelCode,
(VkShaderStageFlagBits)VulkanUtil::getShaderStage(stage),
shaderModule));
@@ -7075,7 +7086,7 @@ Result VKDevice::createComputePipelineState(const ComputePipelineStateDesc& inDe
returnComPtr(outState, pipelineStateImpl);
return SLANG_OK;
}
-
+
VkPipelineCache pipelineCache = VK_NULL_HANDLE;
VkPipeline pipeline = VK_NULL_HANDLE;
diff --git a/tools/render-test/options.cpp b/tools/render-test/options.cpp
index 5d3560351..a4a643e22 100644
--- a/tools/render-test/options.cpp
+++ b/tools/render-test/options.cpp
@@ -141,6 +141,10 @@ static gfx::DeviceType _toRenderType(Slang::RenderApiType apiType)
{
outOptions.useDXIL = true;
}
+ else if (argValue == "-emit-spirv-directly")
+ {
+ outOptions.generateSPIRVDirectly = true;
+ }
else if (argValue == "-only-startup")
{
outOptions.onlyStartup = true;
diff --git a/tools/render-test/options.h b/tools/render-test/options.h
index 7940d0d42..f41614360 100644
--- a/tools/render-test/options.h
+++ b/tools/render-test/options.h
@@ -73,6 +73,8 @@ struct Options
Slang::DownstreamArgs downstreamArgs; ///< Args to downstream tools. Here it's just slang
+ bool generateSPIRVDirectly = false;
+
Options() { downstreamArgs.addName("slang"); }
static SlangResult parse(int argc, const char*const* argv, Slang::WriterHelper stdError, Options& outOptions);
diff --git a/tools/render-test/render-test-main.cpp b/tools/render-test/render-test-main.cpp
index 96cc94aa3..271356cc3 100644
--- a/tools/render-test/render-test-main.cpp
+++ b/tools/render-test/render-test-main.cpp
@@ -1326,6 +1326,8 @@ static SlangResult _innerMain(Slang::StdWriters* stdWriters, SlangSession* sessi
desc.adapter = options.adapter.getBuffer();
desc.slang.lineDirectiveMode = SLANG_LINE_DIRECTIVE_MODE_NONE;
+ if (options.generateSPIRVDirectly)
+ desc.slang.targetFlags = SLANG_TARGET_FLAG_GENERATE_SPIRV_DIRECTLY;
List<const char*> requiredFeatureList;
for (auto& name : options.renderFeatures)
diff --git a/tools/render-test/slang-support.cpp b/tools/render-test/slang-support.cpp
index a533a6378..65f8f244b 100644
--- a/tools/render-test/slang-support.cpp
+++ b/tools/render-test/slang-support.cpp
@@ -96,6 +96,8 @@ void ShaderCompilerUtil::Output::reset()
spSetCodeGenTarget(slangRequest, input.target);
spSetTargetProfile(slangRequest, 0, spFindProfile(out.session, input.profile.getBuffer()));
+ if (options.generateSPIRVDirectly)
+ spSetTargetFlags(slangRequest, 0, SLANG_TARGET_FLAG_GENERATE_SPIRV_DIRECTLY);
// Define a macro so that shader code in a test can detect what language we
// are nominally working with.