Flutter Engine
 
Loading...
Searching...
No Matches
surface_gles.cc
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
6
11
12namespace impeller {
13
14std::unique_ptr<Surface> SurfaceGLES::WrapFBO(
15 const std::shared_ptr<Context>& context,
16 SwapCallback swap_callback,
17 GLuint fbo,
18 PixelFormat color_format,
19 ISize fbo_size) {
20 TRACE_EVENT0("impeller", "SurfaceGLES::WrapOnScreenFBO");
21
22 if (context == nullptr || !context->IsValid() || !swap_callback) {
23 return nullptr;
24 }
25
26 const auto& gl_context = ContextGLES::Cast(*context);
27
28 TextureDescriptor color0_tex;
29 color0_tex.type = TextureType::kTexture2D;
30 color0_tex.format = color_format;
31 color0_tex.size = fbo_size;
35
36 ColorAttachment color0;
37 color0.texture =
38 TextureGLES::WrapFBO(gl_context.GetReactor(), color0_tex, fbo);
42
43 TextureDescriptor depth_stencil_texture_desc;
44 depth_stencil_texture_desc.type = TextureType::kTexture2D;
45 depth_stencil_texture_desc.format = color_format;
46 depth_stencil_texture_desc.size = fbo_size;
47 depth_stencil_texture_desc.usage = TextureUsage::kRenderTarget;
48 depth_stencil_texture_desc.sample_count = SampleCount::kCount1;
49
50 auto depth_stencil_tex =
51 TextureGLES::CreatePlaceholder(gl_context.GetReactor(), //
52 depth_stencil_texture_desc //
53 );
54
55 DepthAttachment depth0;
56 depth0.clear_depth = 0;
57 depth0.texture = depth_stencil_tex;
60
61 StencilAttachment stencil0;
62 stencil0.clear_stencil = 0;
63 stencil0.texture = depth_stencil_tex;
66
67 RenderTarget render_target_desc;
68
69 render_target_desc.SetColorAttachment(color0, 0u);
70 render_target_desc.SetDepthAttachment(depth0);
71 render_target_desc.SetStencilAttachment(stencil0);
72
73#ifdef IMPELLER_DEBUG
74 gl_context.GetGPUTracer()->RecordRasterThread();
75#endif // IMPELLER_DEBUG
76
77 // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)
78 return std::unique_ptr<SurfaceGLES>(
79 new SurfaceGLES(std::move(swap_callback), render_target_desc));
80}
81
82SurfaceGLES::SurfaceGLES(SwapCallback swap_callback,
83 const RenderTarget& target_desc)
84 : Surface(target_desc), swap_callback_(std::move(swap_callback)) {}
85
86// |Surface|
88
89// |Surface|
90bool SurfaceGLES::Present() const {
91 return swap_callback_ ? swap_callback_() : false;
92}
93
94} // namespace impeller
static ContextGLES & Cast(Context &base)
RenderTarget & SetColorAttachment(const ColorAttachment &attachment, size_t index)
RenderTarget & SetDepthAttachment(std::optional< DepthAttachment > attachment)
RenderTarget & SetStencilAttachment(std::optional< StencilAttachment > attachment)
static std::unique_ptr< Surface > WrapFBO(const std::shared_ptr< Context > &context, SwapCallback swap_callback, GLuint fbo, PixelFormat color_format, ISize fbo_size)
std::function< bool(void)> SwapCallback
static std::shared_ptr< TextureGLES > WrapFBO(std::shared_ptr< ReactorGLES > reactor, TextureDescriptor desc, GLuint fbo)
Create a texture by wrapping an external framebuffer object whose lifecycle is owned by the caller.
static std::shared_ptr< TextureGLES > CreatePlaceholder(std::shared_ptr< ReactorGLES > reactor, TextureDescriptor desc)
Create a "texture" that is never expected to be bound/unbound explicitly or initialized in any way....
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
Definition formats.h:99
Definition ref_ptr.h:261
LoadAction load_action
Definition formats.h:659
std::shared_ptr< Texture > texture
Definition formats.h:657
StoreAction store_action
Definition formats.h:660
static constexpr Color DarkSlateGray()
Definition color.h:418
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...
#define TRACE_EVENT0(category_group, name)