5 #ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_FORMATS_VK_H_
6 #define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_FORMATS_VK_H_
10 #include "flutter/fml/macros.h"
15 #include "vulkan/vulkan_enums.hpp"
22 return vk::SampleCountFlagBits::e1;
24 return vk::SampleCountFlagBits::e4;
32 return vk::BlendFactor::eZero;
34 return vk::BlendFactor::eOne;
36 return vk::BlendFactor::eSrcColor;
38 return vk::BlendFactor::eOneMinusSrcColor;
40 return vk::BlendFactor::eSrcAlpha;
42 return vk::BlendFactor::eOneMinusSrcAlpha;
44 return vk::BlendFactor::eDstColor;
46 return vk::BlendFactor::eOneMinusDstColor;
48 return vk::BlendFactor::eDstAlpha;
50 return vk::BlendFactor::eOneMinusDstAlpha;
52 return vk::BlendFactor::eSrcAlphaSaturate;
54 return vk::BlendFactor::eConstantColor;
56 return vk::BlendFactor::eOneMinusConstantColor;
58 return vk::BlendFactor::eConstantAlpha;
60 return vk::BlendFactor::eOneMinusConstantAlpha;
68 return vk::BlendOp::eAdd;
70 return vk::BlendOp::eSubtract;
72 return vk::BlendOp::eReverseSubtract;
78 std::underlying_type_t<ColorWriteMask> type) {
79 using UnderlyingType = decltype(type);
81 vk::ColorComponentFlags mask;
84 mask |= vk::ColorComponentFlagBits::eR;
88 mask |= vk::ColorComponentFlagBits::eG;
92 mask |= vk::ColorComponentFlagBits::eB;
96 mask |= vk::ColorComponentFlagBits::eA;
102 constexpr vk::PipelineColorBlendAttachmentState
104 vk::PipelineColorBlendAttachmentState res;
127 return vk::ShaderStageFlagBits::eVertex;
129 return vk::ShaderStageFlagBits::eFragment;
131 return vk::ShaderStageFlagBits::eCompute;
142 return vk::Format::eUndefined;
145 return vk::Format::eR8Unorm;
147 return vk::Format::eR8G8B8A8Unorm;
149 return vk::Format::eR8G8B8A8Srgb;
151 return vk::Format::eB8G8R8A8Unorm;
153 return vk::Format::eB8G8R8A8Srgb;
155 return vk::Format::eR32G32B32A32Sfloat;
157 return vk::Format::eR16G16B16A16Sfloat;
159 return vk::Format::eS8Uint;
161 return vk::Format::eD24UnormS8Uint;
163 return vk::Format::eD32SfloatS8Uint;
165 return vk::Format::eR8Unorm;
167 return vk::Format::eR8G8Unorm;
175 case vk::Format::eUndefined:
177 case vk::Format::eR8G8B8A8Unorm:
179 case vk::Format::eR8G8B8A8Srgb:
181 case vk::Format::eB8G8R8A8Unorm:
183 case vk::Format::eB8G8R8A8Srgb:
185 case vk::Format::eR32G32B32A32Sfloat:
187 case vk::Format::eR16G16B16A16Sfloat:
189 case vk::Format::eS8Uint:
191 case vk::Format::eD24UnormS8Uint:
193 case vk::Format::eD32SfloatS8Uint:
195 case vk::Format::eR8Unorm:
197 case vk::Format::eR8G8Unorm:
205 switch (sample_count) {
207 return vk::SampleCountFlagBits::e1;
209 return vk::SampleCountFlagBits::e4;
218 return vk::Filter::eNearest;
220 return vk::Filter::eLinear;
227 vk::SamplerCreateInfo sampler_info;
230 return vk::SamplerMipmapMode::eNearest;
232 return vk::SamplerMipmapMode::eLinear;
242 return vk::SamplerAddressMode::eRepeat;
244 return vk::SamplerAddressMode::eMirroredRepeat;
246 return vk::SamplerAddressMode::eClampToEdge;
248 return vk::SamplerAddressMode::eClampToBorder;
257 return vk::ShaderStageFlagBits::eAll;
259 return vk::ShaderStageFlagBits::eFragment;
261 return vk::ShaderStageFlagBits::eCompute;
263 return vk::ShaderStageFlagBits::eVertex;
272 return vk::DescriptorType::eCombinedImageSampler;
275 return vk::DescriptorType::eUniformBuffer;
278 return vk::DescriptorType::eStorageBuffer;
281 return vk::DescriptorType::eSampledImage;
284 return vk::DescriptorType::eSampler;
287 return vk::DescriptorType::eInputAttachment;
295 vk::DescriptorSetLayoutBinding binding;
296 binding.binding = layout.
binding;
297 binding.descriptorCount = 1u;
304 switch (load_action) {
306 return vk::AttachmentLoadOp::eLoad;
308 return vk::AttachmentLoadOp::eClear;
310 return vk::AttachmentLoadOp::eDontCare;
318 switch (store_action) {
320 return vk::AttachmentStoreOp::eStore;
322 return vk::AttachmentStoreOp::eDontCare;
325 return vk::AttachmentStoreOp::eDontCare;
332 switch (index_type) {
334 return vk::IndexType::eUint16;
336 return vk::IndexType::eUint32;
338 return vk::IndexType::eUint32;
349 return vk::PolygonMode::eFill;
351 return vk::PolygonMode::eLine;
359 return vk::PrimitiveTopology::eTriangleList;
361 return vk::PrimitiveTopology::eTriangleStrip;
363 return vk::PrimitiveTopology::eLineList;
365 return vk::PrimitiveTopology::eLineStrip;
367 return vk::PrimitiveTopology::ePointList;
434 vk::ImageLayout current_layout,
435 bool supports_framebuffer_fetch) {
436 vk::AttachmentDescription vk_attachment;
443 vk_attachment.loadOp = vk::AttachmentLoadOp::eDontCare;
444 vk_attachment.storeOp = vk::AttachmentStoreOp::eDontCare;
445 vk_attachment.stencilLoadOp = vk::AttachmentLoadOp::eDontCare;
446 vk_attachment.stencilStoreOp = vk::AttachmentStoreOp::eDontCare;
473 vk_attachment.initialLayout = current_layout;
474 if (supports_framebuffer_fetch) {
475 vk_attachment.finalLayout = vk::ImageLayout::eGeneral;
477 vk_attachment.finalLayout = vk::ImageLayout::eColorAttachmentOptimal;
484 vk_attachment.initialLayout = current_layout;
485 vk_attachment.finalLayout =
486 vk::ImageLayout::eDepthStencilAttachmentOptimal;
490 return vk_attachment;
494 VK_ATTACHMENT_UNUSED, vk::ImageLayout::eUndefined};
499 return vk::CullModeFlagBits::eNone;
501 return vk::CullModeFlagBits::eFront;
503 return vk::CullModeFlagBits::eBack;
511 return vk::CompareOp::eNever;
513 return vk::CompareOp::eAlways;
515 return vk::CompareOp::eLess;
517 return vk::CompareOp::eEqual;
519 return vk::CompareOp::eLessOrEqual;
521 return vk::CompareOp::eGreater;
523 return vk::CompareOp::eNotEqual;
525 return vk::CompareOp::eGreaterOrEqual;
533 return vk::StencilOp::eKeep;
535 return vk::StencilOp::eZero;
537 return vk::StencilOp::eReplace;
539 return vk::StencilOp::eIncrementAndClamp;
541 return vk::StencilOp::eDecrementAndClamp;
543 return vk::StencilOp::eInvert;
545 return vk::StencilOp::eIncrementAndWrap;
547 return vk::StencilOp::eDecrementAndWrap;
555 vk::StencilOpState state;
564 state.reference = 1988;
583 return vk::ImageAspectFlagBits::eColor;
585 return vk::ImageAspectFlagBits::eStencil;
588 return vk::ImageAspectFlagBits::eDepth |
589 vk::ImageAspectFlagBits::eStencil;
603 <<
"kTextureExternalOES can not be used with the Vulkan backend.";
612 return vk::ImageViewType::e2D;
614 return vk::ImageViewType::eCube;
617 <<
"kTextureExternalOES can not be used with the Vulkan backend.";
628 return vk::ImageCreateFlagBits::eCubeCompatible;
631 <<
"kTextureExternalOES can not be used with the Vulkan backend.";
637 std::optional<DepthAttachmentDescriptor> depth,
638 std::optional<StencilAttachmentDescriptor> front,
639 std::optional<StencilAttachmentDescriptor> back);
657 return vk::ImageAspectFlagBits::eColor;
659 return vk::ImageAspectFlagBits::eStencil;
662 return vk::ImageAspectFlagBits::eDepth |
663 vk::ImageAspectFlagBits::eStencil;
670 #endif // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_FORMATS_VK_H_