|  | // 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_ENTRY_POINT_H_ | 
|  | #define SRC_TINT_INSPECTOR_ENTRY_POINT_H_ | 
|  |  | 
|  | #include <optional> | 
|  | #include <string> | 
|  | #include <tuple> | 
|  | #include <vector> | 
|  |  | 
|  | #include "tint/override_id.h" | 
|  |  | 
|  | #include "src/tint/ast/interpolate_attribute.h" | 
|  | #include "src/tint/ast/pipeline_stage.h" | 
|  |  | 
|  | namespace tint::inspector { | 
|  |  | 
|  | /// Base component type of a stage variable. | 
|  | enum class ComponentType { | 
|  | kUnknown = -1, | 
|  | kF32, | 
|  | kU32, | 
|  | kI32, | 
|  | kF16, | 
|  | }; | 
|  |  | 
|  | /// Composition of components of a stage variable. | 
|  | enum class CompositionType { | 
|  | kUnknown = -1, | 
|  | kScalar, | 
|  | kVec2, | 
|  | kVec3, | 
|  | kVec4, | 
|  | }; | 
|  |  | 
|  | /// Type of interpolation of a stage variable. | 
|  | enum class InterpolationType { kUnknown = -1, kPerspective, kLinear, kFlat }; | 
|  |  | 
|  | /// Type of interpolation sampling of a stage variable. | 
|  | enum class InterpolationSampling { kUnknown = -1, kNone, kCenter, kCentroid, kSample }; | 
|  |  | 
|  | /// Reflection data about an entry point input or output. | 
|  | struct StageVariable { | 
|  | /// Constructor | 
|  | StageVariable(); | 
|  | /// Copy constructor | 
|  | /// @param other the StageVariable to copy | 
|  | StageVariable(const StageVariable& other); | 
|  | /// Destructor | 
|  | ~StageVariable(); | 
|  |  | 
|  | /// Name of the variable in the shader. | 
|  | std::string name; | 
|  | /// Is location attribute present | 
|  | bool has_location_attribute = false; | 
|  | /// Value of the location attribute, only valid if #has_location_attribute is | 
|  | /// true. | 
|  | uint32_t location_attribute; | 
|  | /// Scalar type that the variable is composed of. | 
|  | ComponentType component_type = ComponentType::kUnknown; | 
|  | /// How the scalars are composed for the variable. | 
|  | CompositionType composition_type = CompositionType::kUnknown; | 
|  | /// Interpolation type of the variable. | 
|  | InterpolationType interpolation_type = InterpolationType::kUnknown; | 
|  | /// Interpolation sampling of the variable. | 
|  | InterpolationSampling interpolation_sampling = InterpolationSampling::kUnknown; | 
|  | }; | 
|  |  | 
|  | /// Reflection data about an override variable referenced by an entry point | 
|  | struct Override { | 
|  | /// Name of the override | 
|  | std::string name; | 
|  |  | 
|  | /// ID of the override | 
|  | OverrideId id; | 
|  |  | 
|  | /// Type of the scalar | 
|  | enum class Type { | 
|  | kBool, | 
|  | kFloat32, | 
|  | kUint32, | 
|  | kInt32, | 
|  | kFloat16, | 
|  | }; | 
|  |  | 
|  | /// Type of the scalar | 
|  | Type type; | 
|  |  | 
|  | /// Does this override have an initializer? | 
|  | bool is_initialized = false; | 
|  |  | 
|  | /// Does this override have a numeric ID specified explicitly? | 
|  | bool is_id_specified = false; | 
|  | }; | 
|  |  | 
|  | /// The pipeline stage | 
|  | enum class PipelineStage { kVertex, kFragment, kCompute }; | 
|  |  | 
|  | /// WorkgroupSize describes the dimensions of the workgroup grid for a compute shader. | 
|  | struct WorkgroupSize { | 
|  | /// The 'x' dimension of the workgroup grid | 
|  | uint32_t x = 1; | 
|  | /// The 'y' dimension of the workgroup grid | 
|  | uint32_t y = 1; | 
|  | /// The 'z' dimension of the workgroup grid | 
|  | uint32_t z = 1; | 
|  | }; | 
|  |  | 
|  | /// Reflection data for an entry point in the shader. | 
|  | struct EntryPoint { | 
|  | /// Constructors | 
|  | EntryPoint(); | 
|  | /// Copy Constructor | 
|  | EntryPoint(EntryPoint&); | 
|  | /// Move Constructor | 
|  | EntryPoint(EntryPoint&&); | 
|  | ~EntryPoint(); | 
|  |  | 
|  | /// The entry point name | 
|  | std::string name; | 
|  | /// Remapped entry point name in the backend | 
|  | std::string remapped_name; | 
|  | /// The entry point stage | 
|  | PipelineStage stage; | 
|  | /// The workgroup size. If PipelineStage is kCompute and this holds no value, then the workgroup | 
|  | /// size is derived from an override-expression. In this situation you first need to run the | 
|  | /// tint::ast::transform::SubstituteOverride transform before using the inspector. | 
|  | std::optional<WorkgroupSize> workgroup_size; | 
|  | /// List of the input variable accessed via this entry point. | 
|  | std::vector<StageVariable> input_variables; | 
|  | /// List of the output variable accessed via this entry point. | 
|  | std::vector<StageVariable> output_variables; | 
|  | /// List of the pipeline overridable constants accessed via this entry point. | 
|  | std::vector<Override> overrides; | 
|  | /// Does the entry point use the sample_mask builtin as an input builtin | 
|  | /// variable. | 
|  | bool input_sample_mask_used = false; | 
|  | /// Does the entry point use the sample_mask builtin as an output builtin | 
|  | /// variable. | 
|  | bool output_sample_mask_used = false; | 
|  | /// Does the entry point use the position builtin as an input builtin | 
|  | /// variable. | 
|  | bool input_position_used = false; | 
|  | /// Does the entry point use the front_facing builtin | 
|  | bool front_facing_used = false; | 
|  | /// Does the entry point use the sample_index builtin | 
|  | bool sample_index_used = false; | 
|  | /// Does the entry point use the num_workgroups builtin | 
|  | bool num_workgroups_used = false; | 
|  | /// Does the entry point use the frag_depth builtin | 
|  | bool frag_depth_used = false; | 
|  | }; | 
|  |  | 
|  | }  // namespace tint::inspector | 
|  |  | 
|  | #endif  // SRC_TINT_INSPECTOR_ENTRY_POINT_H_ |