Flutter Engine
 
Loading...
Searching...
No Matches
flutter::GPUSurfaceVulkan Class Reference

A GPU surface backed by VkImages provided by a GPUSurfaceVulkanDelegate. More...

#include <gpu_surface_vulkan.h>

Inheritance diagram for flutter::GPUSurfaceVulkan:
flutter::Surface

Public Member Functions

 GPUSurfaceVulkan (GPUSurfaceVulkanDelegate *delegate, const sk_sp< GrDirectContext > &context, bool render_to_surface)
 Create a GPUSurfaceVulkan while letting it reuse an existing GrDirectContext.
 
 ~GPUSurfaceVulkan () override
 
bool IsValid () override
 
std::unique_ptr< SurfaceFrameAcquireFrame (const DlISize &size) override
 
DlMatrix GetRootTransformation () const override
 
GrDirectContext * GetContext () override
 
- Public Member Functions inherited from flutter::Surface
 Surface ()
 
virtual ~Surface ()
 
virtual std::unique_ptr< GLContextResultMakeRenderContextCurrent ()
 
virtual bool ClearRenderContext ()
 
virtual bool AllowsDrawingWhenGpuDisabled () const
 
virtual bool EnableRasterCache () const
 
virtual std::shared_ptr< impeller::AiksContextGetAiksContext () const
 
virtual SurfaceData GetSurfaceData () const
 

Static Public Member Functions

static SkColorType ColorTypeFromFormat (const VkFormat format)
 

Detailed Description

A GPU surface backed by VkImages provided by a GPUSurfaceVulkanDelegate.

Definition at line 26 of file gpu_surface_vulkan.h.

Constructor & Destructor Documentation

◆ GPUSurfaceVulkan()

flutter::GPUSurfaceVulkan::GPUSurfaceVulkan ( GPUSurfaceVulkanDelegate delegate,
const sk_sp< GrDirectContext > &  context,
bool  render_to_surface 
)

Create a GPUSurfaceVulkan while letting it reuse an existing GrDirectContext.

Definition at line 22 of file gpu_surface_vulkan.cc.

25 : delegate_(delegate),
26 skia_context_(skia_context),
27 render_to_surface_(render_to_surface),
28 weak_factory_(this) {}

◆ ~GPUSurfaceVulkan()

flutter::GPUSurfaceVulkan::~GPUSurfaceVulkan ( )
overridedefault

Member Function Documentation

◆ AcquireFrame()

std::unique_ptr< SurfaceFrame > flutter::GPUSurfaceVulkan::AcquireFrame ( const DlISize size)
overridevirtual

Implements flutter::Surface.

Definition at line 36 of file gpu_surface_vulkan.cc.

37 {
38 if (!IsValid()) {
39 FML_LOG(ERROR) << "Vulkan surface was invalid.";
40 return nullptr;
41 }
42
43 if (frame_size.IsEmpty()) {
44 FML_LOG(ERROR) << "Vulkan surface was asked for an empty frame.";
45 return nullptr;
46 }
47
48 if (!render_to_surface_) {
49 return std::make_unique<SurfaceFrame>(
50 nullptr, SurfaceFrame::FramebufferInfo(),
51 [](const SurfaceFrame& surface_frame, DlCanvas* canvas) {
52 return true;
53 },
54 [](const SurfaceFrame& surface_frame) { return true; }, frame_size);
55 }
56
57 FlutterVulkanImage image = delegate_->AcquireImage(frame_size);
58 if (!image.image) {
59 FML_LOG(ERROR) << "Invalid VkImage given by the embedder.";
60 return nullptr;
61 }
62
63 sk_sp<SkSurface> surface = CreateSurfaceFromVulkanImage(
64 reinterpret_cast<VkImage>(image.image),
65 static_cast<VkFormat>(image.format), frame_size);
66 if (!surface) {
67 FML_LOG(ERROR) << "Could not create the SkSurface from the Vulkan image.";
68 return nullptr;
69 }
70
71 SurfaceFrame::EncodeCallback encode_callback = [](const SurfaceFrame&,
72 DlCanvas* canvas) -> bool {
73 if (canvas == nullptr) {
74 FML_DLOG(ERROR) << "Canvas not available.";
75 return false;
76 }
77 canvas->Flush();
78 return true;
79 };
80
81 SurfaceFrame::SubmitCallback submit_callback =
82 [image = image, delegate = delegate_](const SurfaceFrame&) -> bool {
83 TRACE_EVENT0("flutter", "GPUSurfaceVulkan::PresentImage");
84 return delegate->PresentImage(reinterpret_cast<VkImage>(image.image),
85 static_cast<VkFormat>(image.format));
86 };
87
88 SurfaceFrame::FramebufferInfo framebuffer_info{.supports_readback = true};
89
90 return std::make_unique<SurfaceFrame>(std::move(surface), framebuffer_info,
91 std::move(encode_callback),
92 std::move(submit_callback), frame_size);
93}
virtual FlutterVulkanImage AcquireImage(const DlISize &size)=0
Called by the engine to fetch a VkImage for writing the next frame.
std::function< bool(SurfaceFrame &surface_frame, DlCanvas *canvas)> EncodeCallback
std::function< bool(SurfaceFrame &surface_frame)> SubmitCallback
FlutterVulkanImage * image
VkSurfaceKHR surface
Definition main.cc:65
#define FML_DLOG(severity)
Definition logging.h:121
#define FML_LOG(severity)
Definition logging.h:101
flutter::DlCanvas DlCanvas
FlutterVulkanImageHandle image
Definition embedder.h:931
uint32_t format
The VkFormat of the image (for example: VK_FORMAT_R8G8B8A8_UNORM).
Definition embedder.h:933
#define TRACE_EVENT0(category_group, name)

References flutter::GPUSurfaceVulkanDelegate::AcquireImage(), FML_DLOG, FML_LOG, FlutterVulkanImage::format, FlutterVulkanImage::image, image, impeller::TSize< T >::IsEmpty(), IsValid(), flutter::SurfaceFrame::FramebufferInfo::supports_readback, surface, and TRACE_EVENT0.

◆ ColorTypeFromFormat()

SkColorType flutter::GPUSurfaceVulkan::ColorTypeFromFormat ( const VkFormat  format)
static

Definition at line 141 of file gpu_surface_vulkan.cc.

141 {
142 switch (format) {
143 case VK_FORMAT_R8G8B8A8_UNORM:
144 case VK_FORMAT_R8G8B8A8_SRGB:
145 return SkColorType::kRGBA_8888_SkColorType;
146 case VK_FORMAT_B8G8R8A8_UNORM:
147 case VK_FORMAT_B8G8R8A8_SRGB:
148 return SkColorType::kBGRA_8888_SkColorType;
149 default:
150 return SkColorType::kUnknown_SkColorType;
151 }
152}

References format.

Referenced by MakeSkSurfaceFromBackingStore().

◆ GetContext()

GrDirectContext * flutter::GPUSurfaceVulkan::GetContext ( )
overridevirtual

Implements flutter::Surface.

Definition at line 101 of file gpu_surface_vulkan.cc.

101 {
102 return skia_context_.get();
103}

◆ GetRootTransformation()

DlMatrix flutter::GPUSurfaceVulkan::GetRootTransformation ( ) const
overridevirtual

Implements flutter::Surface.

Definition at line 95 of file gpu_surface_vulkan.cc.

95 {
96 // This backend does not support delegating to the underlying platform to
97 // query for root surface transformations. Just return identity.
98 return DlMatrix();
99}
impeller::Matrix DlMatrix

◆ IsValid()

bool flutter::GPUSurfaceVulkan::IsValid ( )
overridevirtual

Implements flutter::Surface.

Definition at line 32 of file gpu_surface_vulkan.cc.

32 {
33 return skia_context_ != nullptr;
34}

Referenced by AcquireFrame().


The documentation for this class was generated from the following files: