blob: 58d6caa48abc00f5e5bda3f2d12ce8aaf225a2aa [file] [log] [blame]
Peiyong Line5a9a7f2018-08-30 15:32:13 -07001/*
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
Alec Mourie7d1d4a2019-02-05 01:13:46 +000017#define ATRACE_TAG ATRACE_TAG_GRAPHICS
18
Peiyong Line5a9a7f2018-08-30 15:32:13 -070019#include "GLFramebuffer.h"
20
21#include <GLES/gl.h>
22#include <GLES/glext.h>
Peiyong Line5a9a7f2018-08-30 15:32:13 -070023#include <GLES2/gl2ext.h>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080024#include <GLES3/gl3.h>
Ady Abrahama3b08ef2019-07-15 18:43:10 -070025#include <gui/DebugEGLImageTracker.h>
Alec Mouri05483a02018-09-10 21:03:42 +000026#include <nativebase/nativebase.h>
Alec Mourie7d1d4a2019-02-05 01:13:46 +000027#include <utils/Trace.h>
Peiyong Lin7e219eb2018-12-03 05:40:42 -080028#include "GLESRenderEngine.h"
Peiyong Line5a9a7f2018-08-30 15:32:13 -070029
30namespace android {
31namespace renderengine {
32namespace gl {
33
Alec Mourida4cf3b2019-02-12 15:33:01 -080034GLFramebuffer::GLFramebuffer(GLESRenderEngine& engine)
35 : mEngine(engine), mEGLDisplay(engine.getEGLDisplay()), mEGLImage(EGL_NO_IMAGE_KHR) {
Peiyong Line5a9a7f2018-08-30 15:32:13 -070036 glGenTextures(1, &mTextureName);
37 glGenFramebuffers(1, &mFramebufferName);
38}
39
40GLFramebuffer::~GLFramebuffer() {
Alec Mouri2725c092020-11-25 09:53:56 -080041 setNativeWindowBuffer(nullptr, false, false);
Peiyong Line5a9a7f2018-08-30 15:32:13 -070042 glDeleteFramebuffers(1, &mFramebufferName);
43 glDeleteTextures(1, &mTextureName);
Peiyong Line5a9a7f2018-08-30 15:32:13 -070044}
45
Alec Mourife0d72b2019-03-21 14:05:56 -070046bool GLFramebuffer::setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, bool isProtected,
47 const bool useFramebufferCache) {
Alec Mourie7d1d4a2019-02-05 01:13:46 +000048 ATRACE_CALL();
Peiyong Line5a9a7f2018-08-30 15:32:13 -070049 if (mEGLImage != EGL_NO_IMAGE_KHR) {
Alec Mourife0d72b2019-03-21 14:05:56 -070050 if (!usingFramebufferCache) {
51 eglDestroyImageKHR(mEGLDisplay, mEGLImage);
Ady Abrahama3b08ef2019-07-15 18:43:10 -070052 DEBUG_EGL_IMAGE_TRACKER_DESTROY();
Alec Mourife0d72b2019-03-21 14:05:56 -070053 }
Peiyong Line5a9a7f2018-08-30 15:32:13 -070054 mEGLImage = EGL_NO_IMAGE_KHR;
Alec Mouri05483a02018-09-10 21:03:42 +000055 mBufferWidth = 0;
56 mBufferHeight = 0;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070057 }
58
59 if (nativeBuffer) {
Alec Mourife0d72b2019-03-21 14:05:56 -070060 mEGLImage = mEngine.createFramebufferImageIfNeeded(nativeBuffer, isProtected,
61 useFramebufferCache);
Peiyong Line5a9a7f2018-08-30 15:32:13 -070062 if (mEGLImage == EGL_NO_IMAGE_KHR) {
63 return false;
64 }
Alec Mourife0d72b2019-03-21 14:05:56 -070065 usingFramebufferCache = useFramebufferCache;
Alec Mouri05483a02018-09-10 21:03:42 +000066 mBufferWidth = nativeBuffer->width;
67 mBufferHeight = nativeBuffer->height;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070068 }
69 return true;
70}
71
Lingfeng Yang2e4fef62020-04-24 14:48:43 +000072void GLFramebuffer::allocateBuffers(uint32_t width, uint32_t height, void* data) {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080073 ATRACE_CALL();
74
75 glBindTexture(GL_TEXTURE_2D, mTextureName);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +000076 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080077 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
78 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
79 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
80 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
81
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080082 mBufferHeight = height;
83 mBufferWidth = width;
84 mEngine.checkErrors("Allocating Fbo texture");
85
86 bind();
87 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextureName, 0);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080088 mStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
89 unbind();
90 glBindTexture(GL_TEXTURE_2D, 0);
91
92 if (mStatus != GL_FRAMEBUFFER_COMPLETE) {
93 ALOGE("Frame buffer is not complete. Error %d", mStatus);
94 }
95}
96
97void GLFramebuffer::bind() const {
98 glBindFramebuffer(GL_FRAMEBUFFER, mFramebufferName);
99}
100
Lucas Dupinf82ed8f2020-01-17 12:11:07 -0800101void GLFramebuffer::bindAsReadBuffer() const {
102 glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebufferName);
103}
104
105void GLFramebuffer::bindAsDrawBuffer() const {
106 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebufferName);
107}
108
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800109void GLFramebuffer::unbind() const {
110 glBindFramebuffer(GL_FRAMEBUFFER, 0);
111}
112
Peiyong Lin46080ef2018-10-26 18:43:14 -0700113} // namespace gl
114} // namespace renderengine
115} // namespace android