1401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu/*
2401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu * Copyright 2017 The Android Open Source Project
3401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu *
4401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu * Licensed under the Apache License, Version 2.0 (the "License");
5401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu * you may not use this file except in compliance with the License.
6401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu * You may obtain a copy of the License at
7401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu *
8401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu *      http://www.apache.org/licenses/LICENSE-2.0
9401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu *
10401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu * Unless required by applicable law or agreed to in writing, software
11401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu * distributed under the License is distributed on an "AS IS" BASIS,
12401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu * See the License for the specific language governing permissions and
14401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu * limitations under the License.
15401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu */
16401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
17401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu#include "Image.h"
18401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
19401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu#include <vector>
20401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
21401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu#include <log/log.h>
22401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
23401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu#include "GLExtensions.h"
24401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu#include "RenderEngine.h"
25401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
26401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wunamespace android {
27401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wunamespace RE {
28401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
29144e116f45f196396f0d59d5fc09766ab618f885Lloyd PiqueImage::~Image() = default;
30144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique
31144e116f45f196396f0d59d5fc09766ab618f885Lloyd Piquenamespace impl {
32144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique
33401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I WuImage::Image(const RenderEngine& engine) : mEGLDisplay(engine.getEGLDisplay()) {}
34401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
35401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I WuImage::~Image() {
36401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    setNativeWindowBuffer(nullptr, false, 0, 0);
37401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu}
38401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
39401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wustatic std::vector<EGLint> buildAttributeList(bool isProtected, int32_t cropWidth,
40401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu                                              int32_t cropHeight) {
41401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    std::vector<EGLint> attrs;
42401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    attrs.reserve(16);
43401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
44401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    attrs.push_back(EGL_IMAGE_PRESERVED_KHR);
45401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    attrs.push_back(EGL_TRUE);
46401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
47401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    if (isProtected && GLExtensions::getInstance().hasProtectedContent()) {
48401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        attrs.push_back(EGL_PROTECTED_CONTENT_EXT);
49401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        attrs.push_back(EGL_TRUE);
50401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    }
51401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
52401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    if (cropWidth > 0 && cropHeight > 0) {
53401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        attrs.push_back(EGL_IMAGE_CROP_LEFT_ANDROID);
54401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        attrs.push_back(0);
55401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        attrs.push_back(EGL_IMAGE_CROP_TOP_ANDROID);
56401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        attrs.push_back(0);
57401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        attrs.push_back(EGL_IMAGE_CROP_RIGHT_ANDROID);
58401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        attrs.push_back(cropWidth);
59401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        attrs.push_back(EGL_IMAGE_CROP_BOTTOM_ANDROID);
60401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        attrs.push_back(cropHeight);
61401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    }
62401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
63401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    attrs.push_back(EGL_NONE);
64401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
65401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    return attrs;
66401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu}
67401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
68401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wubool Image::setNativeWindowBuffer(ANativeWindowBuffer* buffer, bool isProtected, int32_t cropWidth,
69401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu                                  int32_t cropHeight) {
70401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    if (mEGLImage != EGL_NO_IMAGE_KHR) {
71401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        if (!eglDestroyImageKHR(mEGLDisplay, mEGLImage)) {
72401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu            ALOGE("failed to destroy image: %#x", eglGetError());
73401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        }
74401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        mEGLImage = EGL_NO_IMAGE_KHR;
75401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    }
76401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
77401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    if (buffer) {
78401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        std::vector<EGLint> attrs = buildAttributeList(isProtected, cropWidth, cropHeight);
79401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        mEGLImage = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
80401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu                                      static_cast<EGLClientBuffer>(buffer), attrs.data());
81401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        if (mEGLImage == EGL_NO_IMAGE_KHR) {
82401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu            ALOGE("failed to create EGLImage: %#x", eglGetError());
83401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu            return false;
84401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu        }
85401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    }
86401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
87401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu    return true;
88401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu}
89401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu
90144e116f45f196396f0d59d5fc09766ab618f885Lloyd Pique} // namespace impl
91401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu} // namespace RE
92401ef83b9d9cc78a6ebe30d289a80d4eee06286bChia-I Wu} // namespace android
93