Commit 8844599f by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Create unresolve shader directly in SPIR-V

Per issue 4889, dependency to glslang is being dropped. This change generates the unresolve UtilsVk shader directly in SPIR-V. This shader is trivial and contains repeating patterns per attachment. As a result, generating its SPIR-V is exceptionally simple. The SPIR-V in this change is first generated by glslang validator and is then adapted for autogeneration. See comments in the code for details. Bug: angleproject:4889 Change-Id: I48dd77ae04e1035c05a8aef7bf2f161e105ae2a4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2407179 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com>
parent c054008f
{ {
"src/common/spirv/gen_spirv_builder_and_parser.py": "src/common/spirv/gen_spirv_builder_and_parser.py":
"60a5245905287df8a9fb55be33acfc48", "ac2db108072c8c12c7817fd923e22bde",
"src/common/spirv/spirv_instruction_builder_autogen.cpp": "src/common/spirv/spirv_instruction_builder_autogen.cpp":
"6ea97ca168ecccb4a621a06446e4933a", "52f80a4b5b549ff5568be9f74dd2e3c1",
"src/common/spirv/spirv_instruction_builder_autogen.h": "src/common/spirv/spirv_instruction_builder_autogen.h":
"7f0130816be26511615f7b1e33fda196", "54ff9094108732d4b10c4c33b4fb38e0",
"src/common/spirv/spirv_instruction_parser_autogen.cpp": "src/common/spirv/spirv_instruction_parser_autogen.cpp":
"55d28bb4b003dbecf31e162ff996fc4f", "55d28bb4b003dbecf31e162ff996fc4f",
"src/common/spirv/spirv_instruction_parser_autogen.h": "src/common/spirv/spirv_instruction_parser_autogen.h":
......
...@@ -90,7 +90,34 @@ uint32_t MakeLengthOp(size_t length, spv::Op op) ...@@ -90,7 +90,34 @@ uint32_t MakeLengthOp(size_t length, spv::Op op)
return static_cast<uint32_t>(length) << 16 | op; return static_cast<uint32_t>(length) << 16 | op;
} }
} // anonymous namespace""" } // anonymous namespace
void WriteSpirvHeader(std::vector<uint32_t> *blob, uint32_t idCount)
{
// Header:
//
// - Magic number
// - Version (1.0)
// - ANGLE's Generator number:
// * 24 for tool id (higher 16 bits)
// * 0 for tool version (lower 16 bits))
// - Bound (idCount)
// - 0 (reserved)
constexpr uint32_t kANGLEGeneratorId = 24;
ASSERT(blob->empty());
blob->push_back(spv::MagicNumber);
blob->push_back(0x00010000);
blob->push_back(kANGLEGeneratorId << 16 | 0);
blob->push_back(idCount);
blob->push_back(0x00000000);
}
"""
BUILDER_HELPER_FUNCTION_PROTOTYPE = """
void WriteSpirvHeader(std::vector<uint32_t> *blob, uint32_t idCount);
"""
PARSER_FIXED_FUNCTIONS_PROTOTYPES = """void GetInstructionOpAndLength(const uint32_t *_instruction, PARSER_FIXED_FUNCTIONS_PROTOTYPES = """void GetInstructionOpAndLength(const uint32_t *_instruction,
spv::Op *opOut, uint32_t *lengthOut); spv::Op *opOut, uint32_t *lengthOut);
...@@ -157,7 +184,7 @@ class Writer: ...@@ -157,7 +184,7 @@ class Writer:
self.bit_mask_types = set([]) self.bit_mask_types = set([])
# List of generated instructions builder/parser functions so far. # List of generated instructions builder/parser functions so far.
self.instruction_builder_prototypes = [] self.instruction_builder_prototypes = [BUILDER_HELPER_FUNCTION_PROTOTYPE]
self.instruction_builder_impl = [] self.instruction_builder_impl = []
self.instruction_parser_prototypes = [PARSER_FIXED_FUNCTIONS_PROTOTYPES] self.instruction_parser_prototypes = [PARSER_FIXED_FUNCTIONS_PROTOTYPES]
self.instruction_parser_impl = [PARSER_FIXED_FUNCTIONS] self.instruction_parser_impl = [PARSER_FIXED_FUNCTIONS]
......
...@@ -29,6 +29,28 @@ uint32_t MakeLengthOp(size_t length, spv::Op op) ...@@ -29,6 +29,28 @@ uint32_t MakeLengthOp(size_t length, spv::Op op)
} }
} // anonymous namespace } // anonymous namespace
void WriteSpirvHeader(std::vector<uint32_t> *blob, uint32_t idCount)
{
// Header:
//
// - Magic number
// - Version (1.0)
// - ANGLE's Generator number:
// * 24 for tool id (higher 16 bits)
// * 0 for tool version (lower 16 bits))
// - Bound (idCount)
// - 0 (reserved)
constexpr uint32_t kANGLEGeneratorId = 24;
ASSERT(blob->empty());
blob->push_back(spv::MagicNumber);
blob->push_back(0x00010000);
blob->push_back(kANGLEGeneratorId << 16 | 0);
blob->push_back(idCount);
blob->push_back(0x00000000);
}
void WriteNop(std::vector<uint32_t> *blob) void WriteNop(std::vector<uint32_t> *blob)
{ {
const size_t startSize = blob->size(); const size_t startSize = blob->size();
......
...@@ -17,6 +17,8 @@ namespace angle ...@@ -17,6 +17,8 @@ namespace angle
{ {
namespace spirv namespace spirv
{ {
void WriteSpirvHeader(std::vector<uint32_t> *blob, uint32_t idCount);
void WriteNop(std::vector<uint32_t> *blob); void WriteNop(std::vector<uint32_t> *blob);
void WriteUndef(std::vector<uint32_t> *blob, IdResultType idResultType, IdResult idResult); void WriteUndef(std::vector<uint32_t> *blob, IdResultType idResultType, IdResult idResult);
void WriteSourceContinued(std::vector<uint32_t> *blob, LiteralString continuedSource); void WriteSourceContinued(std::vector<uint32_t> *blob, LiteralString continuedSource);
......
...@@ -5130,23 +5130,4 @@ angle::Result GlslangGetShaderSpirvCode(const GlslangErrorCallback &callback, ...@@ -5130,23 +5130,4 @@ angle::Result GlslangGetShaderSpirvCode(const GlslangErrorCallback &callback,
return angle::Result::Continue; return angle::Result::Continue;
} }
angle::Result GlslangCompileShaderOneOff(const GlslangErrorCallback &callback,
gl::ShaderType shaderType,
const std::string &shaderSource,
SpirvBlob *spirvBlobOut)
{
const TBuiltInResource builtInResources(glslang::DefaultTBuiltInResource);
glslang::TShader shader(kShLanguageMap[shaderType]);
glslang::TProgram program;
ANGLE_TRY(
CompileShader(callback, builtInResources, shaderType, shaderSource, &shader, &program));
ANGLE_TRY(LinkProgram(callback, &program));
glslang::TIntermediate *intermediate = program.getIntermediate(kShLanguageMap[shaderType]);
glslang::GlslangToSpv(*intermediate, *spirvBlobOut);
return angle::Result::Continue;
}
} // namespace rx } // namespace rx
...@@ -212,11 +212,6 @@ angle::Result GlslangGetShaderSpirvCode(const GlslangErrorCallback &callback, ...@@ -212,11 +212,6 @@ angle::Result GlslangGetShaderSpirvCode(const GlslangErrorCallback &callback,
const gl::ShaderMap<std::string> &shaderSources, const gl::ShaderMap<std::string> &shaderSources,
gl::ShaderMap<SpirvBlob> *spirvBlobsOut); gl::ShaderMap<SpirvBlob> *spirvBlobsOut);
angle::Result GlslangCompileShaderOneOff(const GlslangErrorCallback &callback,
gl::ShaderType shaderType,
const std::string &shaderSource,
SpirvBlob *spirvBlobOut);
} // namespace rx } // namespace rx
#endif // LIBANGLE_RENDERER_GLSLANG_WRAPPER_UTILS_H_ #endif // LIBANGLE_RENDERER_GLSLANG_WRAPPER_UTILS_H_
...@@ -221,6 +221,8 @@ angle_source_set("angle_vulkan_backend") { ...@@ -221,6 +221,8 @@ angle_source_set("angle_vulkan_backend") {
"$angle_root:angle_compression", "$angle_root:angle_compression",
"$angle_root:angle_gpu_info_util", "$angle_root:angle_gpu_info_util",
"$angle_root:angle_image_util", "$angle_root:angle_image_util",
"$angle_root/src/common/spirv:angle_spirv_builder",
"$angle_spirv_headers_dir:spv_headers",
] ]
public_deps = [ public_deps = [
......
...@@ -93,15 +93,4 @@ angle::Result GlslangWrapperVk::TransformSpirV( ...@@ -93,15 +93,4 @@ angle::Result GlslangWrapperVk::TransformSpirV(
[context](GlslangError error) { return ErrorHandler(context, error); }, options, [context](GlslangError error) { return ErrorHandler(context, error); }, options,
variableInfoMap, initialSpirvBlob, shaderCodeOut); variableInfoMap, initialSpirvBlob, shaderCodeOut);
} }
// static
angle::Result GlslangWrapperVk::CompileShaderOneOff(vk::Context *context,
gl::ShaderType shaderType,
const std::string &shaderSource,
SpirvBlob *spirvBlobOut)
{
return GlslangCompileShaderOneOff(
[context](GlslangError error) { return ErrorHandler(context, error); }, shaderType,
shaderSource, spirvBlobOut);
}
} // namespace rx } // namespace rx
...@@ -48,11 +48,6 @@ class GlslangWrapperVk ...@@ -48,11 +48,6 @@ class GlslangWrapperVk
const ShaderInterfaceVariableInfoMap &variableInfoMap, const ShaderInterfaceVariableInfoMap &variableInfoMap,
const SpirvBlob &initialSpirvBlob, const SpirvBlob &initialSpirvBlob,
SpirvBlob *shaderCodeOut); SpirvBlob *shaderCodeOut);
static angle::Result CompileShaderOneOff(vk::Context *context,
gl::ShaderType shaderType,
const std::string &shaderSource,
SpirvBlob *spirvBlobOut);
}; };
} // 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