Flutter Engine
 
Loading...
Searching...
No Matches
texture_gles.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_GLES_TEXTURE_GLES_H_
6#define FLUTTER_IMPELLER_RENDERER_BACKEND_GLES_TEXTURE_GLES_H_
7
8#include <bitset>
9
10#include "fml/logging.h"
15
16namespace impeller {
17
18class TextureGLES final : public Texture,
19 public BackendCast<TextureGLES, Texture> {
20 public:
27
28 //----------------------------------------------------------------------------
29 /// @brief Create a texture by wrapping an external framebuffer object
30 /// whose lifecycle is owned by the caller.
31 ///
32 /// This is useful for creating a render target for the default
33 /// window managed framebuffer.
34 ///
35 /// @param[in] reactor The reactor
36 /// @param[in] desc The description
37 /// @param[in] fbo The fbo
38 ///
39 /// @return If a texture representation of the framebuffer could be
40 /// created.
41 ///
42 static std::shared_ptr<TextureGLES> WrapFBO(
43 std::shared_ptr<ReactorGLES> reactor,
45 GLuint fbo);
46
47 //----------------------------------------------------------------------------
48 /// @brief Create a texture by wrapping an external OpenGL texture
49 /// handle. Ownership of the texture handle is assumed by the
50 /// reactor.
51 ///
52 /// @param[in] reactor The reactor
53 /// @param[in] desc The description
54 /// @param[in] external_handle The external handle
55 ///
56 /// @return If a texture representation of the framebuffer could be
57 /// created.
58 ///
59 static std::shared_ptr<TextureGLES> WrapTexture(
60 std::shared_ptr<ReactorGLES> reactor,
62 HandleGLES external_handle);
63
64 //----------------------------------------------------------------------------
65 /// @brief Create a "texture" that is never expected to be bound/unbound
66 /// explicitly or initialized in any way. It only exists to setup
67 /// a render pass description.
68 ///
69 /// @param[in] reactor The reactor
70 /// @param[in] desc The description
71 ///
72 /// @return If a texture placeholder could be created.
73 ///
74 static std::shared_ptr<TextureGLES> CreatePlaceholder(
75 std::shared_ptr<ReactorGLES> reactor,
77
78 TextureGLES(std::shared_ptr<ReactorGLES> reactor,
80 bool threadsafe = false);
81
82 // |Texture|
83 ~TextureGLES() override;
84
85 // |Texture|
86 bool IsValid() const override;
87
88 std::optional<GLuint> GetGLHandle() const;
89
90 [[nodiscard]] bool Bind() const;
91
92 [[nodiscard]] bool GenerateMipmap();
93
94 enum class AttachmentType {
95 kColor0,
96 kDepth,
98 };
99 [[nodiscard]] bool SetAsFramebufferAttachment(
100 GLenum target,
101 AttachmentType attachment_type) const;
102
103 Type GetType() const;
104
105 bool IsWrapped() const;
106
107 /// @brief Reset the internal texture state so that the reactor will not free
108 /// the associated handle.
109 void Leak();
110
111 std::optional<GLuint> GetFBO() const;
112
113 //----------------------------------------------------------------------------
114 /// @brief Indicates that all texture storage has already been allocated
115 /// and contents initialized.
116 ///
117 /// This is similar to calling `MarkSliceInitialized` with all
118 /// slices.
119 ///
120 /// @see MarkSliceInitialized.
121 ///
123
124 //----------------------------------------------------------------------------
125 /// @brief Indicates that a specific texture slice has been initialized.
126 ///
127 /// @param[in] slice The slice to mark as being initialized.
128 ///
129 void MarkSliceInitialized(size_t slice) const;
130
131 bool IsSliceInitialized(size_t slice) const;
132
133 //----------------------------------------------------------------------------
134 /// @brief Attach a sync fence to this texture that will be waited on
135 /// before encoding a rendering operation that references it.
136 ///
137 /// @param[in] fence A handle to a sync fence.
138 ///
139 void SetFence(HandleGLES fence);
140
141 /// Store the FBO object for recycling in the 2D renderer.
142 ///
143 /// The color0 texture used by the 2D renderer will use this texture
144 /// object to store the associated FBO the first time it is used.
145 void SetCachedFBO(HandleGLES fbo);
146
147 /// Retrieve the cached FBO object, or a dead handle if there is no object.
148 const HandleGLES& GetCachedFBO() const;
149
150 // Visible for testing.
151 std::optional<HandleGLES> GetSyncFence() const;
152
153 // visible for testing
154 Type ComputeTypeForBinding(GLenum target) const;
155
156 private:
157 std::shared_ptr<ReactorGLES> reactor_;
158 const Type type_;
159 HandleGLES handle_;
160 mutable std::optional<HandleGLES> fence_ = std::nullopt;
161 mutable std::bitset<6> slices_initialized_ = 0;
162 const bool is_wrapped_;
163 const std::optional<GLuint> wrapped_fbo_;
164 HandleGLES cached_fbo_ = HandleGLES::DeadHandle();
165 bool is_valid_ = false;
166
167 TextureGLES(std::shared_ptr<ReactorGLES> reactor,
169 bool threadsafe,
170 std::optional<GLuint> fbo,
171 std::optional<HandleGLES> external_handle);
172
173 // |Texture|
174 void SetLabel(std::string_view label) override;
175
176 // |Texture|
177 void SetLabel(std::string_view label, std::string_view trailing) override;
178
179 // |Texture|
180 bool OnSetContents(const uint8_t* contents,
181 size_t length,
182 size_t slice) override;
183
184 // |Texture|
185 bool OnSetContents(std::shared_ptr<const fml::Mapping> mapping,
186 size_t slice) override;
187
188 // |Texture|
189 ISize GetSize() const override;
190
191 // |Texture|
192 Scalar GetYCoordScale() const override;
193
194 void InitializeContentsIfNecessary() const;
195
196 TextureGLES(const TextureGLES&) = delete;
197
198 TextureGLES& operator=(const TextureGLES&) = delete;
199};
200
201} // namespace impeller
202
203#endif // FLUTTER_IMPELLER_RENDERER_BACKEND_GLES_TEXTURE_GLES_H_
Represents a handle to an underlying OpenGL object. Unlike OpenGL object handles, these handles can b...
Definition handle_gles.h:37
static HandleGLES DeadHandle()
Creates a dead handle.
Definition handle_gles.h:44
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.
void MarkContentsInitialized()
Indicates that all texture storage has already been allocated and contents initialized.
const HandleGLES & GetCachedFBO() const
Retrieve the cached FBO object, or a dead handle if there is no object.
std::optional< HandleGLES > GetSyncFence() const
bool IsSliceInitialized(size_t slice) const
bool IsValid() const override
void SetFence(HandleGLES fence)
Attach a sync fence to this texture that will be waited on before encoding a rendering operation that...
void Leak()
Reset the internal texture state so that the reactor will not free the associated handle.
void SetCachedFBO(HandleGLES fbo)
bool SetAsFramebufferAttachment(GLenum target, AttachmentType attachment_type) const
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....
std::optional< GLuint > GetFBO() const
Type ComputeTypeForBinding(GLenum target) const
void MarkSliceInitialized(size_t slice) const
Indicates that a specific texture slice has been initialized.
std::optional< GLuint > GetGLHandle() const
static std::shared_ptr< TextureGLES > WrapTexture(std::shared_ptr< ReactorGLES > reactor, TextureDescriptor desc, HandleGLES external_handle)
Create a texture by wrapping an external OpenGL texture handle. Ownership of the texture handle is as...
uint32_t * target
size_t length
float Scalar
Definition scalar.h:19
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...