Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
formats_vk.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_FORMATS_VK_H_
6#define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_FORMATS_VK_H_
7
8#include <cstdint>
9#include <ostream>
10
11#include "flutter/fml/hash_combine.h"
12#include "flutter/fml/macros.h"
17#include "vulkan/vulkan_enums.hpp"
18
19namespace impeller {
20
21constexpr vk::SampleCountFlagBits ToVKSampleCountFlagBits(SampleCount count) {
22 switch (count) {
24 return vk::SampleCountFlagBits::e1;
26 return vk::SampleCountFlagBits::e4;
27 }
29}
30
31constexpr vk::BlendFactor ToVKBlendFactor(BlendFactor factor) {
32 switch (factor) {
34 return vk::BlendFactor::eZero;
36 return vk::BlendFactor::eOne;
38 return vk::BlendFactor::eSrcColor;
40 return vk::BlendFactor::eOneMinusSrcColor;
42 return vk::BlendFactor::eSrcAlpha;
44 return vk::BlendFactor::eOneMinusSrcAlpha;
46 return vk::BlendFactor::eDstColor;
48 return vk::BlendFactor::eOneMinusDstColor;
50 return vk::BlendFactor::eDstAlpha;
52 return vk::BlendFactor::eOneMinusDstAlpha;
54 return vk::BlendFactor::eSrcAlphaSaturate;
56 return vk::BlendFactor::eConstantColor;
58 return vk::BlendFactor::eOneMinusConstantColor;
60 return vk::BlendFactor::eConstantAlpha;
62 return vk::BlendFactor::eOneMinusConstantAlpha;
63 }
65}
66
67constexpr vk::BlendOp ToVKBlendOp(BlendOperation op) {
68 switch (op) {
70 return vk::BlendOp::eAdd;
72 return vk::BlendOp::eSubtract;
74 return vk::BlendOp::eReverseSubtract;
75 }
77}
78
79constexpr vk::ColorComponentFlags ToVKColorComponentFlags(ColorWriteMask type) {
80 vk::ColorComponentFlags mask;
81
83 mask |= vk::ColorComponentFlagBits::eR;
84 }
85
87 mask |= vk::ColorComponentFlagBits::eG;
88 }
89
91 mask |= vk::ColorComponentFlagBits::eB;
92 }
93
95 mask |= vk::ColorComponentFlagBits::eA;
96 }
97
98 return mask;
99}
100
101constexpr vk::PipelineColorBlendAttachmentState
103 vk::PipelineColorBlendAttachmentState res;
104
105 res.setBlendEnable(desc.blending_enabled);
106
107 res.setSrcColorBlendFactor(ToVKBlendFactor(desc.src_color_blend_factor));
108 res.setColorBlendOp(ToVKBlendOp(desc.color_blend_op));
109 res.setDstColorBlendFactor(ToVKBlendFactor(desc.dst_color_blend_factor));
110
111 res.setSrcAlphaBlendFactor(ToVKBlendFactor(desc.src_alpha_blend_factor));
112 res.setAlphaBlendOp(ToVKBlendOp(desc.alpha_blend_op));
113 res.setDstAlphaBlendFactor(ToVKBlendFactor(desc.dst_alpha_blend_factor));
114
115 res.setColorWriteMask(ToVKColorComponentFlags(desc.write_mask));
116
117 return res;
118}
119
120constexpr std::optional<vk::ShaderStageFlagBits> ToVKShaderStageFlagBits(
121 ShaderStage stage) {
122 switch (stage) {
124 return std::nullopt;
126 return vk::ShaderStageFlagBits::eVertex;
128 return vk::ShaderStageFlagBits::eFragment;
130 return vk::ShaderStageFlagBits::eCompute;
131 }
133}
134
135constexpr vk::Format ToVKImageFormat(PixelFormat format) {
136 switch (format) {
141 return vk::Format::eUndefined;
143 // TODO(csg): This is incorrect. Don't depend on swizzle support for GLES.
144 return vk::Format::eR8Unorm;
146 return vk::Format::eR8G8B8A8Unorm;
148 return vk::Format::eR8G8B8A8Srgb;
150 return vk::Format::eB8G8R8A8Unorm;
152 return vk::Format::eB8G8R8A8Srgb;
154 return vk::Format::eR32G32B32A32Sfloat;
156 return vk::Format::eR16G16B16A16Sfloat;
158 return vk::Format::eS8Uint;
160 return vk::Format::eD24UnormS8Uint;
162 return vk::Format::eD32SfloatS8Uint;
164 return vk::Format::eR8Unorm;
166 return vk::Format::eR8G8Unorm;
167 }
168
170}
171
172constexpr PixelFormat ToPixelFormat(vk::Format format) {
173 switch (format) {
174 case vk::Format::eUndefined:
176 case vk::Format::eR8G8B8A8Unorm:
178 case vk::Format::eR8G8B8A8Srgb:
180 case vk::Format::eB8G8R8A8Unorm:
182 case vk::Format::eB8G8R8A8Srgb:
184 case vk::Format::eR32G32B32A32Sfloat:
186 case vk::Format::eR16G16B16A16Sfloat:
188 case vk::Format::eS8Uint:
190 case vk::Format::eD24UnormS8Uint:
192 case vk::Format::eD32SfloatS8Uint:
194 case vk::Format::eR8Unorm:
196 case vk::Format::eR8G8Unorm:
198 default:
200 }
201}
202
203constexpr vk::SampleCountFlagBits ToVKSampleCount(SampleCount sample_count) {
204 switch (sample_count) {
206 return vk::SampleCountFlagBits::e1;
208 return vk::SampleCountFlagBits::e4;
209 }
210
212}
213
214constexpr vk::Filter ToVKSamplerMinMagFilter(MinMagFilter filter) {
215 switch (filter) {
217 return vk::Filter::eNearest;
219 return vk::Filter::eLinear;
220 }
221
223}
224
225constexpr vk::SamplerMipmapMode ToVKSamplerMipmapMode(MipFilter filter) {
226 switch (filter) {
228 return vk::SamplerMipmapMode::eNearest;
230 return vk::SamplerMipmapMode::eLinear;
231 }
232
234}
235
236constexpr vk::SamplerAddressMode ToVKSamplerAddressMode(
237 SamplerAddressMode mode) {
238 switch (mode) {
240 return vk::SamplerAddressMode::eRepeat;
242 return vk::SamplerAddressMode::eMirroredRepeat;
244 return vk::SamplerAddressMode::eClampToEdge;
246 return vk::SamplerAddressMode::eClampToBorder;
247 }
248
250}
251
252constexpr vk::ShaderStageFlags ToVkShaderStage(ShaderStage stage) {
253 switch (stage) {
255 return vk::ShaderStageFlagBits::eAll;
257 return vk::ShaderStageFlagBits::eFragment;
259 return vk::ShaderStageFlagBits::eCompute;
261 return vk::ShaderStageFlagBits::eVertex;
262 }
263
265}
266
267constexpr vk::DescriptorType ToVKDescriptorType(DescriptorType type) {
268 switch (type) {
270 return vk::DescriptorType::eCombinedImageSampler;
271 break;
273 return vk::DescriptorType::eUniformBuffer;
274 break;
276 return vk::DescriptorType::eStorageBuffer;
277 break;
279 return vk::DescriptorType::eSampledImage;
280 break;
282 return vk::DescriptorType::eSampler;
283 break;
285 return vk::DescriptorType::eInputAttachment;
286 }
287
289}
290
291constexpr vk::DescriptorSetLayoutBinding ToVKDescriptorSetLayoutBinding(
292 const DescriptorSetLayout& layout) {
293 vk::DescriptorSetLayoutBinding binding;
294 binding.binding = layout.binding;
295 binding.descriptorCount = 1u;
296 binding.descriptorType = ToVKDescriptorType(layout.descriptor_type);
297 binding.stageFlags = ToVkShaderStage(layout.shader_stage);
298 return binding;
299}
300
301constexpr vk::AttachmentLoadOp ToVKAttachmentLoadOp(LoadAction load_action) {
302 switch (load_action) {
304 return vk::AttachmentLoadOp::eLoad;
306 return vk::AttachmentLoadOp::eClear;
308 return vk::AttachmentLoadOp::eDontCare;
309 }
310
312}
313
314constexpr vk::AttachmentStoreOp ToVKAttachmentStoreOp(StoreAction store_action,
315 bool is_resolve_texture) {
316 switch (store_action) {
318 // Both MSAA and resolve textures need to be stored. A resolve is NOT
319 // performed.
320 return vk::AttachmentStoreOp::eStore;
322 // Both MSAA and resolve textures can be discarded. A resolve is NOT
323 // performed.
324 return vk::AttachmentStoreOp::eDontCare;
326 // The resolve texture is stored but the MSAA texture can be discarded. A
327 // resolve IS performed.
328 return is_resolve_texture ? vk::AttachmentStoreOp::eStore
329 : vk::AttachmentStoreOp::eDontCare;
331 // Both MSAA and resolve textures need to be stored. A resolve IS
332 // performed.
333 return vk::AttachmentStoreOp::eStore;
334 }
336}
337
338constexpr bool StoreActionPerformsResolve(StoreAction store_action) {
339 switch (store_action) {
342 return false;
345 return true;
346 }
348}
349
350constexpr vk::IndexType ToVKIndexType(IndexType index_type) {
351 switch (index_type) {
353 return vk::IndexType::eUint16;
355 return vk::IndexType::eUint32;
357 return vk::IndexType::eUint32;
358 case IndexType::kNone:
360 }
361
363}
364
365constexpr vk::PolygonMode ToVKPolygonMode(PolygonMode mode) {
366 switch (mode) {
368 return vk::PolygonMode::eFill;
370 return vk::PolygonMode::eLine;
371 }
373}
374
375constexpr vk::PrimitiveTopology ToVKPrimitiveTopology(PrimitiveType primitive) {
376 switch (primitive) {
378 return vk::PrimitiveTopology::eTriangleList;
380 return vk::PrimitiveTopology::eTriangleStrip;
382 return vk::PrimitiveTopology::eLineList;
384 return vk::PrimitiveTopology::eLineStrip;
386 return vk::PrimitiveTopology::ePointList;
387 }
388
390}
391
415
416static constexpr vk::AttachmentReference kUnusedAttachmentReference = {
417 VK_ATTACHMENT_UNUSED, vk::ImageLayout::eUndefined};
418
419constexpr vk::CullModeFlags ToVKCullModeFlags(CullMode mode) {
420 switch (mode) {
421 case CullMode::kNone:
422 return vk::CullModeFlagBits::eNone;
424 return vk::CullModeFlagBits::eFront;
426 return vk::CullModeFlagBits::eBack;
427 }
429}
430
431constexpr vk::CompareOp ToVKCompareOp(CompareFunction op) {
432 switch (op) {
434 return vk::CompareOp::eNever;
436 return vk::CompareOp::eAlways;
438 return vk::CompareOp::eLess;
440 return vk::CompareOp::eEqual;
442 return vk::CompareOp::eLessOrEqual;
444 return vk::CompareOp::eGreater;
446 return vk::CompareOp::eNotEqual;
448 return vk::CompareOp::eGreaterOrEqual;
449 }
451}
452
453constexpr vk::StencilOp ToVKStencilOp(StencilOperation op) {
454 switch (op) {
456 return vk::StencilOp::eKeep;
458 return vk::StencilOp::eZero;
460 return vk::StencilOp::eReplace;
462 return vk::StencilOp::eIncrementAndClamp;
464 return vk::StencilOp::eDecrementAndClamp;
466 return vk::StencilOp::eInvert;
468 return vk::StencilOp::eIncrementAndWrap;
470 return vk::StencilOp::eDecrementAndWrap;
471 break;
472 }
474}
475
476constexpr vk::StencilOpState ToVKStencilOpState(
477 const StencilAttachmentDescriptor& desc) {
478 vk::StencilOpState state;
479 state.failOp = ToVKStencilOp(desc.stencil_failure);
480 state.passOp = ToVKStencilOp(desc.depth_stencil_pass);
481 state.depthFailOp = ToVKStencilOp(desc.depth_failure);
482 state.compareOp = ToVKCompareOp(desc.stencil_compare);
483 state.compareMask = desc.read_mask;
484 state.writeMask = desc.write_mask;
485 // This is irrelevant as the stencil references are always dynamic state and
486 // will be set in the render pass.
487 state.reference = 1988;
488 return state;
489}
490
491constexpr vk::ImageAspectFlags ToVKImageAspectFlags(PixelFormat format) {
492 switch (format) {
506 return vk::ImageAspectFlagBits::eColor;
508 return vk::ImageAspectFlagBits::eStencil;
511 return vk::ImageAspectFlagBits::eDepth |
512 vk::ImageAspectFlagBits::eStencil;
513 }
515}
516
517constexpr uint32_t ToArrayLayerCount(TextureType type) {
518 switch (type) {
521 return 1u;
523 return 6u;
526 << "kTextureExternalOES can not be used with the Vulkan backend.";
527 }
529}
530
531constexpr vk::ImageViewType ToVKImageViewType(TextureType type) {
532 switch (type) {
535 return vk::ImageViewType::e2D;
537 return vk::ImageViewType::eCube;
540 << "kTextureExternalOES can not be used with the Vulkan backend.";
541 }
543}
544
545constexpr vk::ImageCreateFlags ToVKImageCreateFlags(TextureType type) {
546 switch (type) {
549 return {};
551 return vk::ImageCreateFlagBits::eCubeCompatible;
554 << "kTextureExternalOES can not be used with the Vulkan backend.";
555 }
557}
558
559vk::PipelineDepthStencilStateCreateInfo ToVKPipelineDepthStencilStateCreateInfo(
560 std::optional<DepthAttachmentDescriptor> depth,
561 std::optional<StencilAttachmentDescriptor> front,
562 std::optional<StencilAttachmentDescriptor> back);
563
564constexpr vk::ImageAspectFlags ToImageAspectFlags(PixelFormat format) {
565 switch (format) {
567 return {};
580 return vk::ImageAspectFlagBits::eColor;
582 return vk::ImageAspectFlagBits::eStencil;
585 return vk::ImageAspectFlagBits::eDepth |
586 vk::ImageAspectFlagBits::eStencil;
587 }
589}
590
591} // namespace impeller
592
593#endif // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_FORMATS_VK_H_
int count
AtkStateType state
uint32_t uint32_t * format
#define FML_UNREACHABLE()
Definition logging.h:109
@ kNone
Does not use the index buffer.
static constexpr vk::AttachmentReference kUnusedAttachmentReference
Definition formats_vk.h:416
PrimitiveType
Decides how backend draws pixels based on input vertices.
Definition formats.h:353
@ kPoint
Draws a point at each input vertex.
constexpr vk::SamplerAddressMode ToVKSamplerAddressMode(SamplerAddressMode mode)
Definition formats_vk.h:236
constexpr vk::PipelineColorBlendAttachmentState ToVKPipelineColorBlendAttachmentState(const ColorAttachmentDescriptor &desc)
Definition formats_vk.h:102
constexpr vk::CompareOp ToVKCompareOp(CompareFunction op)
Definition formats_vk.h:431
constexpr vk::SamplerMipmapMode ToVKSamplerMipmapMode(MipFilter filter)
Definition formats_vk.h:225
constexpr bool StoreActionPerformsResolve(StoreAction store_action)
Definition formats_vk.h:338
@ kNearest
Sample from the nearest mip level.
constexpr vk::IndexType ToVKIndexType(IndexType index_type)
Definition formats_vk.h:350
constexpr vk::DescriptorSetLayoutBinding ToVKDescriptorSetLayoutBinding(const DescriptorSetLayout &layout)
Definition formats_vk.h:291
constexpr uint32_t ToArrayLayerCount(TextureType type)
Definition formats_vk.h:517
constexpr vk::Filter ToVKSamplerMinMagFilter(MinMagFilter filter)
Definition formats_vk.h:214
constexpr vk::ImageAspectFlags ToImageAspectFlags(PixelFormat format)
Definition formats_vk.h:564
constexpr vk::SampleCountFlagBits ToVKSampleCountFlagBits(SampleCount count)
Definition formats_vk.h:21
constexpr vk::AttachmentLoadOp ToVKAttachmentLoadOp(LoadAction load_action)
Definition formats_vk.h:301
constexpr vk::DescriptorType ToVKDescriptorType(DescriptorType type)
Definition formats_vk.h:267
SamplerAddressMode
Definition formats.h:423
@ kDecal
decal sampling mode is only supported on devices that pass the Capabilities.SupportsDecalSamplerAddre...
constexpr vk::PolygonMode ToVKPolygonMode(PolygonMode mode)
Definition formats_vk.h:365
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
Definition formats.h:100
CompareFunction
Definition formats.h:534
@ kEqual
Comparison test passes if new_value == current_value.
@ kLessEqual
Comparison test passes if new_value <= current_value.
@ kGreaterEqual
Comparison test passes if new_value >= current_value.
@ kAlways
Comparison test passes always passes.
@ kLess
Comparison test passes if new_value < current_value.
@ kGreater
Comparison test passes if new_value > current_value.
@ kNotEqual
Comparison test passes if new_value != current_value.
@ kNever
Comparison test never passes.
constexpr vk::AttachmentStoreOp ToVKAttachmentStoreOp(StoreAction store_action, bool is_resolve_texture)
Definition formats_vk.h:314
constexpr vk::CullModeFlags ToVKCullModeFlags(CullMode mode)
Definition formats_vk.h:419
constexpr vk::ColorComponentFlags ToVKColorComponentFlags(ColorWriteMask type)
Definition formats_vk.h:79
StencilOperation
Definition formats.h:553
@ kDecrementWrap
Decrement the current stencil value by 1. If at zero, set to maximum.
@ kSetToReferenceValue
Reset the stencil value to the reference value.
@ kDecrementClamp
Decrement the current stencil value by 1. Clamp it to zero.
@ kZero
Reset the stencil value to zero.
@ kIncrementClamp
Increment the current stencil value by 1. Clamp it to the maximum.
@ kIncrementWrap
Increment the current stencil value by 1. If at maximum, set to zero.
@ kInvert
Perform a logical bitwise invert on the current stencil value.
@ kKeep
Don't modify the current stencil value.
constexpr vk::BlendFactor ToVKBlendFactor(BlendFactor factor)
Definition formats_vk.h:31
constexpr bool PixelFormatIsDepthStencil(PixelFormat format)
Definition formats_vk.h:392
vk::PipelineDepthStencilStateCreateInfo ToVKPipelineDepthStencilStateCreateInfo(std::optional< DepthAttachmentDescriptor > depth, std::optional< StencilAttachmentDescriptor > front, std::optional< StencilAttachmentDescriptor > back)
Definition formats_vk.cc:9
constexpr std::optional< vk::ShaderStageFlagBits > ToVKShaderStageFlagBits(ShaderStage stage)
Definition formats_vk.h:120
constexpr vk::ImageViewType ToVKImageViewType(TextureType type)
Definition formats_vk.h:531
constexpr vk::SampleCountFlagBits ToVKSampleCount(SampleCount sample_count)
Definition formats_vk.h:203
constexpr vk::Format ToVKImageFormat(PixelFormat format)
Definition formats_vk.h:135
constexpr vk::StencilOpState ToVKStencilOpState(const StencilAttachmentDescriptor &desc)
Definition formats_vk.h:476
constexpr vk::ShaderStageFlags ToVkShaderStage(ShaderStage stage)
Definition formats_vk.h:252
constexpr vk::PrimitiveTopology ToVKPrimitiveTopology(PrimitiveType primitive)
Definition formats_vk.h:375
constexpr vk::BlendOp ToVKBlendOp(BlendOperation op)
Definition formats_vk.h:67
@ kNearest
Select nearest to the sample point. Most widely supported.
constexpr vk::StencilOp ToVKStencilOp(StencilOperation op)
Definition formats_vk.h:453
constexpr vk::ImageCreateFlags ToVKImageCreateFlags(TextureType type)
Definition formats_vk.h:545
constexpr vk::ImageAspectFlags ToVKImageAspectFlags(PixelFormat format)
Definition formats_vk.h:491
static PixelFormat ToPixelFormat(AHardwareBuffer_Format format)
BlendOperation
Definition formats.h:197
Describe the color attachment that will be used with this pipeline.
Definition formats.h:500
#define VALIDATION_LOG
Definition validation.h:73
#define VK_ATTACHMENT_UNUSED