1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SKSL_LAYOUT 9*c8dee2aaSAndroid Build Coastguard Worker #define SKSL_LAYOUT 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkEnumBitMask.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #include <string> 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class Context; 18*c8dee2aaSAndroid Build Coastguard Worker class Position; 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker enum class LayoutFlag : int { 21*c8dee2aaSAndroid Build Coastguard Worker kNone = 0, 22*c8dee2aaSAndroid Build Coastguard Worker kAll = ~0, 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker kOriginUpperLeft = 1 << 0, 25*c8dee2aaSAndroid Build Coastguard Worker kPushConstant = 1 << 1, 26*c8dee2aaSAndroid Build Coastguard Worker kBlendSupportAllEquations = 1 << 2, 27*c8dee2aaSAndroid Build Coastguard Worker kColor = 1 << 3, 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker // These flags indicate if the qualifier appeared, regardless of the accompanying value. 30*c8dee2aaSAndroid Build Coastguard Worker kLocation = 1 << 4, 31*c8dee2aaSAndroid Build Coastguard Worker kOffset = 1 << 5, 32*c8dee2aaSAndroid Build Coastguard Worker kBinding = 1 << 6, 33*c8dee2aaSAndroid Build Coastguard Worker kTexture = 1 << 7, 34*c8dee2aaSAndroid Build Coastguard Worker kSampler = 1 << 8, 35*c8dee2aaSAndroid Build Coastguard Worker kIndex = 1 << 9, 36*c8dee2aaSAndroid Build Coastguard Worker kSet = 1 << 10, 37*c8dee2aaSAndroid Build Coastguard Worker kBuiltin = 1 << 11, 38*c8dee2aaSAndroid Build Coastguard Worker kInputAttachmentIndex = 1 << 12, 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker // These flags indicate the backend type; only one at most can be set. 41*c8dee2aaSAndroid Build Coastguard Worker kVulkan = 1 << 13, 42*c8dee2aaSAndroid Build Coastguard Worker kMetal = 1 << 14, 43*c8dee2aaSAndroid Build Coastguard Worker kWebGPU = 1 << 15, 44*c8dee2aaSAndroid Build Coastguard Worker kDirect3D = 1 << 16, 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker kAllBackends = kVulkan | kMetal | kWebGPU | kDirect3D, 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker // These flags indicate the pixel format; only one at most can be set. 49*c8dee2aaSAndroid Build Coastguard Worker // (https://www.khronos.org/opengl/wiki/Layout_Qualifier_(GLSL)#Image_formats) 50*c8dee2aaSAndroid Build Coastguard Worker kRGBA8 = 1 << 17, 51*c8dee2aaSAndroid Build Coastguard Worker kRGBA32F = 1 << 18, 52*c8dee2aaSAndroid Build Coastguard Worker kR32F = 1 << 19, 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker kAllPixelFormats = kRGBA8 | kRGBA32F | kR32F, 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker // The local invocation size of a compute program. 57*c8dee2aaSAndroid Build Coastguard Worker kLocalSizeX = 1 << 20, 58*c8dee2aaSAndroid Build Coastguard Worker kLocalSizeY = 1 << 21, 59*c8dee2aaSAndroid Build Coastguard Worker kLocalSizeZ = 1 << 22, 60*c8dee2aaSAndroid Build Coastguard Worker }; 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkSL 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker SK_MAKE_BITMASK_OPS(SkSL::LayoutFlag); 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker using LayoutFlags = SkEnumBitMask<SkSL::LayoutFlag>; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker /** 71*c8dee2aaSAndroid Build Coastguard Worker * Represents a layout block appearing before a variable declaration, as in: 72*c8dee2aaSAndroid Build Coastguard Worker * 73*c8dee2aaSAndroid Build Coastguard Worker * layout (location = 0) int x; 74*c8dee2aaSAndroid Build Coastguard Worker */ 75*c8dee2aaSAndroid Build Coastguard Worker struct Layout { LayoutLayout76*c8dee2aaSAndroid Build Coastguard Worker Layout(LayoutFlags flags, int location, int offset, int binding, int index, int set, 77*c8dee2aaSAndroid Build Coastguard Worker int builtin, int inputAttachmentIndex) 78*c8dee2aaSAndroid Build Coastguard Worker : fFlags(flags) 79*c8dee2aaSAndroid Build Coastguard Worker , fLocation(location) 80*c8dee2aaSAndroid Build Coastguard Worker , fOffset(offset) 81*c8dee2aaSAndroid Build Coastguard Worker , fBinding(binding) 82*c8dee2aaSAndroid Build Coastguard Worker , fIndex(index) 83*c8dee2aaSAndroid Build Coastguard Worker , fSet(set) 84*c8dee2aaSAndroid Build Coastguard Worker , fBuiltin(builtin) 85*c8dee2aaSAndroid Build Coastguard Worker , fInputAttachmentIndex(inputAttachmentIndex) {} 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker constexpr Layout() = default; 88*c8dee2aaSAndroid Build Coastguard Worker builtinLayout89*c8dee2aaSAndroid Build Coastguard Worker static Layout builtin(int builtin) { 90*c8dee2aaSAndroid Build Coastguard Worker Layout result; 91*c8dee2aaSAndroid Build Coastguard Worker result.fBuiltin = builtin; 92*c8dee2aaSAndroid Build Coastguard Worker return result; 93*c8dee2aaSAndroid Build Coastguard Worker } 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker std::string description() const; 96*c8dee2aaSAndroid Build Coastguard Worker std::string paddedDescription() const; 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker /** 99*c8dee2aaSAndroid Build Coastguard Worker * Verifies that only permitted layout flags are included. Reports errors and returns false in 100*c8dee2aaSAndroid Build Coastguard Worker * the event of a violation. 101*c8dee2aaSAndroid Build Coastguard Worker */ 102*c8dee2aaSAndroid Build Coastguard Worker bool checkPermittedLayout(const Context& context, 103*c8dee2aaSAndroid Build Coastguard Worker Position pos, 104*c8dee2aaSAndroid Build Coastguard Worker LayoutFlags permittedLayoutFlags) const; 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const Layout& other) const; 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Worker bool operator!=(const Layout& other) const { 109*c8dee2aaSAndroid Build Coastguard Worker return !(*this == other); 110*c8dee2aaSAndroid Build Coastguard Worker } 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker LayoutFlags fFlags = LayoutFlag::kNone; 113*c8dee2aaSAndroid Build Coastguard Worker int fLocation = -1; 114*c8dee2aaSAndroid Build Coastguard Worker int fOffset = -1; 115*c8dee2aaSAndroid Build Coastguard Worker int fBinding = -1; 116*c8dee2aaSAndroid Build Coastguard Worker int fTexture = -1; 117*c8dee2aaSAndroid Build Coastguard Worker int fSampler = -1; 118*c8dee2aaSAndroid Build Coastguard Worker int fIndex = -1; 119*c8dee2aaSAndroid Build Coastguard Worker int fSet = -1; 120*c8dee2aaSAndroid Build Coastguard Worker // builtin comes from SPIR-V and identifies which particular builtin value this object 121*c8dee2aaSAndroid Build Coastguard Worker // represents. 122*c8dee2aaSAndroid Build Coastguard Worker int fBuiltin = -1; 123*c8dee2aaSAndroid Build Coastguard Worker // input_attachment_index comes from Vulkan/SPIR-V to connect a shader variable to the a 124*c8dee2aaSAndroid Build Coastguard Worker // corresponding attachment on the subpass in which the shader is being used. 125*c8dee2aaSAndroid Build Coastguard Worker int fInputAttachmentIndex = -1; 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker // The local invocation size dimensions of a compute program. 128*c8dee2aaSAndroid Build Coastguard Worker int fLocalSizeX = -1; 129*c8dee2aaSAndroid Build Coastguard Worker int fLocalSizeY = -1; 130*c8dee2aaSAndroid Build Coastguard Worker int fLocalSizeZ = -1; 131*c8dee2aaSAndroid Build Coastguard Worker }; 132*c8dee2aaSAndroid Build Coastguard Worker 133*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkSL 134*c8dee2aaSAndroid Build Coastguard Worker 135*c8dee2aaSAndroid Build Coastguard Worker #endif 136