| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_LIB_GPU_FORMATS_H_ | |
| #define FLUTTER_LIB_GPU_FORMATS_H_ | |
| #include "fml/logging.h" | |
| #include "impeller/core/formats.h" | |
| #include "impeller/core/shader_types.h" | |
| // ATTENTION! ATTENTION! ATTENTION! | |
| // All enums defined in this file must exactly match the contents and order of | |
| // the corresponding enums defined in `gpu/lib/src/formats.dart`. | |
| namespace flutter { | |
| namespace gpu { | |
| enum class FlutterGPUStorageMode { | |
| kHostVisible, | |
| kDevicePrivate, | |
| kDeviceTransient, | |
| }; | |
| constexpr impeller::StorageMode ToImpellerStorageMode( | |
| FlutterGPUStorageMode value) { | |
| switch (value) { | |
| case FlutterGPUStorageMode::kHostVisible: | |
| return impeller::StorageMode::kHostVisible; | |
| case FlutterGPUStorageMode::kDevicePrivate: | |
| return impeller::StorageMode::kDevicePrivate; | |
| case FlutterGPUStorageMode::kDeviceTransient: | |
| return impeller::StorageMode::kDeviceTransient; | |
| } | |
| } | |
| constexpr impeller::StorageMode ToImpellerStorageMode(int value) { | |
| return ToImpellerStorageMode(static_cast<FlutterGPUStorageMode>(value)); | |
| } | |
| enum class FlutterGPUPixelFormat { | |
| kUnknown, | |
| kA8UNormInt, | |
| kR8UNormInt, | |
| kR8G8UNormInt, | |
| kR8G8B8A8UNormInt, | |
| kR8G8B8A8UNormIntSRGB, | |
| kB8G8R8A8UNormInt, | |
| kB8G8R8A8UNormIntSRGB, | |
| kR32G32B32A32Float, | |
| kR16G16B16A16Float, | |
| kB10G10R10XR, | |
| kB10G10R10XRSRGB, | |
| kB10G10R10A10XR, | |
| kS8UInt, | |
| kD24UnormS8Uint, | |
| kD32FloatS8UInt, | |
| }; | |
| constexpr impeller::PixelFormat ToImpellerPixelFormat( | |
| FlutterGPUPixelFormat value) { | |
| switch (value) { | |
| case FlutterGPUPixelFormat::kUnknown: | |
| return impeller::PixelFormat::kUnknown; | |
| case FlutterGPUPixelFormat::kA8UNormInt: | |
| return impeller::PixelFormat::kA8UNormInt; | |
| case FlutterGPUPixelFormat::kR8UNormInt: | |
| return impeller::PixelFormat::kR8UNormInt; | |
| case FlutterGPUPixelFormat::kR8G8UNormInt: | |
| return impeller::PixelFormat::kR8G8UNormInt; | |
| case FlutterGPUPixelFormat::kR8G8B8A8UNormInt: | |
| return impeller::PixelFormat::kR8G8B8A8UNormInt; | |
| case FlutterGPUPixelFormat::kR8G8B8A8UNormIntSRGB: | |
| return impeller::PixelFormat::kR8G8B8A8UNormIntSRGB; | |
| case FlutterGPUPixelFormat::kB8G8R8A8UNormInt: | |
| return impeller::PixelFormat::kB8G8R8A8UNormInt; | |
| case FlutterGPUPixelFormat::kB8G8R8A8UNormIntSRGB: | |
| return impeller::PixelFormat::kB8G8R8A8UNormIntSRGB; | |
| case FlutterGPUPixelFormat::kR32G32B32A32Float: | |
| return impeller::PixelFormat::kR32G32B32A32Float; | |
| case FlutterGPUPixelFormat::kR16G16B16A16Float: | |
| return impeller::PixelFormat::kR16G16B16A16Float; | |
| case FlutterGPUPixelFormat::kB10G10R10XR: | |
| return impeller::PixelFormat::kB10G10R10XR; | |
| case FlutterGPUPixelFormat::kB10G10R10XRSRGB: | |
| return impeller::PixelFormat::kB10G10R10XRSRGB; | |
| case FlutterGPUPixelFormat::kB10G10R10A10XR: | |
| return impeller::PixelFormat::kB10G10R10A10XR; | |
| case FlutterGPUPixelFormat::kS8UInt: | |
| return impeller::PixelFormat::kS8UInt; | |
| case FlutterGPUPixelFormat::kD24UnormS8Uint: | |
| return impeller::PixelFormat::kD24UnormS8Uint; | |
| case FlutterGPUPixelFormat::kD32FloatS8UInt: | |
| return impeller::PixelFormat::kD32FloatS8UInt; | |
| } | |
| } | |
| constexpr impeller::PixelFormat ToImpellerPixelFormat(int value) { | |
| return ToImpellerPixelFormat(static_cast<FlutterGPUPixelFormat>(value)); | |
| } | |
| constexpr FlutterGPUPixelFormat FromImpellerPixelFormat( | |
| impeller::PixelFormat value) { | |
| switch (value) { | |
| case impeller::PixelFormat::kUnknown: | |
| return FlutterGPUPixelFormat::kUnknown; | |
| case impeller::PixelFormat::kA8UNormInt: | |
| return FlutterGPUPixelFormat::kA8UNormInt; | |
| case impeller::PixelFormat::kR8UNormInt: | |
| return FlutterGPUPixelFormat::kR8UNormInt; | |
| case impeller::PixelFormat::kR8G8UNormInt: | |
| return FlutterGPUPixelFormat::kR8G8UNormInt; | |
| case impeller::PixelFormat::kR8G8B8A8UNormInt: | |
| return FlutterGPUPixelFormat::kR8G8B8A8UNormInt; | |
| case impeller::PixelFormat::kR8G8B8A8UNormIntSRGB: | |
| return FlutterGPUPixelFormat::kR8G8B8A8UNormIntSRGB; | |
| case impeller::PixelFormat::kB8G8R8A8UNormInt: | |
| return FlutterGPUPixelFormat::kB8G8R8A8UNormInt; | |
| case impeller::PixelFormat::kB8G8R8A8UNormIntSRGB: | |
| return FlutterGPUPixelFormat::kB8G8R8A8UNormIntSRGB; | |
| case impeller::PixelFormat::kR32G32B32A32Float: | |
| return FlutterGPUPixelFormat::kR32G32B32A32Float; | |
| case impeller::PixelFormat::kR16G16B16A16Float: | |
| return FlutterGPUPixelFormat::kR16G16B16A16Float; | |
| case impeller::PixelFormat::kB10G10R10XR: | |
| return FlutterGPUPixelFormat::kB10G10R10XR; | |
| case impeller::PixelFormat::kB10G10R10XRSRGB: | |
| return FlutterGPUPixelFormat::kB10G10R10XRSRGB; | |
| case impeller::PixelFormat::kB10G10R10A10XR: | |
| return FlutterGPUPixelFormat::kB10G10R10A10XR; | |
| case impeller::PixelFormat::kS8UInt: | |
| return FlutterGPUPixelFormat::kS8UInt; | |
| case impeller::PixelFormat::kD24UnormS8Uint: | |
| return FlutterGPUPixelFormat::kD24UnormS8Uint; | |
| case impeller::PixelFormat::kD32FloatS8UInt: | |
| return FlutterGPUPixelFormat::kD32FloatS8UInt; | |
| } | |
| } | |
| enum class FlutterGPUTextureCoordinateSystem { | |
| kUploadFromHost, | |
| kRenderToTexture, | |
| }; | |
| constexpr impeller::TextureCoordinateSystem ToImpellerTextureCoordinateSystem( | |
| FlutterGPUTextureCoordinateSystem value) { | |
| switch (value) { | |
| case FlutterGPUTextureCoordinateSystem::kUploadFromHost: | |
| return impeller::TextureCoordinateSystem::kUploadFromHost; | |
| case FlutterGPUTextureCoordinateSystem::kRenderToTexture: | |
| return impeller::TextureCoordinateSystem::kRenderToTexture; | |
| } | |
| } | |
| constexpr impeller::TextureCoordinateSystem ToImpellerTextureCoordinateSystem( | |
| int value) { | |
| return ToImpellerTextureCoordinateSystem( | |
| static_cast<FlutterGPUTextureCoordinateSystem>(value)); | |
| } | |
| enum class FlutterGPUBlendFactor { | |
| kZero, | |
| kOne, | |
| kSourceColor, | |
| kOneMinusSourceColor, | |
| kSourceAlpha, | |
| kOneMinusSourceAlpha, | |
| kDestinationColor, | |
| kOneMinusDestinationColor, | |
| kDestinationAlpha, | |
| kOneMinusDestinationAlpha, | |
| kSourceAlphaSaturated, | |
| kBlendColor, | |
| kOneMinusBlendColor, | |
| kBlendAlpha, | |
| kOneMinusBlendAlpha, | |
| }; | |
| constexpr impeller::BlendFactor ToImpellerBlendFactor( | |
| FlutterGPUBlendFactor value) { | |
| switch (value) { | |
| case FlutterGPUBlendFactor::kZero: | |
| return impeller::BlendFactor::kZero; | |
| case FlutterGPUBlendFactor::kOne: | |
| return impeller::BlendFactor::kOne; | |
| case FlutterGPUBlendFactor::kSourceColor: | |
| return impeller::BlendFactor::kSourceColor; | |
| case FlutterGPUBlendFactor::kOneMinusSourceColor: | |
| return impeller::BlendFactor::kOneMinusSourceColor; | |
| case FlutterGPUBlendFactor::kSourceAlpha: | |
| return impeller::BlendFactor::kSourceAlpha; | |
| case FlutterGPUBlendFactor::kOneMinusSourceAlpha: | |
| return impeller::BlendFactor::kOneMinusSourceAlpha; | |
| case FlutterGPUBlendFactor::kDestinationColor: | |
| return impeller::BlendFactor::kDestinationColor; | |
| case FlutterGPUBlendFactor::kOneMinusDestinationColor: | |
| return impeller::BlendFactor::kOneMinusDestinationColor; | |
| case FlutterGPUBlendFactor::kDestinationAlpha: | |
| return impeller::BlendFactor::kDestinationAlpha; | |
| case FlutterGPUBlendFactor::kOneMinusDestinationAlpha: | |
| return impeller::BlendFactor::kOneMinusDestinationAlpha; | |
| case FlutterGPUBlendFactor::kSourceAlphaSaturated: | |
| return impeller::BlendFactor::kSourceAlphaSaturated; | |
| case FlutterGPUBlendFactor::kBlendColor: | |
| return impeller::BlendFactor::kBlendColor; | |
| case FlutterGPUBlendFactor::kOneMinusBlendColor: | |
| return impeller::BlendFactor::kOneMinusBlendColor; | |
| case FlutterGPUBlendFactor::kBlendAlpha: | |
| return impeller::BlendFactor::kBlendAlpha; | |
| case FlutterGPUBlendFactor::kOneMinusBlendAlpha: | |
| return impeller::BlendFactor::kOneMinusBlendAlpha; | |
| } | |
| } | |
| constexpr impeller::BlendFactor ToImpellerBlendFactor(int value) { | |
| return ToImpellerBlendFactor(static_cast<FlutterGPUBlendFactor>(value)); | |
| } | |
| enum class FlutterGPUBlendOperation { | |
| kAdd, | |
| kSubtract, | |
| kReverseSubtract, | |
| }; | |
| constexpr impeller::BlendOperation ToImpellerBlendOperation( | |
| FlutterGPUBlendOperation value) { | |
| switch (value) { | |
| case FlutterGPUBlendOperation::kAdd: | |
| return impeller::BlendOperation::kAdd; | |
| case FlutterGPUBlendOperation::kSubtract: | |
| return impeller::BlendOperation::kSubtract; | |
| case FlutterGPUBlendOperation::kReverseSubtract: | |
| return impeller::BlendOperation::kReverseSubtract; | |
| } | |
| } | |
| constexpr impeller::BlendOperation ToImpellerBlendOperation(int value) { | |
| return ToImpellerBlendOperation(static_cast<FlutterGPUBlendOperation>(value)); | |
| } | |
| enum class FlutterGPULoadAction { | |
| kDontCare, | |
| kLoad, | |
| kClear, | |
| }; | |
| constexpr impeller::LoadAction ToImpellerLoadAction( | |
| FlutterGPULoadAction value) { | |
| switch (value) { | |
| case FlutterGPULoadAction::kDontCare: | |
| return impeller::LoadAction::kDontCare; | |
| case FlutterGPULoadAction::kLoad: | |
| return impeller::LoadAction::kLoad; | |
| case FlutterGPULoadAction::kClear: | |
| return impeller::LoadAction::kClear; | |
| } | |
| } | |
| constexpr impeller::LoadAction ToImpellerLoadAction(int value) { | |
| return ToImpellerLoadAction(static_cast<FlutterGPULoadAction>(value)); | |
| } | |
| enum class FlutterGPUStoreAction { | |
| kDontCare, | |
| kStore, | |
| kMultisampleResolve, | |
| kStoreAndMultisampleResolve, | |
| }; | |
| constexpr impeller::StoreAction ToImpellerStoreAction( | |
| FlutterGPUStoreAction value) { | |
| switch (value) { | |
| case FlutterGPUStoreAction::kDontCare: | |
| return impeller::StoreAction::kDontCare; | |
| case FlutterGPUStoreAction::kStore: | |
| return impeller::StoreAction::kStore; | |
| case FlutterGPUStoreAction::kMultisampleResolve: | |
| return impeller::StoreAction::kMultisampleResolve; | |
| case FlutterGPUStoreAction::kStoreAndMultisampleResolve: | |
| return impeller::StoreAction::kStoreAndMultisampleResolve; | |
| } | |
| } | |
| constexpr impeller::StoreAction ToImpellerStoreAction(int value) { | |
| return ToImpellerStoreAction(static_cast<FlutterGPUStoreAction>(value)); | |
| } | |
| enum class FlutterGPUShaderStage { | |
| kVertex, | |
| kFragment, | |
| }; | |
| constexpr impeller::ShaderStage ToImpellerShaderStage( | |
| FlutterGPUShaderStage value) { | |
| switch (value) { | |
| case FlutterGPUShaderStage::kVertex: | |
| return impeller::ShaderStage::kVertex; | |
| case FlutterGPUShaderStage::kFragment: | |
| return impeller::ShaderStage::kFragment; | |
| } | |
| } | |
| constexpr impeller::ShaderStage ToImpellerShaderStage(int value) { | |
| return ToImpellerShaderStage(static_cast<FlutterGPUShaderStage>(value)); | |
| } | |
| constexpr FlutterGPUShaderStage FromImpellerShaderStage( | |
| impeller::ShaderStage value) { | |
| switch (value) { | |
| case impeller::ShaderStage::kVertex: | |
| return FlutterGPUShaderStage::kVertex; | |
| case impeller::ShaderStage::kFragment: | |
| return FlutterGPUShaderStage::kFragment; | |
| case impeller::ShaderStage::kUnknown: | |
| case impeller::ShaderStage::kCompute: | |
| FML_LOG(FATAL) << "Invalid Flutter GPU ShaderStage " | |
| << static_cast<size_t>(value); | |
| FML_UNREACHABLE(); | |
| } | |
| } | |
| enum class FlutterGPUMinMagFilter { | |
| kNearest, | |
| kLinear, | |
| }; | |
| constexpr impeller::MinMagFilter ToImpellerMinMagFilter( | |
| FlutterGPUMinMagFilter value) { | |
| switch (value) { | |
| case FlutterGPUMinMagFilter::kNearest: | |
| return impeller::MinMagFilter::kNearest; | |
| case FlutterGPUMinMagFilter::kLinear: | |
| return impeller::MinMagFilter::kLinear; | |
| } | |
| } | |
| constexpr impeller::MinMagFilter ToImpellerMinMagFilter(int value) { | |
| return ToImpellerMinMagFilter(static_cast<FlutterGPUMinMagFilter>(value)); | |
| } | |
| enum class FlutterGPUMipFilter { | |
| kNearest, | |
| kLinear, | |
| }; | |
| constexpr impeller::MipFilter ToImpellerMipFilter(FlutterGPUMipFilter value) { | |
| switch (value) { | |
| case FlutterGPUMipFilter::kNearest: | |
| return impeller::MipFilter::kNearest; | |
| case FlutterGPUMipFilter::kLinear: | |
| return impeller::MipFilter::kLinear; | |
| } | |
| } | |
| constexpr impeller::MipFilter ToImpellerMipFilter(int value) { | |
| return ToImpellerMipFilter(static_cast<FlutterGPUMipFilter>(value)); | |
| } | |
| enum class FlutterGPUSamplerAddressMode { | |
| kClampToEdge, | |
| kRepeat, | |
| kMirror, | |
| }; | |
| constexpr impeller::SamplerAddressMode ToImpellerSamplerAddressMode( | |
| FlutterGPUSamplerAddressMode value) { | |
| switch (value) { | |
| case FlutterGPUSamplerAddressMode::kClampToEdge: | |
| return impeller::SamplerAddressMode::kClampToEdge; | |
| case FlutterGPUSamplerAddressMode::kRepeat: | |
| return impeller::SamplerAddressMode::kRepeat; | |
| case FlutterGPUSamplerAddressMode::kMirror: | |
| return impeller::SamplerAddressMode::kMirror; | |
| } | |
| } | |
| constexpr impeller::SamplerAddressMode ToImpellerSamplerAddressMode(int value) { | |
| return ToImpellerSamplerAddressMode( | |
| static_cast<FlutterGPUSamplerAddressMode>(value)); | |
| } | |
| enum class FlutterGPUIndexType { | |
| k16bit, | |
| k32bit, | |
| }; | |
| constexpr impeller::IndexType ToImpellerIndexType(FlutterGPUIndexType value) { | |
| switch (value) { | |
| case FlutterGPUIndexType::k16bit: | |
| return impeller::IndexType::k16bit; | |
| case FlutterGPUIndexType::k32bit: | |
| return impeller::IndexType::k32bit; | |
| } | |
| } | |
| constexpr impeller::IndexType ToImpellerIndexType(int value) { | |
| return ToImpellerIndexType(static_cast<FlutterGPUIndexType>(value)); | |
| } | |
| enum class FlutterGPUPrimitiveType { | |
| kTriangle, | |
| kTriangleStrip, | |
| kLine, | |
| kLineStrip, | |
| kPoint, | |
| }; | |
| constexpr impeller::PrimitiveType ToImpellerPrimitiveType( | |
| FlutterGPUPrimitiveType value) { | |
| switch (value) { | |
| case FlutterGPUPrimitiveType::kTriangle: | |
| return impeller::PrimitiveType::kTriangle; | |
| case FlutterGPUPrimitiveType::kTriangleStrip: | |
| return impeller::PrimitiveType::kTriangleStrip; | |
| case FlutterGPUPrimitiveType::kLine: | |
| return impeller::PrimitiveType::kLine; | |
| case FlutterGPUPrimitiveType::kLineStrip: | |
| return impeller::PrimitiveType::kLineStrip; | |
| case FlutterGPUPrimitiveType::kPoint: | |
| return impeller::PrimitiveType::kPoint; | |
| } | |
| } | |
| constexpr impeller::PrimitiveType ToImpellerPrimitiveType(int value) { | |
| return ToImpellerPrimitiveType(static_cast<FlutterGPUPrimitiveType>(value)); | |
| } | |
| enum class FlutterGPUCompareFunction { | |
| kNever, | |
| kAlways, | |
| kLess, | |
| kEqual, | |
| kLessEqual, | |
| kGreater, | |
| kNotEqual, | |
| kGreaterEqual, | |
| }; | |
| constexpr impeller::CompareFunction ToImpellerCompareFunction( | |
| FlutterGPUCompareFunction value) { | |
| switch (value) { | |
| case FlutterGPUCompareFunction::kNever: | |
| return impeller::CompareFunction::kNever; | |
| case FlutterGPUCompareFunction::kAlways: | |
| return impeller::CompareFunction::kAlways; | |
| case FlutterGPUCompareFunction::kLess: | |
| return impeller::CompareFunction::kLess; | |
| case FlutterGPUCompareFunction::kEqual: | |
| return impeller::CompareFunction::kEqual; | |
| case FlutterGPUCompareFunction::kLessEqual: | |
| return impeller::CompareFunction::kLessEqual; | |
| case FlutterGPUCompareFunction::kGreater: | |
| return impeller::CompareFunction::kGreater; | |
| case FlutterGPUCompareFunction::kNotEqual: | |
| return impeller::CompareFunction::kNotEqual; | |
| case FlutterGPUCompareFunction::kGreaterEqual: | |
| return impeller::CompareFunction::kGreaterEqual; | |
| } | |
| } | |
| constexpr impeller::CompareFunction ToImpellerCompareFunction(int value) { | |
| return ToImpellerCompareFunction( | |
| static_cast<FlutterGPUCompareFunction>(value)); | |
| } | |
| enum class FlutterGPUStencilOperation { | |
| kKeep, | |
| kZero, | |
| kSetToReferenceValue, | |
| kIncrementClamp, | |
| kDecrementClamp, | |
| kInvert, | |
| kIncrementWrap, | |
| kDecrementWrap, | |
| }; | |
| constexpr impeller::StencilOperation ToImpellerStencilOperation( | |
| FlutterGPUStencilOperation value) { | |
| switch (value) { | |
| case FlutterGPUStencilOperation::kKeep: | |
| return impeller::StencilOperation::kKeep; | |
| case FlutterGPUStencilOperation::kZero: | |
| return impeller::StencilOperation::kZero; | |
| case FlutterGPUStencilOperation::kSetToReferenceValue: | |
| return impeller::StencilOperation::kSetToReferenceValue; | |
| case FlutterGPUStencilOperation::kIncrementClamp: | |
| return impeller::StencilOperation::kIncrementClamp; | |
| case FlutterGPUStencilOperation::kDecrementClamp: | |
| return impeller::StencilOperation::kDecrementClamp; | |
| case FlutterGPUStencilOperation::kInvert: | |
| return impeller::StencilOperation::kInvert; | |
| case FlutterGPUStencilOperation::kIncrementWrap: | |
| return impeller::StencilOperation::kIncrementWrap; | |
| case FlutterGPUStencilOperation::kDecrementWrap: | |
| return impeller::StencilOperation::kDecrementWrap; | |
| } | |
| } | |
| constexpr impeller::StencilOperation ToImpellerStencilOperation(int value) { | |
| return ToImpellerStencilOperation( | |
| static_cast<FlutterGPUStencilOperation>(value)); | |
| } | |
| } // namespace gpu | |
| } // namespace flutter | |
| #endif // FLUTTER_LIB_GPU_FORMATS_H_ |