|  | // Copyright 2020 The Tint Authors. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | #ifndef SRC_TINT_INSPECTOR_INSPECTOR_H_ | 
|  | #define SRC_TINT_INSPECTOR_INSPECTOR_H_ | 
|  |  | 
|  | #include <map> | 
|  | #include <memory> | 
|  | #include <string> | 
|  | #include <tuple> | 
|  | #include <unordered_map> | 
|  | #include <utility> | 
|  | #include <vector> | 
|  |  | 
|  | #include "tint/override_id.h" | 
|  |  | 
|  | #include "src/tint/builtin/builtin_value.h" | 
|  | #include "src/tint/inspector/entry_point.h" | 
|  | #include "src/tint/inspector/resource_binding.h" | 
|  | #include "src/tint/inspector/scalar.h" | 
|  | #include "src/tint/program.h" | 
|  | #include "src/tint/sem/sampler_texture_pair.h" | 
|  | #include "src/tint/utils/unique_vector.h" | 
|  |  | 
|  | namespace tint::inspector { | 
|  |  | 
|  | /// A temporary alias to sem::SamplerTexturePair. [DEPRECATED] | 
|  | using SamplerTexturePair = sem::SamplerTexturePair; | 
|  |  | 
|  | /// Extracts information from a program | 
|  | class Inspector { | 
|  | public: | 
|  | /// Constructor | 
|  | /// @param program Shader program to extract information from. | 
|  | explicit Inspector(const Program* program); | 
|  |  | 
|  | /// Destructor | 
|  | ~Inspector(); | 
|  |  | 
|  | /// @returns error messages from the Inspector | 
|  | std::string error() { return diagnostics_.str(); } | 
|  | /// @returns true if an error was encountered | 
|  | bool has_error() const { return diagnostics_.contains_errors(); } | 
|  |  | 
|  | /// @returns vector of entry point information | 
|  | std::vector<EntryPoint> GetEntryPoints(); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about | 
|  | /// @returns the entry point information | 
|  | EntryPoint GetEntryPoint(const std::string& entry_point); | 
|  |  | 
|  | /// @returns map of override identifier to initial value | 
|  | std::map<OverrideId, Scalar> GetOverrideDefaultValues(); | 
|  |  | 
|  | /// @returns map of module-constant name to pipeline constant ID | 
|  | std::map<std::string, OverrideId> GetNamedOverrideIds(); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns the total size of shared storage required by an entry point, | 
|  | ///          including all uniform storage buffers. | 
|  | uint32_t GetStorageSize(const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the resource bindings. | 
|  | std::vector<ResourceBinding> GetResourceBindings(const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for uniform buffers. | 
|  | std::vector<ResourceBinding> GetUniformBufferResourceBindings(const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for storage buffers. | 
|  | std::vector<ResourceBinding> GetStorageBufferResourceBindings(const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for read-only storage buffers. | 
|  | std::vector<ResourceBinding> GetReadOnlyStorageBufferResourceBindings( | 
|  | const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for regular samplers. | 
|  | std::vector<ResourceBinding> GetSamplerResourceBindings(const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for comparison samplers. | 
|  | std::vector<ResourceBinding> GetComparisonSamplerResourceBindings( | 
|  | const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for sampled textures. | 
|  | std::vector<ResourceBinding> GetSampledTextureResourceBindings(const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for multisampled textures. | 
|  | std::vector<ResourceBinding> GetMultisampledTextureResourceBindings( | 
|  | const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for write-only storage textures. | 
|  | std::vector<ResourceBinding> GetWriteOnlyStorageTextureResourceBindings( | 
|  | const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for depth textures. | 
|  | std::vector<ResourceBinding> GetDepthTextureResourceBindings(const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for depth textures. | 
|  | std::vector<ResourceBinding> GetDepthMultisampledTextureResourceBindings( | 
|  | const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for external textures. | 
|  | std::vector<ResourceBinding> GetExternalTextureResourceBindings(const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the sampler/texture sampling pairs that are used | 
|  | /// by that entry point. | 
|  | utils::VectorRef<SamplerTexturePair> GetSamplerTextureUses(const std::string& entry_point); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @param placeholder the sampler binding point to use for texture-only | 
|  | /// access (e.g., textureLoad) | 
|  | /// @returns vector of all of the sampler/texture sampling pairs that are used | 
|  | /// by that entry point. | 
|  | std::vector<SamplerTexturePair> GetSamplerTextureUses(const std::string& entry_point, | 
|  | const sem::BindingPoint& placeholder); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns the total size in bytes of all Workgroup storage-class storage | 
|  | /// referenced transitively by the entry point. | 
|  | uint32_t GetWorkgroupStorageSize(const std::string& entry_point); | 
|  |  | 
|  | /// @returns vector of all valid extension names used by the program. There | 
|  | /// will be no duplicated names in the returned vector even if an extension | 
|  | /// is enabled multiple times. | 
|  | std::vector<std::string> GetUsedExtensionNames(); | 
|  |  | 
|  | /// @returns vector of all enable directives used by the program, each | 
|  | /// enable directive represented by a std::pair<std::string, | 
|  | /// tint::Source::Range> for its extension name and its location of the | 
|  | /// extension name. There may be multiple enable directives for a same | 
|  | /// extension. | 
|  | std::vector<std::pair<std::string, Source>> GetEnableDirectives(); | 
|  |  | 
|  | private: | 
|  | const Program* program_; | 
|  | diag::List diagnostics_; | 
|  | std::unique_ptr<std::unordered_map<std::string, utils::UniqueVector<SamplerTexturePair, 4>>> | 
|  | sampler_targets_; | 
|  |  | 
|  | /// @param name name of the entry point to find | 
|  | /// @returns a pointer to the entry point if it exists, otherwise returns | 
|  | ///          nullptr and sets the error string. | 
|  | const ast::Function* FindEntryPointByName(const std::string& name); | 
|  |  | 
|  | /// Recursively add entry point IO variables. | 
|  | /// If `type` is a struct, recurse into members, appending the member name. | 
|  | /// Otherwise, add the variable unless it is a builtin. | 
|  | /// @param name the name of the variable being added | 
|  | /// @param type the type of the variable | 
|  | /// @param attributes the variable attributes | 
|  | /// @param location the location value if provided | 
|  | /// @param variables the list to add the variables to | 
|  | void AddEntryPointInOutVariables(std::string name, | 
|  | const type::Type* type, | 
|  | utils::VectorRef<const ast::Attribute*> attributes, | 
|  | std::optional<uint32_t> location, | 
|  | std::vector<StageVariable>& variables) const; | 
|  |  | 
|  | /// Recursively determine if the type contains builtin. | 
|  | /// If `type` is a struct, recurse into members to check for the attribute. | 
|  | /// Otherwise, check `attributes` for the attribute. | 
|  | bool ContainsBuiltin(builtin::BuiltinValue builtin, | 
|  | const type::Type* type, | 
|  | utils::VectorRef<const ast::Attribute*> attributes) const; | 
|  |  | 
|  | /// Gathers all the texture resource bindings of the given type for the given | 
|  | /// entry point. | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @param texture_type the type of the textures to gather. | 
|  | /// @param resource_type the ResourceBinding::ResourceType for the given | 
|  | /// texture type. | 
|  | /// @returns vector of all of the bindings for depth textures. | 
|  | std::vector<ResourceBinding> GetTextureResourceBindings( | 
|  | const std::string& entry_point, | 
|  | const tint::utils::TypeInfo* texture_type, | 
|  | ResourceBinding::ResourceType resource_type); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @param read_only if true get only read-only bindings, if false get | 
|  | ///                  write-only bindings. | 
|  | /// @returns vector of all of the bindings for the requested storage buffers. | 
|  | std::vector<ResourceBinding> GetStorageBufferResourceBindingsImpl( | 
|  | const std::string& entry_point, | 
|  | bool read_only); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @param multisampled_only only get multisampled textures if true, otherwise | 
|  | ///                          only get sampled textures. | 
|  | /// @returns vector of all of the bindings for the request storage buffers. | 
|  | std::vector<ResourceBinding> GetSampledTextureResourceBindingsImpl( | 
|  | const std::string& entry_point, | 
|  | bool multisampled_only); | 
|  |  | 
|  | /// @param entry_point name of the entry point to get information about. | 
|  | /// @returns vector of all of the bindings for the requested storage textures. | 
|  | std::vector<ResourceBinding> GetStorageTextureResourceBindingsImpl( | 
|  | const std::string& entry_point); | 
|  |  | 
|  | /// Constructs |sampler_targets_| if it hasn't already been instantiated. | 
|  | void GenerateSamplerTargets(); | 
|  |  | 
|  | /// @param type the type of the parameter or structure member | 
|  | /// @param attributes attributes associated with the parameter or structure member | 
|  | /// @returns the interpolation type and sampling modes for the value | 
|  | std::tuple<InterpolationType, InterpolationSampling> CalculateInterpolationData( | 
|  | const type::Type* type, | 
|  | utils::VectorRef<const ast::Attribute*> attributes) const; | 
|  |  | 
|  | /// For a N-uple of expressions, resolve to the appropriate global resources | 
|  | /// and call 'cb'. | 
|  | /// 'cb' may be called multiple times. | 
|  | /// Assumes that not being able to resolve the resources is an error, so will | 
|  | /// invoke TINT_ICE when that occurs. | 
|  | /// @tparam N number of expressions in the n-uple | 
|  | /// @tparam F type of the callback provided. | 
|  | /// @param exprs N-uple of expressions to resolve. | 
|  | /// @param cb is a callback function with the signature: | 
|  | /// `void(std::array<const sem::GlobalVariable*, N>)`, which is invoked | 
|  | /// whenever a set of expressions are resolved to globals. | 
|  | template <size_t N, typename F> | 
|  | void GetOriginatingResources(std::array<const ast::Expression*, N> exprs, F&& cb); | 
|  |  | 
|  | /// @param func the function of the entry point. Must be non-nullptr and true for IsEntryPoint() | 
|  | /// @returns the entry point information | 
|  | EntryPoint GetEntryPoint(const tint::ast::Function* func); | 
|  | }; | 
|  |  | 
|  | }  // namespace tint::inspector | 
|  |  | 
|  | #endif  // SRC_TINT_INSPECTOR_INSPECTOR_H_ |