17e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu/*
27e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu * Copyright 2017 The Android Open Source Project
37e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu *
47e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu * Licensed under the Apache License, Version 2.0 (the "License");
57e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu * you may not use this file except in compliance with the License.
67e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu * You may obtain a copy of the License at
77e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu *
87e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu *      http://www.apache.org/licenses/LICENSE-2.0
97e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu *
107e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu * Unless required by applicable law or agreed to in writing, software
117e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu * distributed under the License is distributed on an "AS IS" BASIS,
127e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu * See the License for the specific language governing permissions and
147e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu * limitations under the License.
157e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu */
167e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
177e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu#pragma once
187e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
197e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu#include <cstdint>
207e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
217e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu#include <EGL/egl.h>
227e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
237e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wustruct ANativeWindow;
247e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
257e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wunamespace android {
267e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wunamespace RE {
277e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
287e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wuclass Surface {
297e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wupublic:
30144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual ~Surface() = 0;
31144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique
32144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual void setCritical(bool enable) = 0;
33144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual void setAsync(bool enable) = 0;
34144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique
35144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual void setNativeWindow(ANativeWindow* window) = 0;
36144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual void swapBuffers() const = 0;
37144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique
38144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual int32_t queryRedSize() const = 0;
39144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual int32_t queryGreenSize() const = 0;
40144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual int32_t queryBlueSize() const = 0;
41144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual int32_t queryAlphaSize() const = 0;
42144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique
43144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual int32_t queryWidth() const = 0;
44144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    virtual int32_t queryHeight() const = 0;
45144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique};
46144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique
47144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piquenamespace impl {
48144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique
49144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piqueclass RenderEngine;
50144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique
51144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piqueclass Surface final : public RE::Surface {
52144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piquepublic:
537e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    Surface(const RenderEngine& engine);
547e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    ~Surface();
557e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
567e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    Surface(const Surface&) = delete;
577e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    Surface& operator=(const Surface&) = delete;
587e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
59144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    // RE::Surface implementation
60144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    void setCritical(bool enable) override { mCritical = enable; }
61144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    void setAsync(bool enable) override { mAsync = enable; }
627e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
63144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    void setNativeWindow(ANativeWindow* window) override;
64144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    void swapBuffers() const override;
657e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
66144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    int32_t queryRedSize() const override;
67144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    int32_t queryGreenSize() const override;
68144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    int32_t queryBlueSize() const override;
69144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    int32_t queryAlphaSize() const override;
707e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
71144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    int32_t queryWidth() const override;
72144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    int32_t queryHeight() const override;
737e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
747e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wuprivate:
757e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    EGLint queryConfig(EGLint attrib) const;
767e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    EGLint querySurface(EGLint attrib) const;
777e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
787e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    // methods internal to RenderEngine
79144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique    friend class RenderEngine;
807e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    bool getAsync() const { return mAsync; }
817e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    EGLSurface getEGLSurface() const { return mEGLSurface; }
827e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
837e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    EGLDisplay mEGLDisplay;
847e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    EGLConfig mEGLConfig;
857e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
867e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    bool mCritical = false;
877e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    bool mAsync = false;
887e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
897e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    ANativeWindow* mWindow = nullptr;
907e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu    EGLSurface mEGLSurface = EGL_NO_SURFACE;
917e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu};
927e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu
93144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique} // namespace impl
947e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu} // namespace RE
957e60ecc269aa83758b96b97d709b91b00dee1e13Chia-I Wu} // namespace android
96