Commit f47dccab by Tim Van Patten Committed by Commit Bot

Vulkan: Create TransformSpirvCode()

To support Program Pipeline Objects, the SPIR-V transformations must be completed at draw time once all of the variable locations are known. To achieve this, the transformation work is being refactored into TransformSpirvCode() which can be called separately from GlslangGetShaderSpirvCode(). Bug: angleproject:3570 Change-Id: Ia479cb2e4b4201e37acd0859c70081cecb80d0bf Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2068900 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCourtney Goeltzenleuchter <courtneygo@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 85c076ee
...@@ -1915,6 +1915,26 @@ void GlslangGetShaderSource(GlslangSourceOptions &options, ...@@ -1915,6 +1915,26 @@ void GlslangGetShaderSource(GlslangSourceOptions &options,
AssignNonTextureBindings(options, programState, programInterfaceInfo, variableInfoMapOut); AssignNonTextureBindings(options, programState, programInterfaceInfo, variableInfoMapOut);
} }
angle::Result TransformSpirvCode(const GlslangErrorCallback &callback,
const gl::ShaderType shaderType,
const ShaderInterfaceVariableInfoMap &variableInfoMap,
const SpirvBlob &initialSpirvBlob,
SpirvBlob *spirvBlobOut)
{
if (initialSpirvBlob.empty())
{
return angle::Result::Continue;
}
// Transform the SPIR-V code by assigning location/set/binding values.
SpirvTransformer transformer(initialSpirvBlob, variableInfoMap, shaderType, spirvBlobOut);
ANGLE_GLSLANG_CHECK(callback, transformer.transform(), GlslangError::InvalidSpirv);
ASSERT(ValidateSpirv(*spirvBlobOut));
return angle::Result::Continue;
}
angle::Result GlslangGetShaderSpirvCode(const GlslangErrorCallback &callback, angle::Result GlslangGetShaderSpirvCode(const GlslangErrorCallback &callback,
const gl::Caps &glCaps, const gl::Caps &glCaps,
const gl::ShaderMap<std::string> &shaderSources, const gl::ShaderMap<std::string> &shaderSources,
...@@ -1924,24 +1944,15 @@ angle::Result GlslangGetShaderSpirvCode(const GlslangErrorCallback &callback, ...@@ -1924,24 +1944,15 @@ angle::Result GlslangGetShaderSpirvCode(const GlslangErrorCallback &callback,
gl::ShaderMap<SpirvBlob> initialSpirvBlobs; gl::ShaderMap<SpirvBlob> initialSpirvBlobs;
ANGLE_TRY(GetShaderSpirvCode(callback, glCaps, shaderSources, &initialSpirvBlobs)); ANGLE_TRY(GetShaderSpirvCode(callback, glCaps, shaderSources, &initialSpirvBlobs));
// Transform the SPIR-V code by assigning location/set/binding values.
for (const gl::ShaderType shaderType : gl::AllShaderTypes()) for (const gl::ShaderType shaderType : gl::AllShaderTypes())
{ {
const std::vector<uint32_t> initialSpirvBlob = initialSpirvBlobs[shaderType]; angle::Result status =
TransformSpirvCode(callback, shaderType, variableInfoMap[shaderType],
if (initialSpirvBlob.empty()) initialSpirvBlobs[shaderType], &(*spirvBlobsOut)[shaderType]);
if (status != angle::Result::Continue)
{ {
continue; return status;
} }
SpirvBlob *spirvBlob = &(*spirvBlobsOut)[shaderType];
// Transform the SPIR-V code by assigning location/set/binding values.
SpirvTransformer transformer(initialSpirvBlob, variableInfoMap[shaderType], shaderType,
spirvBlob);
ANGLE_GLSLANG_CHECK(callback, transformer.transform(), GlslangError::InvalidSpirv);
ASSERT(ValidateSpirv(*spirvBlob));
} }
return angle::Result::Continue; return angle::Result::Continue;
......
...@@ -109,6 +109,12 @@ void GlslangGetShaderSource(GlslangSourceOptions &options, ...@@ -109,6 +109,12 @@ void GlslangGetShaderSource(GlslangSourceOptions &options,
gl::ShaderMap<std::string> *shaderSourcesOut, gl::ShaderMap<std::string> *shaderSourcesOut,
ShaderMapInterfaceVariableInfoMap *variableInfoMapOut); ShaderMapInterfaceVariableInfoMap *variableInfoMapOut);
angle::Result TransformSpirvCode(const GlslangErrorCallback &callback,
const gl::ShaderType shaderType,
const ShaderInterfaceVariableInfoMap &variableInfoMap,
const std::vector<uint32_t> &initialSpirvBlob,
SpirvBlob *spirvBlobOut);
angle::Result GlslangGetShaderSpirvCode(const GlslangErrorCallback &callback, angle::Result GlslangGetShaderSpirvCode(const GlslangErrorCallback &callback,
const gl::Caps &glCaps, const gl::Caps &glCaps,
const gl::ShaderMap<std::string> &shaderSources, const gl::ShaderMap<std::string> &shaderSources,
......
...@@ -80,4 +80,17 @@ angle::Result GlslangWrapperVk::GetShaderCode( ...@@ -80,4 +80,17 @@ angle::Result GlslangWrapperVk::GetShaderCode(
[context](GlslangError error) { return ErrorHandler(context, error); }, glCaps, [context](GlslangError error) { return ErrorHandler(context, error); }, glCaps,
shaderSources, variableInfoMap, shaderCodeOut); shaderSources, variableInfoMap, shaderCodeOut);
} }
// static
angle::Result GlslangWrapperVk::TransformSpirV(
vk::Context *context,
const gl::ShaderType shaderType,
const ShaderInterfaceVariableInfoMap &variableInfoMap,
std::vector<uint32_t> &initialSpirvBlob,
std::vector<uint32_t> *shaderCodeOut)
{
return TransformSpirvCode(
[context](GlslangError error) { return ErrorHandler(context, error); }, shaderType,
variableInfoMap, initialSpirvBlob, shaderCodeOut);
}
} // namespace rx } // namespace rx
...@@ -42,6 +42,12 @@ class GlslangWrapperVk ...@@ -42,6 +42,12 @@ class GlslangWrapperVk
const gl::ShaderMap<std::string> &shaderSources, const gl::ShaderMap<std::string> &shaderSources,
const ShaderMapInterfaceVariableInfoMap &variableInfoMap, const ShaderMapInterfaceVariableInfoMap &variableInfoMap,
gl::ShaderMap<std::vector<uint32_t>> *shaderCodesOut); gl::ShaderMap<std::vector<uint32_t>> *shaderCodesOut);
static angle::Result TransformSpirV(vk::Context *context,
const gl::ShaderType shaderType,
const ShaderInterfaceVariableInfoMap &variableInfoMap,
std::vector<uint32_t> &initialSpirvBlob,
std::vector<uint32_t> *shaderCodeOut);
}; };
} // namespace rx } // namespace rx
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment