blob: 64becdf10d946e3367e364002913d6266a94eed3 [file] [log] [blame]
// 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.
#pragma once
#include "flutter/fml/macros.h"
#include "impeller/renderer/backend/vulkan/vk.h"
#include "impeller/renderer/formats.h"
#include "impeller/renderer/shader_types.h"
namespace impeller {
constexpr vk::SampleCountFlagBits ToVKSampleCountFlagBits(SampleCount count) {
switch (count) {
case SampleCount::kCount1:
return vk::SampleCountFlagBits::e1;
case SampleCount::kCount4:
return vk::SampleCountFlagBits::e4;
}
FML_UNREACHABLE();
}
constexpr vk::BlendFactor ToVKBlendFactor(BlendFactor factor) {
switch (factor) {
case BlendFactor::kZero:
return vk::BlendFactor::eZero;
case BlendFactor::kOne:
return vk::BlendFactor::eOne;
case BlendFactor::kSourceColor:
return vk::BlendFactor::eSrcColor;
case BlendFactor::kOneMinusSourceColor:
return vk::BlendFactor::eOneMinusSrcColor;
case BlendFactor::kSourceAlpha:
return vk::BlendFactor::eSrcAlpha;
case BlendFactor::kOneMinusSourceAlpha:
return vk::BlendFactor::eOneMinusSrcAlpha;
case BlendFactor::kDestinationColor:
return vk::BlendFactor::eDstColor;
case BlendFactor::kOneMinusDestinationColor:
return vk::BlendFactor::eOneMinusDstColor;
case BlendFactor::kDestinationAlpha:
return vk::BlendFactor::eDstAlpha;
case BlendFactor::kOneMinusDestinationAlpha:
return vk::BlendFactor::eOneMinusDstAlpha;
case BlendFactor::kSourceAlphaSaturated:
return vk::BlendFactor::eSrcAlphaSaturate;
case BlendFactor::kBlendColor:
return vk::BlendFactor::eConstantColor;
case BlendFactor::kOneMinusBlendColor:
return vk::BlendFactor::eOneMinusConstantColor;
case BlendFactor::kBlendAlpha:
return vk::BlendFactor::eConstantAlpha;
case BlendFactor::kOneMinusBlendAlpha:
return vk::BlendFactor::eOneMinusConstantAlpha;
}
FML_UNREACHABLE();
}
constexpr vk::BlendOp ToVKBlendOp(BlendOperation op) {
switch (op) {
case BlendOperation::kAdd:
return vk::BlendOp::eAdd;
case BlendOperation::kSubtract:
return vk::BlendOp::eSubtract;
case BlendOperation::kReverseSubtract:
return vk::BlendOp::eReverseSubtract;
}
FML_UNREACHABLE();
}
constexpr vk::ColorComponentFlags ToVKColorComponentFlags(
std::underlying_type_t<ColorWriteMask> type) {
using UnderlyingType = decltype(type);
vk::ColorComponentFlags mask;
if (type & static_cast<UnderlyingType>(ColorWriteMask::kRed)) {
mask |= vk::ColorComponentFlagBits::eR;
}
if (type & static_cast<UnderlyingType>(ColorWriteMask::kGreen)) {
mask |= vk::ColorComponentFlagBits::eG;
}
if (type & static_cast<UnderlyingType>(ColorWriteMask::kBlue)) {
mask |= vk::ColorComponentFlagBits::eB;
}
if (type & static_cast<UnderlyingType>(ColorWriteMask::kAlpha)) {
mask |= vk::ColorComponentFlagBits::eA;
}
return mask;
}
constexpr vk::PipelineColorBlendAttachmentState
ToVKPipelineColorBlendAttachmentState(const ColorAttachmentDescriptor& desc) {
vk::PipelineColorBlendAttachmentState res;
res.setBlendEnable(desc.blending_enabled);
res.setSrcColorBlendFactor(ToVKBlendFactor(desc.src_color_blend_factor));
res.setColorBlendOp(ToVKBlendOp(desc.color_blend_op));
res.setDstColorBlendFactor(ToVKBlendFactor(desc.dst_color_blend_factor));
res.setSrcAlphaBlendFactor(ToVKBlendFactor(desc.src_alpha_blend_factor));
res.setAlphaBlendOp(ToVKBlendOp(desc.alpha_blend_op));
res.setDstAlphaBlendFactor(ToVKBlendFactor(desc.dst_alpha_blend_factor));
res.setColorWriteMask(ToVKColorComponentFlags(desc.write_mask));
return res;
}
constexpr std::optional<vk::ShaderStageFlagBits> ToVKShaderStageFlagBits(
ShaderStage stage) {
switch (stage) {
case ShaderStage::kUnknown:
return std::nullopt;
case ShaderStage::kVertex:
return vk::ShaderStageFlagBits::eVertex;
case ShaderStage::kFragment:
return vk::ShaderStageFlagBits::eFragment;
case ShaderStage::kTessellationControl:
return vk::ShaderStageFlagBits::eTessellationControl;
case ShaderStage::kTessellationEvaluation:
return vk::ShaderStageFlagBits::eTessellationEvaluation;
case ShaderStage::kCompute:
return vk::ShaderStageFlagBits::eCompute;
}
FML_UNREACHABLE();
}
} // namespace impeller