/*
* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "EGLImageBuffer.h"
#include <cutils/native_handle.h>
#include <gralloc_priv.h>
#include <ui/GraphicBuffer.h>
#include <map>
#include "EGLImageWrapper.h"
#include "glengine.h"
#define EGL_PROTECTED_CONTENT_EXT 0x32C0
//-----------------------------------------------------------------------------
EGLImageKHR create_eglImage(android::sp<android::GraphicBuffer> graphicBuffer)
//-----------------------------------------------------------------------------
{
bool isProtected = (graphicBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
isProtected ? EGL_PROTECTED_CONTENT_EXT : EGL_NONE,
isProtected ? EGL_TRUE : EGL_NONE, EGL_NONE};
EGLImageKHR eglImage = eglCreateImageKHR(
eglGetCurrentDisplay(), (EGLContext)EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
(EGLClientBuffer)(graphicBuffer->getNativeBuffer()), attrs);
return eglImage;
}
//-----------------------------------------------------------------------------
EGLImageBuffer::EGLImageBuffer(android::sp<android::GraphicBuffer> graphicBuffer)
//-----------------------------------------------------------------------------
{
// this->graphicBuffer = graphicBuffer;
this->eglImageID = create_eglImage(graphicBuffer);
this->width = graphicBuffer->getWidth();
this->height = graphicBuffer->getHeight();
textureID = 0;
renderbufferID = 0;
framebufferID = 0;
}
//-----------------------------------------------------------------------------
EGLImageBuffer::~EGLImageBuffer()
//-----------------------------------------------------------------------------
{
if (textureID != 0) {
GL(glDeleteTextures(1, &textureID));
textureID = 0;
}
if (renderbufferID != 0) {
GL(glDeleteRenderbuffers(1, &renderbufferID));
renderbufferID = 0;
}
if (framebufferID != 0) {
GL(glDeleteFramebuffers(1, &framebufferID));
framebufferID = 0;
}
// Delete the eglImage
if (eglImageID != 0)
{
eglDestroyImageKHR(eglGetCurrentDisplay(), eglImageID);
eglImageID = 0;
}
}
//-----------------------------------------------------------------------------
int EGLImageBuffer::getWidth()
//-----------------------------------------------------------------------------
{
return width;
}
//-----------------------------------------------------------------------------
int EGLImageBuffer::getHeight()
//-----------------------------------------------------------------------------
{
return height;
}
//-----------------------------------------------------------------------------
unsigned int EGLImageBuffer::getTexture()
//-----------------------------------------------------------------------------
{
if (textureID == 0) {
bindAsTexture();
}
return textureID;
}
//-----------------------------------------------------------------------------
unsigned int EGLImageBuffer::getFramebuffer()
//-----------------------------------------------------------------------------
{
if (framebufferID == 0) {
bindAsFramebuffer();
}
return framebufferID;
}
//-----------------------------------------------------------------------------
void EGLImageBuffer::bindAsTexture()
//-----------------------------------------------------------------------------
{
if (textureID == 0) {
GL(glGenTextures(1, &textureID));
int target = 0x8D65;
GL(glBindTexture(target, textureID));
GL(glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
GL(glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
GL(glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
GL(glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
GL(glEGLImageTargetTexture2DOES(0x8D65, eglImageID));
}
GL(glBindTexture(0x8D65, textureID));
}
//-----------------------------------------------------------------------------
void EGLImageBuffer::bindAsFramebuffer()
//-----------------------------------------------------------------------------
{
if (renderbufferID == 0) {
GL(glGenFramebuffers(1, &framebufferID));
GL(glGenRenderbuffers(1, &renderbufferID));
GL(glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID));
GL(glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, eglImageID));
GL(glBindFramebuffer(GL_FRAMEBUFFER, framebufferID));
GL(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
renderbufferID));
GLenum result = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (result != GL_FRAMEBUFFER_COMPLETE) {
ALOGI("%s Framebuffer Invalid***************", __FUNCTION__);
}
}
GL(glBindFramebuffer(GL_FRAMEBUFFER, framebufferID));
}