Flutter Impeller
impeller::TextureGLES Class Referencefinal

#include <texture_gles.h>

Inheritance diagram for impeller::TextureGLES:
impeller::Texture impeller::BackendCast< TextureGLES, Texture >

Public Types

enum class  Type {
  kTexture ,
  kTextureMultisampled ,
  kRenderBuffer ,
  kRenderBufferMultisampled
}
 
enum class  AttachmentType {
  kColor0 ,
  kDepth ,
  kStencil
}
 

Public Member Functions

 TextureGLES (std::shared_ptr< ReactorGLES > reactor, TextureDescriptor desc, bool threadsafe=false)
 
 ~TextureGLES () override
 
bool IsValid () const override
 
std::optional< GLuint > GetGLHandle () const
 
bool Bind () const
 
bool GenerateMipmap ()
 
bool SetAsFramebufferAttachment (GLenum target, AttachmentType attachment_type) const
 
Type GetType () const
 
bool IsWrapped () const
 
void Leak ()
 Reset the internal texture state so that the reactor will not free the associated handle. More...
 
std::optional< GLuint > GetFBO () const
 
void MarkContentsInitialized ()
 Indicates that all texture storage has already been allocated and contents initialized. More...
 
void MarkSliceInitialized (size_t slice) const
 Indicates that a specific texture slice has been initialized. More...
 
bool IsSliceInitialized (size_t slice) const
 
void SetFence (HandleGLES fence)
 Attach a sync fence to this texture that will be waited on before encoding a rendering operation that references it. More...
 
void SetCachedFBO (HandleGLES fbo)
 
const HandleGLESGetCachedFBO () const
 Retrieve the cached FBO object, or a dead handle if there is no object. More...
 
std::optional< HandleGLESGetSyncFence () const
 
Type ComputeTypeForBinding (GLenum target) const
 
- Public Member Functions inherited from impeller::Texture
virtual ~Texture ()
 
bool SetContents (const uint8_t *contents, size_t length, size_t slice=0, bool is_opaque=false)
 
bool SetContents (std::shared_ptr< const fml::Mapping > mapping, size_t slice=0, bool is_opaque=false)
 
bool IsOpaque () const
 
size_t GetMipCount () const
 
const TextureDescriptorGetTextureDescriptor () const
 
void SetCoordinateSystem (TextureCoordinateSystem coordinate_system)
 
TextureCoordinateSystem GetCoordinateSystem () const
 
bool NeedsMipmapGeneration () const
 

Static Public Member Functions

static std::shared_ptr< TextureGLESWrapFBO (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. More...
 
static std::shared_ptr< TextureGLESWrapTexture (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 assumed by the reactor. More...
 
static std::shared_ptr< TextureGLESCreatePlaceholder (std::shared_ptr< ReactorGLES > reactor, TextureDescriptor desc)
 Create a "texture" that is never expected to be bound/unbound explicitly or initialized in any way. It only exists to setup a render pass description. More...
 
- Static Public Member Functions inherited from impeller::BackendCast< TextureGLES, Texture >
static TextureGLESCast (Texture &base)
 
static const TextureGLESCast (const Texture &base)
 
static TextureGLESCast (Texture *base)
 
static const TextureGLESCast (const Texture *base)
 

Additional Inherited Members

- Protected Member Functions inherited from impeller::Texture
 Texture (TextureDescriptor desc)
 
- Protected Attributes inherited from impeller::Texture
bool mipmap_generated_ = false
 

Detailed Description

Definition at line 18 of file texture_gles.h.

Member Enumeration Documentation

◆ AttachmentType

Enumerator
kColor0 
kDepth 
kStencil 

Definition at line 94 of file texture_gles.h.

94  {
95  kColor0,
96  kDepth,
97  kStencil,
98  };

◆ Type

Enumerator
kTexture 
kTextureMultisampled 
kRenderBuffer 
kRenderBufferMultisampled 

Definition at line 21 of file texture_gles.h.

21  {
22  kTexture,
23  kTextureMultisampled,
25  kRenderBufferMultisampled,
26  };

Constructor & Destructor Documentation

◆ TextureGLES()

impeller::TextureGLES::TextureGLES ( std::shared_ptr< ReactorGLES reactor,
TextureDescriptor  desc,
bool  threadsafe = false 
)

Definition at line 116 of file texture_gles.cc.

119  : TextureGLES(std::move(reactor), //
120  desc, //
121  threadsafe, //
122  std::nullopt, //
123  std::nullopt //
124  ) {}
TextureGLES(std::shared_ptr< ReactorGLES > reactor, TextureDescriptor desc, bool threadsafe=false)

Referenced by WrapFBO(), and WrapTexture().

◆ ~TextureGLES()

impeller::TextureGLES::~TextureGLES ( )
override

Definition at line 161 of file texture_gles.cc.

161  {
162  reactor_->CollectHandle(handle_);
163  if (!cached_fbo_.IsDead()) {
164  reactor_->CollectHandle(cached_fbo_);
165  }
166 }
constexpr bool IsDead() const
Determines if the handle is dead.
Definition: handle_gles.h:58

References impeller::HandleGLES::IsDead().

Member Function Documentation

◆ Bind()

bool impeller::TextureGLES::Bind ( ) const

Definition at line 453 of file texture_gles.cc.

453  {
454  auto handle = GetGLHandle();
455  if (!handle.has_value()) {
456  return false;
457  }
458  const auto& gl = reactor_->GetProcTable();
459 
460  if (fence_.has_value()) {
461  std::optional<GLsync> fence = reactor_->GetGLFence(fence_.value());
462  if (fence.has_value()) {
463  gl.WaitSync(fence.value(), 0, GL_TIMEOUT_IGNORED);
464  }
465  reactor_->CollectHandle(fence_.value());
466  fence_ = std::nullopt;
467  }
468 
469  switch (type_) {
470  case Type::kTexture:
472  const auto target = ToTextureTarget(GetTextureDescriptor().type);
473  if (!target.has_value()) {
474  VALIDATION_LOG << "Could not bind texture of this type.";
475  return false;
476  }
477  gl.BindTexture(target.value(), handle.value());
478  } break;
479  case Type::kRenderBuffer:
481  gl.BindRenderbuffer(GL_RENDERBUFFER, handle.value());
482  break;
483  }
484  InitializeContentsIfNecessary();
485  return true;
486 }
std::optional< GLuint > GetGLHandle() const
const TextureDescriptor & GetTextureDescriptor() const
Definition: texture.cc:57
constexpr std::optional< GLenum > ToTextureTarget(TextureType type)
Definition: formats_gles.h:185
#define VALIDATION_LOG
Definition: validation.h:91

References GetGLHandle(), impeller::Texture::GetTextureDescriptor(), kRenderBuffer, kRenderBufferMultisampled, kTexture, kTextureMultisampled, impeller::ToTextureTarget(), and VALIDATION_LOG.

Referenced by GenerateMipmap().

◆ ComputeTypeForBinding()

TextureGLES::Type impeller::TextureGLES::ComputeTypeForBinding ( GLenum  target) const

Definition at line 343 of file texture_gles.cc.

343  {
344  // When binding to a GL_READ_FRAMEBUFFER, any multisampled
345  // textures must be bound as single sampled.
346  if (target == GL_READ_FRAMEBUFFER && type_ == Type::kTextureMultisampled) {
347  return Type::kTexture;
348  }
349  return type_;
350 }

References kTexture, and kTextureMultisampled.

Referenced by SetAsFramebufferAttachment().

◆ CreatePlaceholder()

std::shared_ptr< TextureGLES > impeller::TextureGLES::CreatePlaceholder ( std::shared_ptr< ReactorGLES reactor,
TextureDescriptor  desc 
)
static

Create a "texture" that is never expected to be bound/unbound explicitly or initialized in any way. It only exists to setup a render pass description.

Parameters
[in]reactorThe reactor
[in]descThe description
Returns
If a texture placeholder could be created.

Definition at line 110 of file texture_gles.cc.

112  {
113  return TextureGLES::WrapFBO(std::move(reactor), desc, 0u);
114 }
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.
Definition: texture_gles.cc:78

References WrapFBO().

Referenced by impeller::SurfaceGLES::WrapFBO().

◆ GenerateMipmap()

bool impeller::TextureGLES::GenerateMipmap ( )

Definition at line 502 of file texture_gles.cc.

502  {
503  if (!IsValid()) {
504  return false;
505  }
506 
507  auto type = GetTextureDescriptor().type;
508  switch (type) {
510  break;
512  VALIDATION_LOG << "Generating mipmaps for multisample textures is not "
513  "supported in the GLES backend.";
514  return false;
516  break;
518  break;
519  }
520 
521  if (!Bind()) {
522  return false;
523  }
524 
525  auto handle = GetGLHandle();
526  if (!handle.has_value()) {
527  return false;
528  }
529 
530  const auto& gl = reactor_->GetProcTable();
531  gl.GenerateMipmap(ToTextureType(type));
532  mipmap_generated_ = true;
533  return true;
534 }
bool IsValid() const override
bool mipmap_generated_
Definition: texture.h:79
constexpr GLenum ToTextureType(TextureType type)
Definition: formats_gles.h:171

References Bind(), GetGLHandle(), impeller::Texture::GetTextureDescriptor(), IsValid(), impeller::kTexture2D, impeller::kTexture2DMultisample, impeller::kTextureCube, impeller::kTextureExternalOES, impeller::Texture::mipmap_generated_, impeller::ToTextureType(), impeller::TextureDescriptor::type, and VALIDATION_LOG.

◆ GetCachedFBO()

const HandleGLES & impeller::TextureGLES::GetCachedFBO ( ) const

Retrieve the cached FBO object, or a dead handle if there is no object.

Definition at line 630 of file texture_gles.cc.

630  {
631  return cached_fbo_;
632 }

Referenced by impeller::EncodeCommandsInReactor().

◆ GetFBO()

std::optional< GLuint > impeller::TextureGLES::GetFBO ( ) const

Definition at line 612 of file texture_gles.cc.

612  {
613  return wrapped_fbo_;
614 }

Referenced by impeller::EncodeCommandsInReactor().

◆ GetGLHandle()

std::optional< GLuint > impeller::TextureGLES::GetGLHandle ( ) const

Definition at line 446 of file texture_gles.cc.

446  {
447  if (!IsValid()) {
448  return std::nullopt;
449  }
450  return reactor_->GetGLHandle(handle_);
451 }

References IsValid().

Referenced by Bind(), impeller::ConfigureFBO(), impeller::BlitCopyBufferToTextureCommandGLES::Encode(), GenerateMipmap(), impeller::interop::ImpellerTextureGetOpenGLHandle(), and SetAsFramebufferAttachment().

◆ GetSyncFence()

std::optional< HandleGLES > impeller::TextureGLES::GetSyncFence ( ) const

Definition at line 622 of file texture_gles.cc.

622  {
623  return fence_;
624 }

◆ GetType()

TextureGLES::Type impeller::TextureGLES::GetType ( ) const

Definition at line 536 of file texture_gles.cc.

536  {
537  return type_;
538 }

Referenced by impeller::BlitCopyBufferToTextureCommandGLES::Encode().

◆ IsSliceInitialized()

bool impeller::TextureGLES::IsSliceInitialized ( size_t  slice) const

Definition at line 498 of file texture_gles.cc.

498  {
499  return slices_initialized_[slice];
500 }

Referenced by impeller::BlitCopyBufferToTextureCommandGLES::Encode().

◆ IsValid()

bool impeller::TextureGLES::IsValid ( ) const
overridevirtual

Implements impeller::Texture.

Definition at line 173 of file texture_gles.cc.

173  {
174  return is_valid_;
175 }

Referenced by GenerateMipmap(), GetGLHandle(), and SetAsFramebufferAttachment().

◆ IsWrapped()

bool impeller::TextureGLES::IsWrapped ( ) const

Definition at line 608 of file texture_gles.cc.

608  {
609  return is_wrapped_;
610 }

Referenced by impeller::ConfigureFBO(), impeller::BlitCopyBufferToTextureCommandGLES::Encode(), and impeller::EncodeCommandsInReactor().

◆ Leak()

void impeller::TextureGLES::Leak ( )

Reset the internal texture state so that the reactor will not free the associated handle.

Definition at line 168 of file texture_gles.cc.

168  {
169  handle_ = HandleGLES::DeadHandle();
170 }
static HandleGLES DeadHandle()
Creates a dead handle.
Definition: handle_gles.h:49

References impeller::HandleGLES::DeadHandle().

◆ MarkContentsInitialized()

void impeller::TextureGLES::MarkContentsInitialized ( )

Indicates that all texture storage has already been allocated and contents initialized.

This is similar to calling MarkSliceInitialized with all slices.

See also
MarkSliceInitialized.

Definition at line 488 of file texture_gles.cc.

488  {
489  for (size_t i = 0; i < slices_initialized_.size(); i++) {
490  slices_initialized_[i] = true;
491  }
492 }

◆ MarkSliceInitialized()

void impeller::TextureGLES::MarkSliceInitialized ( size_t  slice) const

Indicates that a specific texture slice has been initialized.

Parameters
[in]sliceThe slice to mark as being initialized.

Definition at line 494 of file texture_gles.cc.

494  {
495  slices_initialized_[slice] = true;
496 }

Referenced by impeller::BlitCopyBufferToTextureCommandGLES::Encode().

◆ SetAsFramebufferAttachment()

bool impeller::TextureGLES::SetAsFramebufferAttachment ( GLenum  target,
AttachmentType  attachment_type 
) const

Definition at line 551 of file texture_gles.cc.

553  {
554  if (!IsValid()) {
555  return false;
556  }
557  InitializeContentsIfNecessary();
558  auto handle = GetGLHandle();
559  if (!handle.has_value()) {
560  return false;
561  }
562  const auto& gl = reactor_->GetProcTable();
563 
564  switch (ComputeTypeForBinding(target)) {
565  case Type::kTexture:
566  gl.FramebufferTexture2D(target, // target
567  ToAttachmentType(attachment_type), // attachment
568  GL_TEXTURE_2D, // textarget
569  handle.value(), // texture
570  0 // level
571  );
572  break;
574  gl.FramebufferTexture2DMultisampleEXT(
575  target, // target
576  ToAttachmentType(attachment_type), // attachment
577  GL_TEXTURE_2D, // textarget
578  handle.value(), // texture
579  0, // level
580  4 // samples
581  );
582  break;
583  case Type::kRenderBuffer:
585  gl.FramebufferRenderbuffer(
586  target, // target
587  ToAttachmentType(attachment_type), // attachment
588  GL_RENDERBUFFER, // render-buffer target
589  handle.value() // render-buffer
590  );
591  break;
592  }
593 
594  return true;
595 }
Type ComputeTypeForBinding(GLenum target) const
static GLenum ToAttachmentType(TextureGLES::AttachmentType point)

References ComputeTypeForBinding(), GetGLHandle(), IsValid(), kRenderBuffer, kRenderBufferMultisampled, kTexture, kTextureMultisampled, and impeller::ToAttachmentType().

Referenced by impeller::ConfigureFBO(), and impeller::EncodeCommandsInReactor().

◆ SetCachedFBO()

void impeller::TextureGLES::SetCachedFBO ( HandleGLES  fbo)

Store the FBO object for recycling in the 2D renderer.

The color0 texture used by the 2D renderer will use this texture object to store the associated FBO the first time it is used.

Definition at line 626 of file texture_gles.cc.

626  {
627  cached_fbo_ = fbo;
628 }

Referenced by impeller::EncodeCommandsInReactor().

◆ SetFence()

void impeller::TextureGLES::SetFence ( HandleGLES  fence)

Attach a sync fence to this texture that will be waited on before encoding a rendering operation that references it.

Parameters
[in]fenceA handle to a sync fence.

Definition at line 616 of file texture_gles.cc.

616  {
617  FML_DCHECK(!fence_.has_value());
618  fence_ = fence;
619 }

◆ WrapFBO()

std::shared_ptr< TextureGLES > impeller::TextureGLES::WrapFBO ( std::shared_ptr< ReactorGLES reactor,
TextureDescriptor  desc,
GLuint  fbo 
)
static

Create a texture by wrapping an external framebuffer object whose lifecycle is owned by the caller.

This is useful for creating a render target for the default window managed framebuffer.

Parameters
[in]reactorThe reactor
[in]descThe description
[in]fboThe fbo
Returns
If a texture representation of the framebuffer could be created.

Definition at line 78 of file texture_gles.cc.

81  {
82  auto texture = std::shared_ptr<TextureGLES>(
83  new TextureGLES(std::move(reactor), desc, false, fbo, std::nullopt));
84  if (!texture->IsValid()) {
85  return nullptr;
86  }
87  return texture;
88 }

References TextureGLES().

Referenced by CreatePlaceholder(), impeller::testing::TEST_P(), and impeller::SurfaceGLES::WrapFBO().

◆ WrapTexture()

std::shared_ptr< TextureGLES > impeller::TextureGLES::WrapTexture ( std::shared_ptr< ReactorGLES reactor,
TextureDescriptor  desc,
HandleGLES  external_handle 
)
static

Create a texture by wrapping an external OpenGL texture handle. Ownership of the texture handle is assumed by the reactor.

Parameters
[in]reactorThe reactor
[in]descThe description
[in]external_handleThe external handle
Returns
If a texture representation of the framebuffer could be created.

Definition at line 90 of file texture_gles.cc.

93  {
94  if (external_handle.IsDead()) {
95  VALIDATION_LOG << "Cannot wrap a dead handle.";
96  return nullptr;
97  }
98  if (external_handle.GetType() != HandleType::kTexture) {
99  VALIDATION_LOG << "Cannot wrap a non-texture handle.";
100  return nullptr;
101  }
102  auto texture = std::shared_ptr<TextureGLES>(new TextureGLES(
103  std::move(reactor), desc, false, std::nullopt, external_handle));
104  if (!texture->IsValid()) {
105  return nullptr;
106  }
107  return texture;
108 }

References impeller::HandleGLES::GetType(), impeller::HandleGLES::IsDead(), impeller::kTexture, TextureGLES(), and VALIDATION_LOG.

Referenced by impeller::interop::ImpellerTextureCreateWithOpenGLTextureHandleNew().


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