Clarify mapping of target env to SPIR-V version (#3150)

* Clarify mapping of target env to SPIR-V version

It depends on the API method.

* Update SPIR-V version comments on validator
This commit is contained in:
David Neto 2020-01-24 16:26:07 -05:00 коммит произвёл GitHub
Родитель e7afeb060e
Коммит 5d786f6cc7
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 79 добавлений и 9 удалений

Просмотреть файл

@ -419,8 +419,17 @@ SPIRV_TOOLS_EXPORT const char* spvSoftwareVersionString(void);
SPIRV_TOOLS_EXPORT const char* spvSoftwareVersionDetailsString(void); SPIRV_TOOLS_EXPORT const char* spvSoftwareVersionDetailsString(void);
// Certain target environments impose additional restrictions on SPIR-V, so it's // Certain target environments impose additional restrictions on SPIR-V, so it's
// often necessary to specify which one applies. SPV_ENV_UNIVERSAL means // often necessary to specify which one applies. SPV_ENV_UNIVERSAL_* implies an
// environment-agnostic SPIR-V. // environment-agnostic SPIR-V.
//
// When an API method needs to derive a SPIR-V version from a target environment
// (from the spv_context object), the method will choose the highest version of
// SPIR-V supported by the target environment. Examples:
// SPV_ENV_VULKAN_1_0 -> SPIR-V 1.0
// SPV_ENV_VULKAN_1_1 -> SPIR-V 1.3
// SPV_ENV_VULKAN_1_1_SPIRV_1_4 -> SPIR-V 1.4
// SPV_ENV_VULKAN_1_2 -> SPIR-V 1.5
// Consult the description of API entry points for specific rules.
typedef enum { typedef enum {
SPV_ENV_UNIVERSAL_1_0, // SPIR-V 1.0 latest revision, no other restrictions. SPV_ENV_UNIVERSAL_1_0, // SPIR-V 1.0 latest revision, no other restrictions.
SPV_ENV_VULKAN_1_0, // Vulkan 1.0 latest revision. SPV_ENV_VULKAN_1_0, // Vulkan 1.0 latest revision.
@ -448,7 +457,10 @@ typedef enum {
SPV_ENV_VULKAN_1_1, // Vulkan 1.1 latest revision. SPV_ENV_VULKAN_1_1, // Vulkan 1.1 latest revision.
SPV_ENV_WEBGPU_0, // Work in progress WebGPU 1.0. SPV_ENV_WEBGPU_0, // Work in progress WebGPU 1.0.
SPV_ENV_UNIVERSAL_1_4, // SPIR-V 1.4 latest revision, no other restrictions. SPV_ENV_UNIVERSAL_1_4, // SPIR-V 1.4 latest revision, no other restrictions.
SPV_ENV_VULKAN_1_1_SPIRV_1_4, // Vulkan 1.1 with SPIR-V 1.4 binary.
// Vulkan 1.1 with VK_KHR_spirv_1_4, i.e. SPIR-V 1.4 binary.
SPV_ENV_VULKAN_1_1_SPIRV_1_4,
SPV_ENV_UNIVERSAL_1_5, // SPIR-V 1.5 latest revision, no other restrictions. SPV_ENV_UNIVERSAL_1_5, // SPIR-V 1.5 latest revision, no other restrictions.
SPV_ENV_VULKAN_1_2, // Vulkan 1.2 latest revision. SPV_ENV_VULKAN_1_2, // Vulkan 1.2 latest revision.
} spv_target_env; } spv_target_env;
@ -486,7 +498,11 @@ SPIRV_TOOLS_EXPORT bool spvParseVulkanEnv(uint32_t vulkan_ver,
uint32_t spirv_ver, uint32_t spirv_ver,
spv_target_env* env); spv_target_env* env);
// Creates a context object. Returns null if env is invalid. // Creates a context object for most of the SPIRV-Tools API.
// Returns null if env is invalid.
//
// See specific API calls for how the target environment is interpeted
// (particularly assembly and validation).
SPIRV_TOOLS_EXPORT spv_context spvContextCreate(spv_target_env env); SPIRV_TOOLS_EXPORT spv_context spvContextCreate(spv_target_env env);
// Destroys the given context object. // Destroys the given context object.
@ -667,6 +683,8 @@ SPIRV_TOOLS_EXPORT void spvFuzzerOptionsEnableFuzzerPassValidation(
// be stored into *binary. Any error will be written into *diagnostic if // be stored into *binary. Any error will be written into *diagnostic if
// diagnostic is non-null, otherwise the context's message consumer will be // diagnostic is non-null, otherwise the context's message consumer will be
// used. The generated binary is independent of the context and may outlive it. // used. The generated binary is independent of the context and may outlive it.
// The SPIR-V binary version is set to the highest version of SPIR-V supported
// by the context's target environment.
SPIRV_TOOLS_EXPORT spv_result_t spvTextToBinary(const spv_const_context context, SPIRV_TOOLS_EXPORT spv_result_t spvTextToBinary(const spv_const_context context,
const char* text, const char* text,
const size_t length, const size_t length,
@ -704,6 +722,12 @@ SPIRV_TOOLS_EXPORT void spvBinaryDestroy(spv_binary binary);
// Validates a SPIR-V binary for correctness. Any errors will be written into // Validates a SPIR-V binary for correctness. Any errors will be written into
// *diagnostic if diagnostic is non-null, otherwise the context's message // *diagnostic if diagnostic is non-null, otherwise the context's message
// consumer will be used. // consumer will be used.
//
// Validate for SPIR-V spec rules for the SPIR-V version named in the
// binary's header (at word offset 1). Additionally, if the context target
// environment is a client API (such as Vulkan 1.1), then validate for that
// client API version, to the extent that it is verifiable from data in the
// binary itself.
SPIRV_TOOLS_EXPORT spv_result_t spvValidate(const spv_const_context context, SPIRV_TOOLS_EXPORT spv_result_t spvValidate(const spv_const_context context,
const spv_const_binary binary, const spv_const_binary binary,
spv_diagnostic* diagnostic); spv_diagnostic* diagnostic);
@ -711,6 +735,12 @@ SPIRV_TOOLS_EXPORT spv_result_t spvValidate(const spv_const_context context,
// Validates a SPIR-V binary for correctness. Uses the provided Validator // Validates a SPIR-V binary for correctness. Uses the provided Validator
// options. Any errors will be written into *diagnostic if diagnostic is // options. Any errors will be written into *diagnostic if diagnostic is
// non-null, otherwise the context's message consumer will be used. // non-null, otherwise the context's message consumer will be used.
//
// Validate for SPIR-V spec rules for the SPIR-V version named in the
// binary's header (at word offset 1). Additionally, if the context target
// environment is a client API (such as Vulkan 1.1), then validate for that
// client API version, to the extent that it is verifiable from data in the
// binary itself, or in the validator options.
SPIRV_TOOLS_EXPORT spv_result_t spvValidateWithOptions( SPIRV_TOOLS_EXPORT spv_result_t spvValidateWithOptions(
const spv_const_context context, const spv_const_validator_options options, const spv_const_context context, const spv_const_validator_options options,
const spv_const_binary binary, spv_diagnostic* diagnostic); const spv_const_binary binary, spv_diagnostic* diagnostic);

Просмотреть файл

@ -36,6 +36,9 @@ class Context {
public: public:
// Constructs a context targeting the given environment |env|. // Constructs a context targeting the given environment |env|.
// //
// See specific API calls for how the target environment is interpeted
// (particularly assembly and validation).
//
// The constructed instance will have an empty message consumer, which just // The constructed instance will have an empty message consumer, which just
// ignores all messages from the library. Use SetMessageConsumer() to supply // ignores all messages from the library. Use SetMessageConsumer() to supply
// one if messages are of concern. // one if messages are of concern.
@ -279,16 +282,20 @@ class SpirvTools {
// Assembles the given assembly |text| and writes the result to |binary|. // Assembles the given assembly |text| and writes the result to |binary|.
// Returns true on successful assembling. |binary| will be kept untouched if // Returns true on successful assembling. |binary| will be kept untouched if
// assembling is unsuccessful. // assembling is unsuccessful.
// The SPIR-V binary version is set to the highest version of SPIR-V supported
// by the target environment with which this SpirvTools object was created.
bool Assemble(const std::string& text, std::vector<uint32_t>* binary, bool Assemble(const std::string& text, std::vector<uint32_t>* binary,
uint32_t options = kDefaultAssembleOption) const; uint32_t options = kDefaultAssembleOption) const;
// |text_size| specifies the number of bytes in |text|. A terminating null // |text_size| specifies the number of bytes in |text|. A terminating null
// character is not required to present in |text| as long as |text| is valid. // character is not required to present in |text| as long as |text| is valid.
// The SPIR-V binary version is set to the highest version of SPIR-V supported
// by the target environment with which this SpirvTools object was created.
bool Assemble(const char* text, size_t text_size, bool Assemble(const char* text, size_t text_size,
std::vector<uint32_t>* binary, std::vector<uint32_t>* binary,
uint32_t options = kDefaultAssembleOption) const; uint32_t options = kDefaultAssembleOption) const;
// Disassembles the given SPIR-V |binary| with the given |options| and writes // Disassembles the given SPIR-V |binary| with the given |options| and writes
// the assembly to |text|. Returns ture on successful disassembling. |text| // the assembly to |text|. Returns true on successful disassembling. |text|
// will be kept untouched if diassembling is unsuccessful. // will be kept untouched if diassembling is unsuccessful.
bool Disassemble(const std::vector<uint32_t>& binary, std::string* text, bool Disassemble(const std::vector<uint32_t>& binary, std::string* text,
uint32_t options = kDefaultDisassembleOption) const; uint32_t options = kDefaultDisassembleOption) const;
@ -300,10 +307,26 @@ class SpirvTools {
// Validates the given SPIR-V |binary|. Returns true if no issues are found. // Validates the given SPIR-V |binary|. Returns true if no issues are found.
// Otherwise, returns false and communicates issues via the message consumer // Otherwise, returns false and communicates issues via the message consumer
// registered. // registered.
// Validates for SPIR-V spec rules for the SPIR-V version named in the
// binary's header (at word offset 1). Additionally, if the target
// environment is a client API (such as Vulkan 1.1), then validate for that
// client API version, to the extent that it is verifiable from data in the
// binary itself.
bool Validate(const std::vector<uint32_t>& binary) const; bool Validate(const std::vector<uint32_t>& binary) const;
// Like the previous overload, but provides the binary as a pointer and size:
// |binary_size| specifies the number of words in |binary|. // |binary_size| specifies the number of words in |binary|.
// Validates for SPIR-V spec rules for the SPIR-V version named in the
// binary's header (at word offset 1). Additionally, if the target
// environment is a client API (such as Vulkan 1.1), then validate for that
// client API version, to the extent that it is verifiable from data in the
// binary itself.
bool Validate(const uint32_t* binary, size_t binary_size) const; bool Validate(const uint32_t* binary, size_t binary_size) const;
// Like the previous overload, but takes an options object. // Like the previous overload, but takes an options object.
// Validates for SPIR-V spec rules for the SPIR-V version named in the
// binary's header (at word offset 1). Additionally, if the target
// environment is a client API (such as Vulkan 1.1), then validate for that
// client API version, to the extent that it is verifiable from data in the
// binary itself, or in the validator options.
bool Validate(const uint32_t* binary, size_t binary_size, bool Validate(const uint32_t* binary, size_t binary_size,
spv_validator_options options) const; spv_validator_options options) const;

Просмотреть файл

@ -65,9 +65,9 @@ class Optimizer {
// Constructs an instance with the given target |env|, which is used to decode // Constructs an instance with the given target |env|, which is used to decode
// the binaries to be optimized later. // the binaries to be optimized later.
// //
// The constructed instance will have an empty message consumer, which just // The instance will have an empty message consumer, which ignores all
// ignores all messages from the library. Use SetMessageConsumer() to supply // messages from the library. Use SetMessageConsumer() to supply a consumer
// one if messages are of concern. // if messages are of concern.
// //
// For collections of passes that are meant to transform the input into // For collections of passes that are meant to transform the input into
// another execution environment, then the source environment should be // another execution environment, then the source environment should be
@ -164,17 +164,26 @@ class Optimizer {
bool FlagHasValidForm(const std::string& flag) const; bool FlagHasValidForm(const std::string& flag) const;
// Allows changing, after creation time, the target environment to be // Allows changing, after creation time, the target environment to be
// optimized for. Should be called before calling Run(). // optimized for and validated. Should be called before calling Run().
void SetTargetEnv(const spv_target_env env); void SetTargetEnv(const spv_target_env env);
// Optimizes the given SPIR-V module |original_binary| and writes the // Optimizes the given SPIR-V module |original_binary| and writes the
// optimized binary into |optimized_binary|. // optimized binary into |optimized_binary|. The optimized binary uses
// the same SPIR-V version as the original binary.
//
// Returns true on successful optimization, whether or not the module is // Returns true on successful optimization, whether or not the module is
// modified. Returns false if |original_binary| fails to validate or if errors // modified. Returns false if |original_binary| fails to validate or if errors
// occur when processing |original_binary| using any of the registered passes. // occur when processing |original_binary| using any of the registered passes.
// In that case, no further passes are executed and the contents in // In that case, no further passes are executed and the contents in
// |optimized_binary| may be invalid. // |optimized_binary| may be invalid.
// //
// By default, the binary is validated before any transforms are performed,
// and optionally after each transform. Validation uses SPIR-V spec rules
// for the SPIR-V version named in the binary's header (at word offset 1).
// Additionally, if the target environment is a client API (such as
// Vulkan 1.1), then validate for that client API version, to the extent
// that it is verifiable from data in the binary itself.
//
// It's allowed to alias |original_binary| to the start of |optimized_binary|. // It's allowed to alias |original_binary| to the start of |optimized_binary|.
bool Run(const uint32_t* original_binary, size_t original_binary_size, bool Run(const uint32_t* original_binary, size_t original_binary_size,
std::vector<uint32_t>* optimized_binary) const; std::vector<uint32_t>* optimized_binary) const;
@ -190,6 +199,14 @@ class Optimizer {
// Same as above, except it takes an options object. See the documentation // Same as above, except it takes an options object. See the documentation
// for |OptimizerOptions| to see which options can be set. // for |OptimizerOptions| to see which options can be set.
//
// By default, the binary is validated before any transforms are performed,
// and optionally after each transform. Validation uses SPIR-V spec rules
// for the SPIR-V version named in the binary's header (at word offset 1).
// Additionally, if the target environment is a client API (such as
// Vulkan 1.1), then validate for that client API version, to the extent
// that it is verifiable from data in the binary itself, or from the
// validator options set on the optimizer options.
bool Run(const uint32_t* original_binary, const size_t original_binary_size, bool Run(const uint32_t* original_binary, const size_t original_binary_size,
std::vector<uint32_t>* optimized_binary, std::vector<uint32_t>* optimized_binary,
const spv_optimizer_options opt_options) const; const spv_optimizer_options opt_options) const;