/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SKSL_LAYOUT #define SKSL_LAYOUT #include namespace SkSL { /** * Represents a layout block appearing before a variable declaration, as in: * * layout (location = 0) int x; */ struct Layout { enum Flag { kOriginUpperLeft_Flag = 1 << 0, kPushConstant_Flag = 1 << 1, kBlendSupportAllEquations_Flag = 1 << 2, kColor_Flag = 1 << 3, // These flags indicate if the qualifier appeared, regardless of the accompanying value. kLocation_Flag = 1 << 4, kOffset_Flag = 1 << 5, kBinding_Flag = 1 << 6, kTexture_Flag = 1 << 7, kSampler_Flag = 1 << 8, kIndex_Flag = 1 << 9, kSet_Flag = 1 << 10, kBuiltin_Flag = 1 << 11, kInputAttachmentIndex_Flag = 1 << 12, // These flags indicate the backend type; only one at most can be set. kSPIRV_Flag = 1 << 13, kMetal_Flag = 1 << 14, kGL_Flag = 1 << 15, kWGSL_Flag = 1 << 16, }; static constexpr int kAllBackendFlagsMask = Layout::kSPIRV_Flag | Layout::kMetal_Flag | Layout::kGL_Flag | Layout::kWGSL_Flag; Layout(int flags, int location, int offset, int binding, int index, int set, int builtin, int inputAttachmentIndex) : fFlags(flags) , fLocation(location) , fOffset(offset) , fBinding(binding) , fIndex(index) , fSet(set) , fBuiltin(builtin) , fInputAttachmentIndex(inputAttachmentIndex) {} Layout() = default; static Layout builtin(int builtin) { Layout result; result.fBuiltin = builtin; return result; } std::string description() const; bool operator==(const Layout& other) const; bool operator!=(const Layout& other) const { return !(*this == other); } int fFlags = 0; int fLocation = -1; int fOffset = -1; int fBinding = -1; int fTexture = -1; int fSampler = -1; int fIndex = -1; int fSet = -1; // builtin comes from SPIR-V and identifies which particular builtin value this object // represents. int fBuiltin = -1; // input_attachment_index comes from Vulkan/SPIR-V to connect a shader variable to the a // corresponding attachment on the subpass in which the shader is being used. int fInputAttachmentIndex = -1; }; } // namespace SkSL #endif