// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_GL_EGL_SURFACE_IO_SURFACE_H_
#define UI_GL_EGL_SURFACE_IO_SURFACE_H_
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <IOSurface/IOSurfaceRef.h>
#include <memory>
#include "ui/gfx/buffer_types.h"
#include "ui/gl/gl_export.h"
namespace gl {
// Helper class to create an EGLSurface (PBuffer) for an IOSurface and bind
// it to an EGL texture.
class GL_EXPORT ScopedEGLSurfaceIOSurface {
public:
// Create a PBuffer for the specified IOSurface on the specified EGLDisplay.
// Indicate in `gl_target` the GL target enum (not EGL target enum) that the
// caller intends to bind the IOSurface to. Return nullptr on failure.
static std::unique_ptr<ScopedEGLSurfaceIOSurface> Create(
EGLDisplay display,
unsigned gl_target,
IOSurfaceRef io_surface,
uint32_t plane,
gfx::BufferFormat format);
~ScopedEGLSurfaceIOSurface();
// BindTexImage and ReleaseTexImage will bind and unbind the IOSurface to the
// texture currently bound to the target specified in Create.
bool BindTexImage();
void ReleaseTexImage();
EGLDisplay GetDisplay() { return display_; }
private:
explicit ScopedEGLSurfaceIOSurface(EGLDisplay display);
bool ValidateTarget(unsigned target) const;
bool CreatePBuffer(IOSurfaceRef io_surface,
uint32_t plane,
gfx::BufferFormat format);
void DestroyPBuffer();
EGLDisplay display_ = nullptr;
EGLConfig dummy_config_ = EGL_NO_CONFIG_KHR;
EGLint texture_target_ = EGL_NO_TEXTURE;
EGLSurface pbuffer_ = EGL_NO_SURFACE;
bool texture_bound_ = false;
};
} // namespace gl
#endif // UI_GL_EGL_SURFACE_IO_SURFACE_H_