1/*
2 * Copyright 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <cstdint>
20
21#include <EGL/egl.h>
22
23struct ANativeWindow;
24
25namespace android {
26namespace RE {
27
28class Surface {
29public:
30    virtual ~Surface() = 0;
31
32    virtual void setCritical(bool enable) = 0;
33    virtual void setAsync(bool enable) = 0;
34
35    virtual void setNativeWindow(ANativeWindow* window) = 0;
36    virtual void swapBuffers() const = 0;
37
38    virtual int32_t queryRedSize() const = 0;
39    virtual int32_t queryGreenSize() const = 0;
40    virtual int32_t queryBlueSize() const = 0;
41    virtual int32_t queryAlphaSize() const = 0;
42
43    virtual int32_t queryWidth() const = 0;
44    virtual int32_t queryHeight() const = 0;
45};
46
47namespace impl {
48
49class RenderEngine;
50
51class Surface final : public RE::Surface {
52public:
53    Surface(const RenderEngine& engine);
54    ~Surface();
55
56    Surface(const Surface&) = delete;
57    Surface& operator=(const Surface&) = delete;
58
59    // RE::Surface implementation
60    void setCritical(bool enable) override { mCritical = enable; }
61    void setAsync(bool enable) override { mAsync = enable; }
62
63    void setNativeWindow(ANativeWindow* window) override;
64    void swapBuffers() const override;
65
66    int32_t queryRedSize() const override;
67    int32_t queryGreenSize() const override;
68    int32_t queryBlueSize() const override;
69    int32_t queryAlphaSize() const override;
70
71    int32_t queryWidth() const override;
72    int32_t queryHeight() const override;
73
74private:
75    EGLint queryConfig(EGLint attrib) const;
76    EGLint querySurface(EGLint attrib) const;
77
78    // methods internal to RenderEngine
79    friend class RenderEngine;
80    bool getAsync() const { return mAsync; }
81    EGLSurface getEGLSurface() const { return mEGLSurface; }
82
83    EGLDisplay mEGLDisplay;
84    EGLConfig mEGLConfig;
85
86    bool mCritical = false;
87    bool mAsync = false;
88
89    ANativeWindow* mWindow = nullptr;
90    EGLSurface mEGLSurface = EGL_NO_SURFACE;
91};
92
93} // namespace impl
94} // namespace RE
95} // namespace android
96