1 /*
2  * Copyright 2018 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 #include <EGL/eglext.h>
23 #include <GLES2/gl2.h>
24 #include <renderengine/Framebuffer.h>
25 
26 struct ANativeWindowBuffer;
27 
28 namespace android {
29 namespace renderengine {
30 namespace gl {
31 
32 class GLESRenderEngine;
33 
34 class GLFramebuffer : public renderengine::Framebuffer {
35 public:
36     explicit GLFramebuffer(GLESRenderEngine& engine);
37     explicit GLFramebuffer(GLESRenderEngine& engine, bool multiTarget);
38     ~GLFramebuffer() override;
39 
40     bool setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, bool isProtected,
41                                const bool useFramebufferCache) override;
42     void allocateBuffers(uint32_t width, uint32_t height, void* data = nullptr);
getEGLImage()43     EGLImageKHR getEGLImage() const { return mEGLImage; }
getTextureName()44     uint32_t getTextureName() const { return mTextureName; }
getFramebufferName()45     uint32_t getFramebufferName() const { return mFramebufferName; }
getBufferHeight()46     int32_t getBufferHeight() const { return mBufferHeight; }
getBufferWidth()47     int32_t getBufferWidth() const { return mBufferWidth; }
getStatus()48     GLenum getStatus() const { return mStatus; }
49     void bind() const;
50     void bindAsReadBuffer() const;
51     void bindAsDrawBuffer() const;
52     void unbind() const;
53 
54 private:
55     GLESRenderEngine& mEngine;
56     EGLDisplay mEGLDisplay;
57     EGLImageKHR mEGLImage;
58     bool usingFramebufferCache = false;
59     GLenum mStatus = GL_FRAMEBUFFER_UNSUPPORTED;
60     uint32_t mTextureName, mFramebufferName;
61 
62     int32_t mBufferHeight = 0;
63     int32_t mBufferWidth = 0;
64 };
65 
66 } // namespace gl
67 } // namespace renderengine
68 } // namespace android
69