blob: 715de1d5663f1242ada73afbc099a4d084562708 [file] [log] [blame] [edit]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_IMPELLER_TOOLKIT_EGL_DISPLAY_H_
#define FLUTTER_IMPELLER_TOOLKIT_EGL_DISPLAY_H_
#include <memory>
#include "impeller/toolkit/egl/config.h"
#include "impeller/toolkit/egl/egl.h"
namespace impeller {
namespace egl {
class Context;
class Surface;
//------------------------------------------------------------------------------
/// @brief A connection to an EGL display. Only one connection per
/// application instance is sufficient.
///
/// The display connection is used to first choose a config from
/// among the available, create a context from that config, and then
/// use that context with a surface on one (and only one) thread at
/// a time.
///
class Display {
public:
Display();
virtual ~Display();
//----------------------------------------------------------------------------
/// @return True if the display connection is valid.
///
virtual bool IsValid() const;
//----------------------------------------------------------------------------
/// @brief Choose a config that most closely matches a given descriptor.
/// If there are no matches, this method returns `nullptr`.
///
/// @param[in] config The configuration
///
/// @return A config that matches a descriptor if one is available.
/// `nullptr` otherwise.
///
virtual std::unique_ptr<Config> ChooseConfig(ConfigDescriptor config) const;
//----------------------------------------------------------------------------
/// @brief Create a context with a supported config. The supported config
/// can be obtained via a successful call to `ChooseConfig`.
///
/// @param[in] config The configuration.
/// @param[in] share_context The share context. Context within the same
/// share-group use the same handle table. The
/// contexts should still only be used exclusively
/// on each thread however.
///
/// @return A context if one can be created. `nullptr` otherwise.
///
virtual std::unique_ptr<Context> CreateContext(const Config& config,
const Context* share_context);
//----------------------------------------------------------------------------
/// @brief Create a window surface. The window is an opaque pointer whose
/// value value is platform specific. For instance, ANativeWindow
/// on Android.
///
/// @param[in] config A valid configuration. One can be obtained via
/// `ChooseConfig`.
/// @param[in] window An opaque pointer to a platform specific window
/// handle.
///
/// @return A valid window surface if one can be created. `nullptr`
/// otherwise.
///
virtual std::unique_ptr<Surface> CreateWindowSurface(
const Config& config,
EGLNativeWindowType window);
//----------------------------------------------------------------------------
/// @brief Create an offscreen pixelbuffer surface. These are of limited
/// use except in the context where applications need to render to
/// a texture in an offscreen context. In such cases, a 1x1 pixel
/// buffer surface is created to obtain a surface that can be used
/// to make the context current on the background thread.
///
/// @param[in] config The configuration
/// @param[in] width The width
/// @param[in] height The height
///
/// @return A valid pixel buffer surface if one can be created. `nullptr`
/// otherwise.
///
virtual std::unique_ptr<Surface>
CreatePixelBufferSurface(const Config& config, size_t width, size_t height);
const EGLDisplay& GetHandle() const;
private:
EGLDisplay display_ = EGL_NO_DISPLAY;
Display(const Display&) = delete;
Display& operator=(const Display&) = delete;
};
} // namespace egl
} // namespace impeller
#endif // FLUTTER_IMPELLER_TOOLKIT_EGL_DISPLAY_H_