1 /* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef GLES_SPIRV_CROSS_HELPER_STRUCTS_H 16 #define GLES_SPIRV_CROSS_HELPER_STRUCTS_H 17 18 #include <string> 19 20 #include "array_view.h" 21 #include "shader_type.h" 22 23 /** Shader stage flag bits */ 24 enum class ShaderStageFlagBits { 25 /** Vertex bit */ 26 VERTEX_BIT = 0x00000001, 27 /** Fragment bit */ 28 FRAGMENT_BIT = 0x00000010, 29 /** Compute bit */ 30 COMPUTE_BIT = 0x00000020, 31 /** All graphics */ 32 ALL_GRAPHICS = 0x0000001F, 33 /** All */ 34 ALL = 0x7FFFFFFF, 35 /** Max enumeration */ 36 FLAG_BITS_MAX_ENUM = 0x7FFFFFFF 37 }; 38 ShaderKindToStageFlags(ShaderKind kind)39 inline ShaderStageFlagBits ShaderKindToStageFlags(ShaderKind kind) 40 { 41 switch (kind) { 42 case ShaderKind::VERTEX: 43 return ShaderStageFlagBits::VERTEX_BIT; 44 case ShaderKind::FRAGMENT: 45 return ShaderStageFlagBits::FRAGMENT_BIT; 46 case ShaderKind::COMPUTE: 47 return ShaderStageFlagBits::COMPUTE_BIT; 48 default: 49 return ShaderStageFlagBits::ALL_GRAPHICS; 50 } 51 } 52 53 constexpr ShaderStageFlagBits operator~(ShaderStageFlagBits bits) noexcept 54 { 55 return static_cast<ShaderStageFlagBits>(~static_cast<std::underlying_type_t<ShaderStageFlagBits>>(bits)); 56 } 57 58 /** Shader stage flags */ 59 struct ShaderStageFlags { 60 ShaderStageFlagBits flags {}; 61 62 ShaderStageFlags() noexcept = default; ShaderStageFlagsShaderStageFlags63 ShaderStageFlags(ShaderStageFlagBits bits) noexcept : flags(bits) {} ShaderStageFlagsShaderStageFlags64 ShaderStageFlags(ShaderKind kind) noexcept 65 { 66 flags = ShaderKindToStageFlags(kind); 67 } 68 69 ShaderStageFlags operator&(ShaderStageFlagBits rhs) const noexcept 70 { 71 return { static_cast<ShaderStageFlagBits>(static_cast<std::underlying_type_t<ShaderStageFlagBits>>(flags) & 72 static_cast<std::underlying_type_t<ShaderStageFlagBits>>(rhs)) }; 73 } 74 75 ShaderStageFlags operator~() const noexcept 76 { 77 return { static_cast<ShaderStageFlagBits>(~static_cast<std::underlying_type_t<ShaderStageFlagBits>>(flags)) }; 78 } 79 80 ShaderStageFlags& operator&=(ShaderStageFlagBits rhs) noexcept 81 { 82 flags = static_cast<ShaderStageFlagBits>(static_cast<std::underlying_type_t<ShaderStageFlagBits>>(flags) & 83 static_cast<std::underlying_type_t<ShaderStageFlagBits>>(rhs)); 84 return *this; 85 } 86 87 ShaderStageFlags& operator|=(ShaderStageFlagBits rhs) noexcept 88 { 89 flags = static_cast<ShaderStageFlagBits>(static_cast<std::underlying_type_t<ShaderStageFlagBits>>(flags) | 90 static_cast<std::underlying_type_t<ShaderStageFlagBits>>(rhs)); 91 return *this; 92 } 93 94 ShaderStageFlags& operator|=(ShaderStageFlags rhs) noexcept 95 { 96 flags = static_cast<ShaderStageFlagBits>(static_cast<std::underlying_type_t<ShaderStageFlagBits>>(flags) | 97 static_cast<std::underlying_type_t<ShaderStageFlagBits>>(rhs.flags)); 98 return *this; 99 } 100 101 bool operator==(ShaderStageFlagBits rhs) const noexcept 102 { 103 return static_cast<std::underlying_type_t<ShaderStageFlagBits>>(flags) == 104 static_cast<std::underlying_type_t<ShaderStageFlagBits>>(rhs); 105 } 106 107 operator bool() const noexcept 108 { 109 return static_cast<std::underlying_type_t<ShaderStageFlagBits>>(flags) != 0; 110 } 111 }; 112 113 /** Constant */ 114 struct ShaderSpecializationConstant { 115 enum class Type : uint32_t { 116 INVALID = 0, 117 BOOL, 118 UINT32, 119 INT32, 120 FLOAT, 121 }; 122 /** Shader stage */ 123 ShaderStageFlags shaderStage; 124 /** ID */ 125 uint32_t id; 126 /** Size */ 127 Type type; 128 /** Offset */ 129 uint32_t offset; 130 }; 131 132 /** Shader specialization constant data view */ 133 struct ShaderSpecializationConstantDataView { 134 /** Array of shader specialization constants */ 135 array_view<const ShaderSpecializationConstant> constants; 136 /** Data */ 137 array_view<const uint32_t> data; 138 }; 139 140 namespace Gles { 141 // Bind limits. 142 // https://www.khronos.org/registry/vulkan/specs/1.1/html/chap31.html#limits-minmax 143 // maxBoundDescriptorSets is 4 (so there can be at most 4 sets...) 144 // maxPerStageDescriptorUniformBuffers is 12 145 // maxPerStageDescriptorStorageBuffers is 4 146 // maxPerStageDescriptorStorageImages is 4 147 // maxPerStageDescriptorSamplers is 16 148 // maxPerStageDescriptorSampledImages is 16 149 // maxDescriptorSetSamplers is 96 (all stages) 150 // maxDescriptorSetSampledImages is 96 (all stages) 151 // maxColorAttachments is 4 (subpass inputs?) 152 // maxVertexInputAttributes is 16 153 // maxVertexInputBindings is 16 154 // gles = GL_MAX_TEXTURE_IMAGE_UNITS 16 (so 16 texture units can be active, ie combined samplers/sampledimages and 155 // subpass inputs) NOTE: The macro allows for 16 sets, with 16 binds per type (uniform buffer, storage buffer) 156 struct ResourceLimits { 157 // 4 slots and 16 binds = 64 possible binds. 158 static constexpr uint32_t MAX_SETS { 4 }; 159 static constexpr uint32_t MAX_BIND_IN_SET { 16 }; 160 static constexpr uint32_t MAX_BINDS { MAX_SETS * MAX_BIND_IN_SET }; 161 162 static constexpr uint32_t MAX_VERTEXINPUT_ATTRIBUTES { 16 }; 163 static constexpr uint32_t MAX_UNIFORM_BUFFERS_IN_STAGE { 12 }; 164 static constexpr uint32_t MAX_STORAGE_BUFFERS_IN_STAGE { 4 }; 165 static constexpr uint32_t MAX_SAMPLERS_IN_STAGE { 16 }; 166 static constexpr uint32_t MAX_IMAGES_IN_STAGE { 16 }; 167 static constexpr uint32_t MAX_STORAGE_IMAGES_IN_STAGE { 4 }; 168 static constexpr uint32_t MAX_INPUT_ATTACHMENTS_IN_STAGE { 4 }; 169 static constexpr uint32_t MAX_SAMPLERS_IN_PROGRAM { MAX_SAMPLERS_IN_STAGE + MAX_SAMPLERS_IN_STAGE }; 170 static constexpr uint32_t MAX_IMAGES_IN_PROGRAM { MAX_IMAGES_IN_STAGE + MAX_IMAGES_IN_STAGE }; 171 }; 172 static constexpr int32_t INVALID_LOCATION = -1; 173 struct SpecConstantInfo { 174 enum class Types { INVALID = 0, BOOL, UINT32, INT32, FLOAT }; 175 Types constantType = Types::INVALID; 176 uint32_t constantId; 177 uint32_t vectorSize; 178 uint32_t columns; 179 uint32_t offset; 180 std::string name; 181 }; 182 struct PushConstantReflection { 183 ShaderStageFlags stage; 184 int32_t location { INVALID_LOCATION }; 185 uint32_t type; 186 std::string name; 187 size_t offset; 188 size_t size; 189 size_t arraySize; 190 size_t arrayStride; 191 size_t matrixStride; 192 }; 193 } // namespace Gles 194 195 #endif // GLES_SPIRV_CROSS_HELPER_STRUCTS_H 196