calibration_tools_v1.0/lidar_driver/include/open3d/3rdparty/backend/DriverEnums.h

897 lines
31 KiB
C
Raw Permalink Normal View History

2025-02-20 10:45:17 +08:00
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//! \file
#ifndef TNT_FILAMENT_DRIVER_DRIVERENUMS_H
#define TNT_FILAMENT_DRIVER_DRIVERENUMS_H
#include <utils/BitmaskEnum.h>
#include <utils/unwindows.h> // Because we define ERROR in the FenceStatus enum.
#include <math/vec4.h>
#include <array> // FIXME: STL headers are not allowed in public headers
#include <stddef.h>
#include <stdint.h>
namespace filament {
/**
* Types and enums used by filament's driver.
*
* Effectively these types are public but should not be used directly. Instead use public classes
* internal redeclaration of these types.
* For e.g. Use Texture::Sampler instead of filament::SamplerType.
*/
namespace backend {
static constexpr uint64_t SWAP_CHAIN_CONFIG_TRANSPARENT = 0x1;
static constexpr uint64_t SWAP_CHAIN_CONFIG_READABLE = 0x2;
static constexpr uint64_t SWAP_CHAIN_CONFIG_ENABLE_XCB = 0x4;
static constexpr uint64_t SWAP_CHAIN_CONFIG_APPLE_CVPIXELBUFFER = 0x8;
static constexpr size_t MAX_VERTEX_ATTRIBUTE_COUNT = 16; // This is guaranteed by OpenGL ES.
static constexpr size_t MAX_SAMPLER_COUNT = 16; // Matches the Adreno Vulkan driver.
static constexpr size_t CONFIG_UNIFORM_BINDING_COUNT = 6;
static constexpr size_t CONFIG_SAMPLER_BINDING_COUNT = 6;
/**
* Selects which driver a particular Engine should use.
*/
enum class Backend : uint8_t {
DEFAULT = 0, //!< Automatically selects an appropriate driver for the platform.
OPENGL = 1, //!< Selects the OpenGL driver (which supports OpenGL ES as well).
VULKAN = 2, //!< Selects the Vulkan driver if the platform supports it.
METAL = 3, //!< Selects the Metal driver if the platform supports it.
NOOP = 4, //!< Selects the no-op driver for testing purposes.
};
static constexpr const char* backendToString(backend::Backend backend) {
switch (backend) {
case backend::Backend::NOOP:
return "Noop";
case backend::Backend::OPENGL:
return "OpenGL";
case backend::Backend::VULKAN:
return "Vulkan";
case backend::Backend::METAL:
return "Metal";
default:
return "Unknown";
}
}
/**
* Bitmask for selecting render buffers
*/
enum class TargetBufferFlags : uint8_t {
NONE = 0x0u, //!< No buffer selected.
COLOR0 = 0x1u, //!< Color buffer selected.
COLOR1 = 0x2u, //!< Color buffer selected.
COLOR2 = 0x4u, //!< Color buffer selected.
COLOR3 = 0x8u, //!< Color buffer selected.
COLOR = COLOR0, //!< \deprecated
COLOR_ALL = COLOR0 | COLOR1 | COLOR2 | COLOR3,
DEPTH = 0x10u, //!< Depth buffer selected.
STENCIL = 0x20u, //!< Stencil buffer selected.
DEPTH_AND_STENCIL = DEPTH | STENCIL, //!< depth and stencil buffer selected.
ALL = COLOR_ALL | DEPTH | STENCIL //!< Color, depth and stencil buffer selected.
};
inline TargetBufferFlags getMRTColorFlag(size_t index) noexcept {
assert(index < 4);
return TargetBufferFlags(1u << index);
}
/**
* Frequency at which a buffer is expected to be modified and used. This is used as an hint
* for the driver to make better decisions about managing memory internally.
*/
enum class BufferUsage : uint8_t {
STATIC, //!< content modified once, used many times
DYNAMIC, //!< content modified frequently, used many times
STREAM, //!< content invalidated and modified frequently, used many times
};
/**
* Defines a viewport, which is the origin and extent of the clip-space.
* All drawing is clipped to the viewport.
*/
struct Viewport {
int32_t left; //!< left coordinate in window space.
int32_t bottom; //!< bottom coordinate in window space.
uint32_t width; //!< width in pixels
uint32_t height; //!< height in pixels
//! get the right coordinate in window space of the viewport
int32_t right() const noexcept { return left + width; }
//! get the top coordinate in window space of the viewport
int32_t top() const noexcept { return bottom + height; }
};
/**
* Specifies the mapping of the near and far clipping plane to window coordinates.
*/
struct DepthRange {
float near = 0.0f; //!< mapping of the near plane to window coordinates.
float far = 1.0f; //!< mapping of the far plane to window coordinates.
};
/**
* Error codes for Fence::wait()
* @see Fence, Fence::wait()
*/
enum class FenceStatus : int8_t {
ERROR = -1, //!< An error occured. The Fence condition is not satisfied.
CONDITION_SATISFIED = 0, //!< The Fence condition is satisfied.
TIMEOUT_EXPIRED = 1, //!< wait()'s timeout expired. The Fence condition is not satisfied.
};
/**
* Status codes for sync objects
*/
enum class SyncStatus : int8_t {
ERROR = -1, //!< An error occured. The Sync is not signaled.
SIGNALED = 0, //!< The Sync is signaled.
NOT_SIGNALED = 1, //!< The Sync is not signaled yet
};
static constexpr uint64_t FENCE_WAIT_FOR_EVER = uint64_t(-1);
/**
* Shader model.
*
* These enumerants are used across all backends and refer to a level of functionality, rather
* than to an OpenGL specific shader model.
*/
enum class ShaderModel : uint8_t {
//! For testing
UNKNOWN = 0,
GL_ES_30 = 1, //!< Mobile level functionality
GL_CORE_41 = 2, //!< Desktop level functionality
};
static constexpr size_t SHADER_MODEL_COUNT = 3;
/**
* Primitive types
*/
enum class PrimitiveType : uint8_t {
// don't change the enums values (made to match GL)
POINTS = 0, //!< points
LINES = 1, //!< lines
TRIANGLES = 4, //!< triangles
NONE = 0xFF
};
/**
* Supported uniform types
*/
enum class UniformType : uint8_t {
BOOL,
BOOL2,
BOOL3,
BOOL4,
FLOAT,
FLOAT2,
FLOAT3,
FLOAT4,
INT,
INT2,
INT3,
INT4,
UINT,
UINT2,
UINT3,
UINT4,
MAT3, //!< a 3x3 float matrix
MAT4 //!< a 4x4 float matrix
};
enum class Precision : uint8_t {
LOW,
MEDIUM,
HIGH,
DEFAULT
};
//! Texture sampler type
enum class SamplerType : uint8_t {
SAMPLER_2D, //!< 2D texture
SAMPLER_2D_ARRAY, //!< 2D array texture
SAMPLER_CUBEMAP, //!< Cube map texture
SAMPLER_EXTERNAL, //!< External texture
SAMPLER_3D, //!< 3D texture
};
//! Subpass type
enum class SubpassType : uint8_t {
SUBPASS_INPUT
};
//! Texture sampler format
enum class SamplerFormat : uint8_t {
INT = 0, //!< signed integer sampler
UINT = 1, //!< unsigned integer sampler
FLOAT = 2, //!< float sampler
SHADOW = 3 //!< shadow sampler (PCF)
};
/**
* Supported element types
*/
enum class ElementType : uint8_t {
BYTE,
BYTE2,
BYTE3,
BYTE4,
UBYTE,
UBYTE2,
UBYTE3,
UBYTE4,
SHORT,
SHORT2,
SHORT3,
SHORT4,
USHORT,
USHORT2,
USHORT3,
USHORT4,
INT,
UINT,
FLOAT,
FLOAT2,
FLOAT3,
FLOAT4,
HALF,
HALF2,
HALF3,
HALF4,
};
//! Face culling Mode
enum class CullingMode : uint8_t {
NONE, //!< No culling, front and back faces are visible
FRONT, //!< Front face culling, only back faces are visible
BACK, //!< Back face culling, only front faces are visible
FRONT_AND_BACK //!< Front and Back, geometry is not visible
};
//! Pixel Data Format
enum class PixelDataFormat : uint8_t {
R, //!< One Red channel, float
R_INTEGER, //!< One Red channel, integer
RG, //!< Two Red and Green channels, float
RG_INTEGER, //!< Two Red and Green channels, integer
RGB, //!< Three Red, Green and Blue channels, float
RGB_INTEGER, //!< Three Red, Green and Blue channels, integer
RGBA, //!< Four Red, Green, Blue and Alpha channels, float
RGBA_INTEGER, //!< Four Red, Green, Blue and Alpha channels, integer
UNUSED, // used to be rgbm
DEPTH_COMPONENT, //!< Depth, 16-bit or 24-bits usually
DEPTH_STENCIL, //!< Two Depth (24-bits) + Stencil (8-bits) channels
ALPHA //! One Alpha channel, float
};
//! Pixel Data Type
enum class PixelDataType : uint8_t {
UBYTE, //!< unsigned byte
BYTE, //!< signed byte
USHORT, //!< unsigned short (16-bit)
SHORT, //!< signed short (16-bit)
UINT, //!< unsigned int (16-bit)
INT, //!< signed int (32-bit)
HALF, //!< half-float (16-bit float)
FLOAT, //!< float (32-bits float)
COMPRESSED, //!< compressed pixels, @see CompressedPixelDataType
UINT_10F_11F_11F_REV, //!< three low precision floating-point numbers
USHORT_565, //!< unsigned int (16-bit), encodes 3 RGB channels
UINT_2_10_10_10_REV, //!< unsigned normalized 10 bits RGB, 2 bits alpha
};
//! Compressed pixel data types
enum class CompressedPixelDataType : uint16_t {
// Mandatory in GLES 3.0 and GL 4.3
EAC_R11, EAC_R11_SIGNED, EAC_RG11, EAC_RG11_SIGNED,
ETC2_RGB8, ETC2_SRGB8,
ETC2_RGB8_A1, ETC2_SRGB8_A1,
ETC2_EAC_RGBA8, ETC2_EAC_SRGBA8,
// Available everywhere except Android/iOS
DXT1_RGB, DXT1_RGBA, DXT3_RGBA, DXT5_RGBA,
DXT1_SRGB, DXT1_SRGBA, DXT3_SRGBA, DXT5_SRGBA,
// ASTC formats are available with a GLES extension
RGBA_ASTC_4x4,
RGBA_ASTC_5x4,
RGBA_ASTC_5x5,
RGBA_ASTC_6x5,
RGBA_ASTC_6x6,
RGBA_ASTC_8x5,
RGBA_ASTC_8x6,
RGBA_ASTC_8x8,
RGBA_ASTC_10x5,
RGBA_ASTC_10x6,
RGBA_ASTC_10x8,
RGBA_ASTC_10x10,
RGBA_ASTC_12x10,
RGBA_ASTC_12x12,
SRGB8_ALPHA8_ASTC_4x4,
SRGB8_ALPHA8_ASTC_5x4,
SRGB8_ALPHA8_ASTC_5x5,
SRGB8_ALPHA8_ASTC_6x5,
SRGB8_ALPHA8_ASTC_6x6,
SRGB8_ALPHA8_ASTC_8x5,
SRGB8_ALPHA8_ASTC_8x6,
SRGB8_ALPHA8_ASTC_8x8,
SRGB8_ALPHA8_ASTC_10x5,
SRGB8_ALPHA8_ASTC_10x6,
SRGB8_ALPHA8_ASTC_10x8,
SRGB8_ALPHA8_ASTC_10x10,
SRGB8_ALPHA8_ASTC_12x10,
SRGB8_ALPHA8_ASTC_12x12,
};
/** Supported texel formats
* These formats are typically used to specify a texture's internal storage format.
*
* Enumerants syntax format
* ========================
*
* `[components][size][type]`
*
* `components` : List of stored components by this format.\n
* `size` : Size in bit of each component.\n
* `type` : Type this format is stored as.\n
*
*
* Name | Component
* :--------|:-------------------------------
* R | Linear Red
* RG | Linear Red, Green
* RGB | Linear Red, Green, Blue
* RGBA | Linear Red, Green Blue, Alpha
* SRGB | sRGB encoded Red, Green, Blue
* DEPTH | Depth
* STENCIL | Stencil
*
* \n
* Name | Type
* :--------|:---------------------------------------------------
* (none) | Unsigned Normalized Integer [0, 1]
* _SNORM | Signed Normalized Integer [-1, 1]
* UI | Unsigned Integer @f$ [0, 2^{size}] @f$
* I | Signed Integer @f$ [-2^{size-1}, 2^{size-1}-1] @f$
* F | Floating-point
*
*
* Special color formats
* ---------------------
*
* There are a few special color formats that don't follow the convention above:
*
* Name | Format
* :----------------|:--------------------------------------------------------------------------
* RGB565 | 5-bits for R and B, 6-bits for G.
* RGB5_A1 | 5-bits for R, G and B, 1-bit for A.
* RGB10_A2 | 10-bits for R, G and B, 2-bits for A.
* RGB9_E5 | **Unsigned** floating point. 9-bits mantissa for RGB, 5-bits shared exponent
* R11F_G11F_B10F | **Unsigned** floating point. 6-bits mantissa, for R and G, 5-bits for B. 5-bits exponent.
* SRGB8_A8 | sRGB 8-bits with linear 8-bits alpha.
* DEPTH24_STENCIL8 | 24-bits unsigned normalized integer depth, 8-bits stencil.
* DEPTH32F_STENCIL8| 32-bits floating-point depth, 8-bits stencil.
*
*
* Compressed texture formats
* --------------------------
*
* Many compressed texture formats are supported as well, which include (but are not limited to)
* the following list:
*
* Name | Format
* :----------------|:--------------------------------------------------------------------------
* EAC_R11 | Compresses R11UI
* EAC_R11_SIGNED | Compresses R11I
* EAC_RG11 | Compresses RG11UI
* EAC_RG11_SIGNED | Compresses RG11I
* ETC2_RGB8 | Compresses RGB8
* ETC2_SRGB8 | compresses SRGB8
* ETC2_EAC_RGBA8 | Compresses RGBA8
* ETC2_EAC_SRGBA8 | Compresses SRGB8_A8
* ETC2_RGB8_A1 | Compresses RGB8 with 1-bit alpha
* ETC2_SRGB8_A1 | Compresses sRGB8 with 1-bit alpha
*
*
* @see Texture
*/
enum class TextureFormat : uint16_t {
// 8-bits per element
R8, R8_SNORM, R8UI, R8I, STENCIL8,
// 16-bits per element
R16F, R16UI, R16I,
RG8, RG8_SNORM, RG8UI, RG8I,
RGB565,
RGB9_E5, // 9995 is actually 32 bpp but it's here for historical reasons.
RGB5_A1,
RGBA4,
DEPTH16,
// 24-bits per element
RGB8, SRGB8, RGB8_SNORM, RGB8UI, RGB8I,
DEPTH24,
// 32-bits per element
R32F, R32UI, R32I,
RG16F, RG16UI, RG16I,
R11F_G11F_B10F,
RGBA8, SRGB8_A8,RGBA8_SNORM,
UNUSED, // used to be rgbm
RGB10_A2, RGBA8UI, RGBA8I,
DEPTH32F, DEPTH24_STENCIL8, DEPTH32F_STENCIL8,
// 48-bits per element
RGB16F, RGB16UI, RGB16I,
// 64-bits per element
RG32F, RG32UI, RG32I,
RGBA16F, RGBA16UI, RGBA16I,
// 96-bits per element
RGB32F, RGB32UI, RGB32I,
// 128-bits per element
RGBA32F, RGBA32UI, RGBA32I,
// compressed formats
// Mandatory in GLES 3.0 and GL 4.3
EAC_R11, EAC_R11_SIGNED, EAC_RG11, EAC_RG11_SIGNED,
ETC2_RGB8, ETC2_SRGB8,
ETC2_RGB8_A1, ETC2_SRGB8_A1,
ETC2_EAC_RGBA8, ETC2_EAC_SRGBA8,
// Available everywhere except Android/iOS
DXT1_RGB, DXT1_RGBA, DXT3_RGBA, DXT5_RGBA,
DXT1_SRGB, DXT1_SRGBA, DXT3_SRGBA, DXT5_SRGBA,
// ASTC formats are available with a GLES extension
RGBA_ASTC_4x4,
RGBA_ASTC_5x4,
RGBA_ASTC_5x5,
RGBA_ASTC_6x5,
RGBA_ASTC_6x6,
RGBA_ASTC_8x5,
RGBA_ASTC_8x6,
RGBA_ASTC_8x8,
RGBA_ASTC_10x5,
RGBA_ASTC_10x6,
RGBA_ASTC_10x8,
RGBA_ASTC_10x10,
RGBA_ASTC_12x10,
RGBA_ASTC_12x12,
SRGB8_ALPHA8_ASTC_4x4,
SRGB8_ALPHA8_ASTC_5x4,
SRGB8_ALPHA8_ASTC_5x5,
SRGB8_ALPHA8_ASTC_6x5,
SRGB8_ALPHA8_ASTC_6x6,
SRGB8_ALPHA8_ASTC_8x5,
SRGB8_ALPHA8_ASTC_8x6,
SRGB8_ALPHA8_ASTC_8x8,
SRGB8_ALPHA8_ASTC_10x5,
SRGB8_ALPHA8_ASTC_10x6,
SRGB8_ALPHA8_ASTC_10x8,
SRGB8_ALPHA8_ASTC_10x10,
SRGB8_ALPHA8_ASTC_12x10,
SRGB8_ALPHA8_ASTC_12x12,
};
//! Bitmask describing the intended Texture Usage
enum class TextureUsage : uint8_t {
COLOR_ATTACHMENT = 0x1, //!< Texture can be used as a color attachment
DEPTH_ATTACHMENT = 0x2, //!< Texture can be used as a depth attachment
STENCIL_ATTACHMENT = 0x4, //!< Texture can be used as a stencil attachment
UPLOADABLE = 0x8, //!< Data can be uploaded into this texture (default)
SAMPLEABLE = 0x10, //!< Texture can be sampled (default)
SUBPASS_INPUT = 0x20, //!< Texture can be used as a subpass input
DEFAULT = UPLOADABLE | SAMPLEABLE //!< Default texture usage
};
//! Texture swizzle
enum class TextureSwizzle {
SUBSTITUTE_ZERO,
SUBSTITUTE_ONE,
CHANNEL_0,
CHANNEL_1,
CHANNEL_2,
CHANNEL_3
};
//! returns whether this format a depth format
static constexpr bool isDepthFormat(TextureFormat format) noexcept {
switch (format) {
case TextureFormat::DEPTH32F:
case TextureFormat::DEPTH24:
case TextureFormat::DEPTH16:
case TextureFormat::DEPTH32F_STENCIL8:
case TextureFormat::DEPTH24_STENCIL8:
return true;
default:
return false;
}
}
//! returns whether this format a compressed format
static constexpr bool isCompressedFormat(TextureFormat format) noexcept {
return format >= TextureFormat::EAC_R11;
}
//! returns whether this format is an ETC2 compressed format
static constexpr bool isETC2Compression(TextureFormat format) noexcept {
return format >= TextureFormat::EAC_R11 && format <= TextureFormat::ETC2_EAC_SRGBA8;
}
//! returns whether this format is an ETC3 compressed format
static constexpr bool isS3TCCompression(TextureFormat format) noexcept {
return format >= TextureFormat::DXT1_RGB && format <= TextureFormat::DXT5_SRGBA;
}
static constexpr bool isS3TCSRGBCompression(TextureFormat format) noexcept {
return format >= TextureFormat::DXT1_SRGB && format <= TextureFormat::DXT5_SRGBA;
}
//! Texture Cubemap Face
enum class TextureCubemapFace : uint8_t {
// don't change the enums values
POSITIVE_X = 0, //!< +x face
NEGATIVE_X = 1, //!< -x face
POSITIVE_Y = 2, //!< +y face
NEGATIVE_Y = 3, //!< -y face
POSITIVE_Z = 4, //!< +z face
NEGATIVE_Z = 5, //!< -z face
};
//! Face offsets for all faces of a cubemap
struct FaceOffsets {
using size_type = size_t;
union {
struct {
size_type px; //!< +x face offset in bytes
size_type nx; //!< -x face offset in bytes
size_type py; //!< +y face offset in bytes
size_type ny; //!< -y face offset in bytes
size_type pz; //!< +z face offset in bytes
size_type nz; //!< -z face offset in bytes
};
size_type offsets[6];
};
size_type operator[](size_t n) const noexcept { return offsets[n]; }
size_type& operator[](size_t n) { return offsets[n]; }
FaceOffsets() noexcept = default;
explicit FaceOffsets(size_type faceSize) noexcept {
px = faceSize * 0;
nx = faceSize * 1;
py = faceSize * 2;
ny = faceSize * 3;
pz = faceSize * 4;
nz = faceSize * 5;
}
FaceOffsets(const FaceOffsets& rhs) noexcept {
px = rhs.px;
nx = rhs.nx;
py = rhs.py;
ny = rhs.ny;
pz = rhs.pz;
nz = rhs.nz;
}
FaceOffsets& operator=(const FaceOffsets& rhs) noexcept {
px = rhs.px;
nx = rhs.nx;
py = rhs.py;
ny = rhs.ny;
pz = rhs.pz;
nz = rhs.nz;
return *this;
}
};
//! Sampler Wrap mode
enum class SamplerWrapMode : uint8_t {
CLAMP_TO_EDGE, //!< clamp-to-edge. The edge of the texture extends to infinity.
REPEAT, //!< repeat. The texture infinitely repeats in the wrap direction.
MIRRORED_REPEAT, //!< mirrored-repeat. The texture infinitely repeats and mirrors in the wrap direction.
};
//! Sampler minification filter
enum class SamplerMinFilter : uint8_t {
// don't change the enums values
NEAREST = 0, //!< No filtering. Nearest neighbor is used.
LINEAR = 1, //!< Box filtering. Weighted average of 4 neighbors is used.
NEAREST_MIPMAP_NEAREST = 2, //!< Mip-mapping is activated. But no filtering occurs.
LINEAR_MIPMAP_NEAREST = 3, //!< Box filtering within a mip-map level.
NEAREST_MIPMAP_LINEAR = 4, //!< Mip-map levels are interpolated, but no other filtering occurs.
LINEAR_MIPMAP_LINEAR = 5 //!< Both interpolated Mip-mapping and linear filtering are used.
};
//! Sampler magnification filter
enum class SamplerMagFilter : uint8_t {
// don't change the enums values
NEAREST = 0, //!< No filtering. Nearest neighbor is used.
LINEAR = 1, //!< Box filtering. Weighted average of 4 neighbors is used.
};
//! Sampler compare mode
enum class SamplerCompareMode : uint8_t {
// don't change the enums values
NONE = 0,
COMPARE_TO_TEXTURE = 1
};
//! comparison function for the depth sampler
enum class SamplerCompareFunc : uint8_t {
// don't change the enums values
LE = 0, //!< Less or equal
GE, //!< Greater or equal
L, //!< Strictly less than
G, //!< Strictly greater than
E, //!< Equal
NE, //!< Not equal
A, //!< Always. Depth testing is deactivated.
N //!< Never. The depth test always fails.
};
//! Sampler paramters
struct SamplerParams { // NOLINT
union {
struct {
SamplerMagFilter filterMag : 1; //!< magnification filter (NEAREST)
SamplerMinFilter filterMin : 3; //!< minification filter (NEAREST)
SamplerWrapMode wrapS : 2; //!< s-coordinate wrap mode (CLAMP_TO_EDGE)
SamplerWrapMode wrapT : 2; //!< t-coordinate wrap mode (CLAMP_TO_EDGE)
SamplerWrapMode wrapR : 2; //!< r-coordinate wrap mode (CLAMP_TO_EDGE)
uint8_t anisotropyLog2 : 3; //!< anisotropy level (0)
SamplerCompareMode compareMode : 1; //!< sampler compare mode (NONE)
uint8_t padding0 : 2; //!< reserved. must be 0.
SamplerCompareFunc compareFunc : 3; //!< sampler comparison function (LE)
uint8_t padding1 : 5; //!< reserved. must be 0.
uint8_t padding2 : 8; //!< reserved. must be 0.
};
uint32_t u;
};
private:
friend inline bool operator < (SamplerParams lhs, SamplerParams rhs) {
return lhs.u < rhs.u;
}
};
static_assert(sizeof(SamplerParams) == sizeof(uint32_t), "SamplerParams must be 32 bits");
//! blending equation function
enum class BlendEquation : uint8_t {
ADD, //!< the fragment is added to the color buffer
SUBTRACT, //!< the fragment is subtracted from the color buffer
REVERSE_SUBTRACT, //!< the color buffer is subtracted from the fragment
MIN, //!< the min between the fragment and color buffer
MAX //!< the max between the fragment and color buffer
};
//! blending function
enum class BlendFunction : uint8_t {
ZERO, //!< f(src, dst) = 0
ONE, //!< f(src, dst) = 1
SRC_COLOR, //!< f(src, dst) = src
ONE_MINUS_SRC_COLOR, //!< f(src, dst) = 1-src
DST_COLOR, //!< f(src, dst) = dst
ONE_MINUS_DST_COLOR, //!< f(src, dst) = 1-dst
SRC_ALPHA, //!< f(src, dst) = src.a
ONE_MINUS_SRC_ALPHA, //!< f(src, dst) = 1-src.a
DST_ALPHA, //!< f(src, dst) = dst.a
ONE_MINUS_DST_ALPHA, //!< f(src, dst) = 1-dst.a
SRC_ALPHA_SATURATE //!< f(src, dst) = (1,1,1) * min(src.a, 1 - dst.a), 1
};
//! Stream for external textures
enum class StreamType {
NATIVE, //!< Not synchronized but copy-free. Good for video.
TEXTURE_ID, //!< Synchronized, but GL-only and incurs copies. Good for AR on devices before API 26.
ACQUIRED, //!< Synchronized, copy-free, and take a release callback. Good for AR but requires API 26+.
};
//! Releases an ACQUIRED external texture, guaranteed to be called on the application thread.
using StreamCallback = void(*)(void* image, void* user);
//! Vertex attribute descriptor
struct Attribute {
//! attribute is normalized (remapped between 0 and 1)
static constexpr uint8_t FLAG_NORMALIZED = 0x1;
//! attribute is an integer
static constexpr uint8_t FLAG_INTEGER_TARGET = 0x2;
uint32_t offset = 0; //!< attribute offset in bytes
uint8_t stride = 0; //!< attribute stride in bytes
uint8_t buffer = 0xFF; //!< attribute buffer index
ElementType type = ElementType::BYTE; //!< attribute element type
uint8_t flags = 0x0; //!< attribute flags
};
using AttributeArray = std::array<Attribute, MAX_VERTEX_ATTRIBUTE_COUNT>;
//! Raster state descriptor
struct RasterState {
using CullingMode = filament::backend::CullingMode;
using DepthFunc = filament::backend::SamplerCompareFunc;
using BlendEquation = filament::backend::BlendEquation;
using BlendFunction = filament::backend::BlendFunction;
RasterState() noexcept { // NOLINT
static_assert(sizeof(RasterState) == sizeof(uint32_t),
"RasterState size not what was intended");
culling = CullingMode::BACK;
blendEquationRGB = BlendEquation::ADD;
blendEquationAlpha = BlendEquation::ADD;
blendFunctionSrcRGB = BlendFunction::ONE;
blendFunctionSrcAlpha = BlendFunction::ONE;
blendFunctionDstRGB = BlendFunction::ZERO;
blendFunctionDstAlpha = BlendFunction::ZERO;
}
bool operator == (RasterState rhs) const noexcept { return u == rhs.u; }
bool operator != (RasterState rhs) const noexcept { return u != rhs.u; }
void disableBlending() noexcept {
blendEquationRGB = BlendEquation::ADD;
blendEquationAlpha = BlendEquation::ADD;
blendFunctionSrcRGB = BlendFunction::ONE;
blendFunctionSrcAlpha = BlendFunction::ONE;
blendFunctionDstRGB = BlendFunction::ZERO;
blendFunctionDstAlpha = BlendFunction::ZERO;
}
// note: clang reduces this entire function to a simple load/mask/compare
bool hasBlending() const noexcept {
// This is used to decide if blending needs to be enabled in the h/w
return !(blendEquationRGB == BlendEquation::ADD &&
blendEquationAlpha == BlendEquation::ADD &&
blendFunctionSrcRGB == BlendFunction::ONE &&
blendFunctionSrcAlpha == BlendFunction::ONE &&
blendFunctionDstRGB == BlendFunction::ZERO &&
blendFunctionDstAlpha == BlendFunction::ZERO);
}
union {
struct {
//! culling mode
CullingMode culling : 2; // 2
//! blend equation for the red, green and blue components
BlendEquation blendEquationRGB : 3; // 5
//! blend equation for the alpha component
BlendEquation blendEquationAlpha : 3; // 8
//! blending function for the source color
BlendFunction blendFunctionSrcRGB : 4; // 12
//! blending function for the source alpha
BlendFunction blendFunctionSrcAlpha : 4; // 16
//! blending function for the destination color
BlendFunction blendFunctionDstRGB : 4; // 20
//! blending function for the destination alpha
BlendFunction blendFunctionDstAlpha : 4; // 24
//! Whether depth-buffer writes are enabled
bool depthWrite : 1; // 25
//! Depth test function
DepthFunc depthFunc : 3; // 28
//! Whether color-buffer writes are enabled
bool colorWrite : 1; // 29
//! use alpha-channel as coverage mask for anti-aliasing
bool alphaToCoverage : 1; // 30
//! whether front face winding direction must be inverted
bool inverseFrontFaces : 1; // 31
//! padding, must be 0
uint8_t padding : 1; // 32
};
uint32_t u = 0;
};
};
/**
**********************************************************************************************
* \privatesection
*/
enum ShaderType : uint8_t {
VERTEX = 0,
FRAGMENT = 1
};
static constexpr size_t PIPELINE_STAGE_COUNT = 2;
/**
* Selects which buffers to clear at the beginning of the render pass, as well as which buffers
* can be discarded at the beginning and end of the render pass.
*
*/
struct RenderPassFlags {
/**
* bitmask indicating which buffers to clear at the beginning of a render pass.
* This implies discard.
*/
TargetBufferFlags clear;
/**
* bitmask indicating which buffers to discard at the beginning of a render pass.
* Discarded buffers have uninitialized content, they must be entirely drawn over or cleared.
*/
TargetBufferFlags discardStart;
/**
* bitmask indicating which buffers to discard at the end of a render pass.
* Discarded buffers' content becomes invalid, they must not be read from again.
*/
TargetBufferFlags discardEnd;
};
/**
* Parameters of a render pass.
*/
struct RenderPassParams {
RenderPassFlags flags{}; //!< operations performed on the buffers for this pass
Viewport viewport{}; //!< viewport for this pass
DepthRange depthRange{}; //!< depth range for this pass
//! Color to use to clear the COLOR buffer. RenderPassFlags::clear must be set.
filament::math::float4 clearColor = {};
//! Depth value to clear the depth buffer with
double clearDepth = 0.0;
//! Stencil value to clear the stencil buffer with
uint32_t clearStencil = 0;
/**
* The subpass mask specifies which color attachments are designated for read-back in the second
* subpass. If this is zero, the render pass has only one subpass. The least significant bit
* specifies that the first color attachment in the render target is a subpass input.
*
* For now only 2 subpasses are supported, so only the lower 4 bits are used, one for each color
* attachment (see MRT::TARGET_COUNT).
*/
uint32_t subpassMask = 0;
};
struct PolygonOffset {
float slope = 0; // factor in GL-speak
float constant = 0; // units in GL-speak
};
} // namespace backend
} // namespace filament
template<> struct utils::EnableBitMaskOperators<filament::backend::TargetBufferFlags>
: public std::true_type {};
template<> struct utils::EnableBitMaskOperators<filament::backend::TextureUsage>
: public std::true_type {};
#endif // TNT_FILAMENT_DRIVER_DRIVERENUMS_H