mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
115 lines
3.9 KiB
C++
115 lines
3.9 KiB
C++
// 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_COMMON_GRAPHICS_GL_CONTEXT_SWITCH_H_
|
|
#define FLUTTER_COMMON_GRAPHICS_GL_CONTEXT_SWITCH_H_
|
|
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "flutter/fml/logging.h"
|
|
#include "flutter/fml/macros.h"
|
|
|
|
namespace flutter {
|
|
|
|
// This interface represents a gl context that can be switched by
|
|
// |GLContextSwitch|.
|
|
//
|
|
// The implementation should wrap a "Context" object inside this class. For
|
|
// example, in iOS while using a GL rendering surface, the implementation should
|
|
// wrap an |EAGLContext|.
|
|
class SwitchableGLContext {
|
|
public:
|
|
SwitchableGLContext();
|
|
|
|
virtual ~SwitchableGLContext();
|
|
|
|
// Implement this to set the context wrapped by this |SwitchableGLContext|
|
|
// object to the current context.
|
|
virtual bool SetCurrent() = 0;
|
|
|
|
// Implement this to remove the context wrapped by this |SwitchableGLContext|
|
|
// object from current context;
|
|
virtual bool RemoveCurrent() = 0;
|
|
|
|
FML_DISALLOW_COPY_AND_ASSIGN(SwitchableGLContext);
|
|
};
|
|
|
|
// Represents the result of setting a gl context.
|
|
//
|
|
// This class exists because context results are used in places applies to all
|
|
// the platforms. On certain platforms(for example lower end iOS devices that
|
|
// uses gl), a |GLContextSwitch| is required to protect flutter's gl contect
|
|
// from being polluted by other programs(embedded platform views). A
|
|
// |GLContextSwitch| is a subclass of |GLContextResult|, which can be returned
|
|
// on platforms that requires context switching. A |GLContextDefaultResult| is
|
|
// also a subclass of |GLContextResult|, which can be returned on platforms
|
|
// that doesn't require context switching.
|
|
class GLContextResult {
|
|
public:
|
|
GLContextResult();
|
|
virtual ~GLContextResult();
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Returns true if the gl context is set successfully.
|
|
bool GetResult();
|
|
|
|
protected:
|
|
GLContextResult(bool static_result);
|
|
bool result_;
|
|
|
|
FML_DISALLOW_COPY_AND_ASSIGN(GLContextResult);
|
|
};
|
|
|
|
//------------------------------------------------------------------------------
|
|
/// The default implementation of |GLContextResult|.
|
|
///
|
|
/// Use this class on platforms that doesn't require gl context switching.
|
|
/// * See also |GLContextSwitch| if the platform requires gl context switching.
|
|
class GLContextDefaultResult : public GLContextResult {
|
|
public:
|
|
//----------------------------------------------------------------------------
|
|
/// Constructs a |GLContextDefaultResult| with a static result.
|
|
///
|
|
/// Used this on platforms that doesn't require gl context switching. (For
|
|
/// example, metal on iOS)
|
|
///
|
|
/// @param static_result a static value that will be returned from
|
|
/// |GetResult|
|
|
GLContextDefaultResult(bool static_result);
|
|
|
|
~GLContextDefaultResult() override;
|
|
|
|
FML_DISALLOW_COPY_AND_ASSIGN(GLContextDefaultResult);
|
|
};
|
|
|
|
//------------------------------------------------------------------------------
|
|
/// Switches the gl context to the a context that is passed in the
|
|
/// constructor.
|
|
///
|
|
/// In destruction, it should restore the current context to what was
|
|
/// before the construction of this switch.
|
|
class GLContextSwitch final : public GLContextResult {
|
|
public:
|
|
//----------------------------------------------------------------------------
|
|
/// Constructs a |GLContextSwitch|.
|
|
///
|
|
/// @param context The context that is going to be set as the current
|
|
/// context. The |GLContextSwitch| should not outlive the owner of the gl
|
|
/// context wrapped inside the `context`.
|
|
GLContextSwitch(std::unique_ptr<SwitchableGLContext> context);
|
|
|
|
~GLContextSwitch() override;
|
|
|
|
private:
|
|
std::unique_ptr<SwitchableGLContext> context_;
|
|
|
|
FML_DISALLOW_COPY_AND_ASSIGN(GLContextSwitch);
|
|
};
|
|
|
|
} // namespace flutter
|
|
|
|
#endif // FLUTTER_COMMON_GRAPHICS_GL_CONTEXT_SWITCH_H_
|