blob: 7ccd8c44775cd8f2c0f72428260a4c0cb31e5dce [file] [log] [blame] [edit]
/*
* Copyright 2021 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_Attribute_DEFINED
#define skgpu_graphite_Attribute_DEFINED
#include "include/private/base/SkAlign.h"
#include "src/core/SkSLTypeShared.h"
#include "src/gpu/graphite/DrawTypes.h"
namespace skgpu::graphite {
/** Describes a vertex or instance attribute. */
class Attribute {
public:
constexpr Attribute() = default;
constexpr Attribute(const char* name,
VertexAttribType cpuType,
SkSLType gpuType)
: fName(name), fCPUType(cpuType), fGPUType(gpuType) {
SkASSERT(name && gpuType != SkSLType::kVoid);
}
constexpr Attribute(const Attribute&) = default;
Attribute& operator=(const Attribute&) = default;
constexpr bool isInitialized() const { return fGPUType != SkSLType::kVoid; }
constexpr const char* name() const { return fName; }
constexpr VertexAttribType cpuType() const { return fCPUType; }
constexpr SkSLType gpuType() const { return fGPUType; }
constexpr size_t size() const { return VertexAttribTypeSize(fCPUType); }
constexpr size_t sizeAlign4() const { return SkAlign4(this->size()); }
private:
const char* fName = nullptr;
VertexAttribType fCPUType = VertexAttribType::kFloat;
SkSLType fGPUType = SkSLType::kVoid;
};
enum class Interpolation {
// The default perspective-correct interpolation for floating point types.
kPerspective,
// Screen-space linear interpolation for floating point types.
kLinear,
// No guarantee on what the provoking vertex is, should be used when all vertices have the same
// value so that is irrelevant.
//
// The only supported interpolation option for integer types.
kFlat
};
/**Describes an interpolated value passed between a vertex and fragment shader. */
class Varying {
public:
constexpr Varying() = default;
constexpr Varying(const char* name,
SkSLType gpuType,
Interpolation interpolation = Interpolation::kPerspective)
: fName(name)
, fGPUType(gpuType)
, fInterpolation(SkSLTypeIsIntegralType(gpuType) ? Interpolation::kFlat
: interpolation) {
SkASSERT(name && gpuType != SkSLType::kVoid);
SkASSERT(SkSLTypeVecLength(gpuType) >= 1); // Only scalar/vector types allowed as varyings.
// Allow kPerspective for integer types since that's the default arg and will be replaced
// with kFlat; but explicitly requesting kLinear for integer types is not allowed.
SkASSERT(SkSLTypeIsFloatType(gpuType) || interpolation != Interpolation::kLinear);
}
constexpr Varying(const Varying&) = default;
Varying& operator=(const Varying&) = default;
constexpr bool isInitialized() const { return fGPUType != SkSLType::kVoid; }
constexpr const char* name() const { return fName; }
constexpr SkSLType gpuType() const { return fGPUType; }
constexpr Interpolation interpolation() const { return fInterpolation; }
private:
const char* fName = nullptr;
SkSLType fGPUType = SkSLType::kVoid;
Interpolation fInterpolation = Interpolation::kPerspective;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_Attribute_DEFINED