blob: 3263f9e901e5b95ba89f7496810e8349ceca46ac [file] [log] [blame]
/*
* 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 "src/base/SkEnumBitMask.h"
#include <string>
namespace SkSL {
class Context;
class Position;
enum class LayoutFlag : int {
kNone = 0,
kAll = ~0,
kOriginUpperLeft = 1 << 0,
kPushConstant = 1 << 1,
kBlendSupportAllEquations = 1 << 2,
kColor = 1 << 3,
// These flags indicate if the qualifier appeared, regardless of the accompanying value.
kLocation = 1 << 4,
kOffset = 1 << 5,
kBinding = 1 << 6,
kTexture = 1 << 7,
kSampler = 1 << 8,
kIndex = 1 << 9,
kSet = 1 << 10,
kBuiltin = 1 << 11,
kInputAttachmentIndex = 1 << 12,
// These flags indicate the backend type; only one at most can be set.
kVulkan = 1 << 13,
kMetal = 1 << 14,
kWebGPU = 1 << 15,
kDirect3D = 1 << 16,
kAllBackends = kVulkan | kMetal | kWebGPU | kDirect3D,
// These flags indicate the pixel format; only one at most can be set.
// (https://www.khronos.org/opengl/wiki/Layout_Qualifier_(GLSL)#Image_formats)
kRGBA8 = 1 << 17,
kRGBA32F = 1 << 18,
kR32F = 1 << 19,
kAllPixelFormats = kRGBA8 | kRGBA32F | kR32F,
// The local invocation size of a compute program.
kLocalSizeX = 1 << 20,
kLocalSizeY = 1 << 21,
kLocalSizeZ = 1 << 22,
};
} // namespace SkSL
SK_MAKE_BITMASK_OPS(SkSL::LayoutFlag);
namespace SkSL {
using LayoutFlags = SkEnumBitMask<SkSL::LayoutFlag>;
/**
* Represents a layout block appearing before a variable declaration, as in:
*
* layout (location = 0) int x;
*/
struct Layout {
Layout(LayoutFlags 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) {}
constexpr Layout() = default;
static Layout builtin(int builtin) {
Layout result;
result.fBuiltin = builtin;
return result;
}
std::string description() const;
std::string paddedDescription() const;
/**
* Verifies that only permitted layout flags are included. Reports errors and returns false in
* the event of a violation.
*/
bool checkPermittedLayout(const Context& context,
Position pos,
LayoutFlags permittedLayoutFlags) const;
bool operator==(const Layout& other) const;
bool operator!=(const Layout& other) const {
return !(*this == other);
}
LayoutFlags fFlags = LayoutFlag::kNone;
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;
// The local invocation size dimensions of a compute program.
int fLocalSizeX = -1;
int fLocalSizeY = -1;
int fLocalSizeZ = -1;
};
} // namespace SkSL
#endif