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