Home | History | Annotate | Download | only in RenderEngine
      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 #include "Surface.h"
     18 
     19 #include "RenderEngine.h"
     20 
     21 #include <log/log.h>
     22 
     23 namespace android {
     24 namespace RE {
     25 
     26 Surface::~Surface() = default;
     27 
     28 namespace impl {
     29 
     30 Surface::Surface(const RenderEngine& engine)
     31       : mEGLDisplay(engine.getEGLDisplay()), mEGLConfig(engine.getEGLConfig()) {
     32     // RE does not assume any config when EGL_KHR_no_config_context is supported
     33     if (mEGLConfig == EGL_NO_CONFIG_KHR) {
     34         mEGLConfig = RenderEngine::chooseEglConfig(mEGLDisplay, PIXEL_FORMAT_RGBA_8888, false);
     35     }
     36 }
     37 
     38 Surface::~Surface() {
     39     setNativeWindow(nullptr);
     40 }
     41 
     42 void Surface::setNativeWindow(ANativeWindow* window) {
     43     if (mEGLSurface != EGL_NO_SURFACE) {
     44         eglDestroySurface(mEGLDisplay, mEGLSurface);
     45         mEGLSurface = EGL_NO_SURFACE;
     46     }
     47 
     48     mWindow = window;
     49     if (mWindow) {
     50         mEGLSurface = eglCreateWindowSurface(mEGLDisplay, mEGLConfig, mWindow, nullptr);
     51     }
     52 }
     53 
     54 void Surface::swapBuffers() const {
     55     if (!eglSwapBuffers(mEGLDisplay, mEGLSurface)) {
     56         EGLint error = eglGetError();
     57 
     58         const char format[] = "eglSwapBuffers(%p, %p) failed with 0x%08x";
     59         if (mCritical || error == EGL_CONTEXT_LOST) {
     60             LOG_ALWAYS_FATAL(format, mEGLDisplay, mEGLSurface, error);
     61         } else {
     62             ALOGE(format, mEGLDisplay, mEGLSurface, error);
     63         }
     64     }
     65 }
     66 
     67 EGLint Surface::queryConfig(EGLint attrib) const {
     68     EGLint value;
     69     if (!eglGetConfigAttrib(mEGLDisplay, mEGLConfig, attrib, &value)) {
     70         value = 0;
     71     }
     72 
     73     return value;
     74 }
     75 
     76 EGLint Surface::querySurface(EGLint attrib) const {
     77     EGLint value;
     78     if (!eglQuerySurface(mEGLDisplay, mEGLSurface, attrib, &value)) {
     79         value = 0;
     80     }
     81 
     82     return value;
     83 }
     84 
     85 int32_t Surface::queryRedSize() const {
     86     return queryConfig(EGL_RED_SIZE);
     87 }
     88 
     89 int32_t Surface::queryGreenSize() const {
     90     return queryConfig(EGL_GREEN_SIZE);
     91 }
     92 
     93 int32_t Surface::queryBlueSize() const {
     94     return queryConfig(EGL_BLUE_SIZE);
     95 }
     96 
     97 int32_t Surface::queryAlphaSize() const {
     98     return queryConfig(EGL_ALPHA_SIZE);
     99 }
    100 
    101 int32_t Surface::queryWidth() const {
    102     return querySurface(EGL_WIDTH);
    103 }
    104 
    105 int32_t Surface::queryHeight() const {
    106     return querySurface(EGL_HEIGHT);
    107 }
    108 
    109 } // namespace impl
    110 } // namespace RE
    111 } // namespace android
    112