Commit da4aa8b8 by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Move SPIR-V validation function to common/

For future use by the translator. Bug: angleproject:4889 Change-Id: I051ad48e6edb58ce3055c5fd276c18a6e29a66ac Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2717020 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 67333608
...@@ -691,6 +691,7 @@ if (angle_enable_vulkan || angle_enable_metal) { ...@@ -691,6 +691,7 @@ if (angle_enable_vulkan || angle_enable_metal) {
] ]
deps = [ deps = [
":libANGLE_headers", ":libANGLE_headers",
"$angle_root/src/common/spirv:angle_spirv_base",
"$angle_root/src/common/spirv:angle_spirv_builder", "$angle_root/src/common/spirv:angle_spirv_builder",
"$angle_root/src/common/spirv:angle_spirv_parser", "$angle_root/src/common/spirv:angle_spirv_parser",
"${angle_glslang_dir}:glslang_default_resource_limits_sources", "${angle_glslang_dir}:glslang_default_resource_limits_sources",
......
{ {
"src/common/spirv/gen_spirv_builder_and_parser.py": "src/common/spirv/gen_spirv_builder_and_parser.py":
"4c57f0814056b5b5e80494380854371f", "60a5245905287df8a9fb55be33acfc48",
"src/common/spirv/spirv_instruction_builder_autogen.cpp": "src/common/spirv/spirv_instruction_builder_autogen.cpp":
"6ea97ca168ecccb4a621a06446e4933a", "6ea97ca168ecccb4a621a06446e4933a",
"src/common/spirv/spirv_instruction_builder_autogen.h": "src/common/spirv/spirv_instruction_builder_autogen.h":
"aa4980783495c40873598156b02b7784", "7f0130816be26511615f7b1e33fda196",
"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":
"68c5746bc94e6b9f891ff2a11869ccd1", "c35834942632d4cd1587bf7d66721df7",
"third_party/vulkan-deps/spirv-headers/src/include/spirv/1.0/spirv.core.grammar.json": "third_party/vulkan-deps/spirv-headers/src/include/spirv/1.0/spirv.core.grammar.json":
"a8c4239344b2fc10bfc4ace7ddee1867" "a8c4239344b2fc10bfc4ace7ddee1867"
} }
\ No newline at end of file
...@@ -4,13 +4,29 @@ ...@@ -4,13 +4,29 @@
import("../../../gni/angle.gni") import("../../../gni/angle.gni")
angle_source_set("angle_spirv_base") {
sources = [
"angle_spirv_utils.cpp",
"spirv_types.h",
]
deps = [
"$angle_root:angle_common",
"${angle_spirv_headers_dir}:spv_headers",
"${angle_spirv_tools_dir}:spvtools_headers",
]
if (dcheck_always_on || is_debug) {
deps += [ "$angle_spirv_tools_dir:spvtools_val" ]
}
}
angle_source_set("angle_spirv_builder") { angle_source_set("angle_spirv_builder") {
sources = [ sources = [
"spirv_instruction_builder_autogen.cpp", "spirv_instruction_builder_autogen.cpp",
"spirv_instruction_builder_autogen.h", "spirv_instruction_builder_autogen.h",
"spirv_types.h",
] ]
deps = [ deps = [
":angle_spirv_base",
"$angle_root:angle_common", "$angle_root:angle_common",
"${angle_spirv_headers_dir}:spv_headers", "${angle_spirv_headers_dir}:spv_headers",
] ]
...@@ -20,9 +36,9 @@ angle_source_set("angle_spirv_parser") { ...@@ -20,9 +36,9 @@ angle_source_set("angle_spirv_parser") {
sources = [ sources = [
"spirv_instruction_parser_autogen.cpp", "spirv_instruction_parser_autogen.cpp",
"spirv_instruction_parser_autogen.h", "spirv_instruction_parser_autogen.h",
"spirv_types.h",
] ]
deps = [ deps = [
":angle_spirv_base",
"$angle_root:angle_common", "$angle_root:angle_common",
"${angle_spirv_headers_dir}:spv_headers", "${angle_spirv_headers_dir}:spv_headers",
] ]
......
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// spirv_types.cpp:
// Helper SPIR-V functions.
#include "spirv_types.h"
// SPIR-V tools include for AST validation.
#include <spirv-tools/libspirv.hpp>
namespace angle
{
namespace spirv
{
#if defined(ANGLE_ENABLE_ASSERTS)
namespace
{
void ValidateSpirvMessage(spv_message_level_t level,
const char *source,
const spv_position_t &position,
const char *message)
{
WARN() << "Level" << level << ": " << message;
}
} // anonymous namespace
bool Validate(const std::vector<uint32_t> &blob)
{
spvtools::SpirvTools spirvTools(SPV_ENV_VULKAN_1_1);
spirvTools.SetMessageConsumer(ValidateSpirvMessage);
bool result = spirvTools.Validate(blob);
if (!result)
{
std::string readableSpirv;
spirvTools.Disassemble(blob, &readableSpirv, 0);
WARN() << "Invalid SPIR-V:\n" << readableSpirv;
}
return result;
}
#else // ANGLE_ENABLE_ASSERTS
bool Validate(const std::vector<uint32_t> &blob)
{
// Placeholder implementation since this is only used inside an ASSERT().
// Return false to indicate an error in case this is ever accidentally used somewhere else.
return false;
}
#endif // ANGLE_ENABLE_ASSERTS
} // namespace spirv
} // namespace angle
...@@ -41,8 +41,6 @@ HEADER_TEMPLATE = """// GENERATED FILE - DO NOT EDIT. ...@@ -41,8 +41,6 @@ HEADER_TEMPLATE = """// GENERATED FILE - DO NOT EDIT.
#ifndef COMMON_SPIRV_{file_name_capitalized}AUTOGEN_H_ #ifndef COMMON_SPIRV_{file_name_capitalized}AUTOGEN_H_
#define COMMON_SPIRV_{file_name_capitalized}AUTOGEN_H_ #define COMMON_SPIRV_{file_name_capitalized}AUTOGEN_H_
#include <vector>
#include "spirv_types.h" #include "spirv_types.h"
namespace angle namespace angle
......
...@@ -11,8 +11,6 @@ ...@@ -11,8 +11,6 @@
#ifndef COMMON_SPIRV_SPIRVINSTRUCTIONBUILDERAUTOGEN_H_ #ifndef COMMON_SPIRV_SPIRVINSTRUCTIONBUILDERAUTOGEN_H_
#define COMMON_SPIRV_SPIRVINSTRUCTIONBUILDERAUTOGEN_H_ #define COMMON_SPIRV_SPIRVINSTRUCTIONBUILDERAUTOGEN_H_
#include <vector>
#include "spirv_types.h" #include "spirv_types.h"
namespace angle namespace angle
......
...@@ -11,8 +11,6 @@ ...@@ -11,8 +11,6 @@
#ifndef COMMON_SPIRV_SPIRVINSTRUCTIONPARSERAUTOGEN_H_ #ifndef COMMON_SPIRV_SPIRVINSTRUCTIONPARSERAUTOGEN_H_
#define COMMON_SPIRV_SPIRVINSTRUCTIONPARSERAUTOGEN_H_ #define COMMON_SPIRV_SPIRVINSTRUCTIONPARSERAUTOGEN_H_
#include <vector>
#include "spirv_types.h" #include "spirv_types.h"
namespace angle namespace angle
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include "common/FastVector.h" #include "common/FastVector.h"
#include <vector>
namespace angle namespace angle
{ {
namespace spirv namespace spirv
...@@ -107,6 +109,10 @@ using PairIdRefIdRefList = FastVectorHelper<PairIdRefIdRef>; ...@@ -107,6 +109,10 @@ using PairIdRefIdRefList = FastVectorHelper<PairIdRefIdRef>;
// Id 0 is invalid in SPIR-V. // Id 0 is invalid in SPIR-V.
constexpr uint32_t kMinValidId = 1; constexpr uint32_t kMinValidId = 1;
// Returns whether SPIR-V is valid. Useful for ASSERTs. Automatically generates a warning if
// SPIR-V is not valid.
bool Validate(const std::vector<uint32_t> &blob);
} // namespace spirv } // namespace spirv
} // namespace angle } // namespace angle
......
...@@ -24,9 +24,6 @@ ANGLE_REENABLE_SUGGEST_OVERRIDE_WARNINGS ...@@ -24,9 +24,6 @@ ANGLE_REENABLE_SUGGEST_OVERRIDE_WARNINGS
ANGLE_REENABLE_SHADOWING_WARNING ANGLE_REENABLE_SHADOWING_WARNING
ANGLE_REENABLE_EXTRA_SEMI_WARNING ANGLE_REENABLE_EXTRA_SEMI_WARNING
// SPIR-V tools include for AST validation.
#include <spirv-tools/libspirv.hpp>
#include <array> #include <array>
#include <numeric> #include <numeric>
...@@ -1065,40 +1062,6 @@ angle::Result LinkProgram(const GlslangErrorCallback &callback, glslang::TProgra ...@@ -1065,40 +1062,6 @@ angle::Result LinkProgram(const GlslangErrorCallback &callback, glslang::TProgra
return angle::Result::Continue; return angle::Result::Continue;
} }
#if defined(ANGLE_ENABLE_ASSERTS)
void ValidateSpirvMessage(spv_message_level_t level,
const char *source,
const spv_position_t &position,
const char *message)
{
WARN() << "Level" << level << ": " << message;
}
bool ValidateSpirv(const std::vector<uint32_t> &spirvBlob)
{
spvtools::SpirvTools spirvTools(SPV_ENV_VULKAN_1_1);
spirvTools.SetMessageConsumer(ValidateSpirvMessage);
bool result = spirvTools.Validate(spirvBlob);
if (!result)
{
std::string readableSpirv;
spirvTools.Disassemble(spirvBlob, &readableSpirv, 0);
WARN() << "Invalid SPIR-V:\n" << readableSpirv;
}
return result;
}
#else // ANGLE_ENABLE_ASSERTS
bool ValidateSpirv(const std::vector<uint32_t> &spirvBlob)
{
// Placeholder implementation since this is only used inside an ASSERT().
// Return false to indicate an error in case this is ever accidentally used somewhere else.
return false;
}
#endif // ANGLE_ENABLE_ASSERTS
// Base class for SPIR-V transformations. // Base class for SPIR-V transformations.
class SpirvTransformerBase : angle::NonCopyable class SpirvTransformerBase : angle::NonCopyable
{ {
...@@ -5109,7 +5072,7 @@ angle::Result GlslangTransformSpirvCode(const GlslangErrorCallback &callback, ...@@ -5109,7 +5072,7 @@ angle::Result GlslangTransformSpirvCode(const GlslangErrorCallback &callback,
ANGLE_GLSLANG_CHECK(callback, aliasingTransformer.transform(), GlslangError::InvalidSpirv); ANGLE_GLSLANG_CHECK(callback, aliasingTransformer.transform(), GlslangError::InvalidSpirv);
} }
ASSERT(ValidateSpirv(*spirvBlobOut)); ASSERT(spirv::Validate(*spirvBlobOut));
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -223,10 +223,6 @@ angle_source_set("angle_vulkan_backend") { ...@@ -223,10 +223,6 @@ angle_source_set("angle_vulkan_backend") {
"$angle_root:angle_image_util", "$angle_root:angle_image_util",
] ]
if (dcheck_always_on || is_debug) {
deps += [ "$angle_spirv_tools_dir:spvtools_val" ]
}
public_deps = [ public_deps = [
"$angle_root:angle_glslang_wrapper", "$angle_root:angle_glslang_wrapper",
"$angle_root:libANGLE_headers", "$angle_root:libANGLE_headers",
......
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