/* * SPIRVReflection.h * * Copyright (c) 2019 Chip Davis for Codeweavers * * 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 __SPIRVReflection_h_ #define __SPIRVReflection_h_ 1 #include "../SPIRV-Cross/spirv.hpp" #include "../SPIRV-Cross/spirv_common.hpp" #include #include namespace mvk { #pragma mark - #pragma mark SPIRVTessReflectionData /** Reflection data for a pair of tessellation shaders. This contains the information needed to construct a tessellation pipeline. */ struct SPIRVTessReflectionData { /** The partition mode, one of SpacingEqual, SpacingFractionalEven, or SpacingFractionalOdd. */ spv::ExecutionMode partitionMode = spv::ExecutionModeMax; /** The winding order of generated triangles, one of VertexOrderCw or VertexOrderCcw. */ spv::ExecutionMode windingOrder = spv::ExecutionModeMax; /** Whether or not tessellation should produce points instead of lines or triangles. */ bool pointMode = false; /** The kind of patch expected as input, one of Triangles, Quads, or Isolines. */ spv::ExecutionMode patchKind = spv::ExecutionModeMax; /** The number of control points output by the tessellation control shader. */ uint32_t numControlPoints = 0; }; #pragma mark - #pragma mark SPIRVShaderOutputData /** Reflection data on a single output of a shader. This contains the information needed to construct a stage-input descriptor for the next stage of a pipeline. */ struct SPIRVShaderOutput { /** The type of the output. */ SPIRV_CROSS_NAMESPACE::SPIRType::BaseType baseType; /** The vector size, if a vector. */ uint32_t vecWidth; /** The location number of the output. */ uint32_t location; /** Whether this is a per-patch or per-vertex output. Only meaningful for tessellation control shaders. */ bool perPatch; /** If this is a builtin, the kind of builtin this is. */ spv::BuiltIn builtin; }; #pragma mark - #pragma mark Functions /** Given a tessellation control shader and a tessellation evaluation shader, both in SPIR-V format, returns tessellation reflection data. */ bool getTessReflectionData(const std::vector& tesc, const std::string& tescEntryName, const std::vector& tese, const std::string& teseEntryName, SPIRVTessReflectionData& reflectData, std::string& errorLog); /** Given a shader in SPIR-V format, returns output reflection data. */ bool getShaderOutputs(const std::vector& spirv, spv::ExecutionModel model, const std::string& entryName, std::vector& outputs, std::string& errorLog); } #endif