libqdutils::Add support for qcomuiClearRegion
Add support for qcomuiClearRegion for draw wormhole regions via CPU. * Added separate singaltone class for getting eglGetRenderBufferANDROID handle that can be used by both copybit and clear_regions modules CRs-Fixed: 383115 Change-Id: Ibeb5bdda87a60950889416e5b4d53e6eb5a3682e Conflicts: libqdutils/Android.mk
This commit is contained in:
		
				
					committed by
					
						
						Andrew Sutherland
					
				
			
			
				
	
			
			
			
						parent
						
							06d4f5be44
						
					
				
				
					commit
					cefb36db5c
				
			@@ -22,8 +22,8 @@
 | 
			
		||||
#include <copybit.h>
 | 
			
		||||
#include <genlock.h>
 | 
			
		||||
#include "hwc_copybit.h"
 | 
			
		||||
#include "hwc_copybit.h"
 | 
			
		||||
#include "comptype.h"
 | 
			
		||||
#include "egl_handles.h"
 | 
			
		||||
 | 
			
		||||
namespace qhwc {
 | 
			
		||||
 | 
			
		||||
@@ -65,46 +65,11 @@ private:
 | 
			
		||||
    mutable range r;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Initialize CopyBit Class Static Mmembers.
 | 
			
		||||
functype_eglGetRenderBufferANDROID CopyBit::LINK_eglGetRenderBufferANDROID
 | 
			
		||||
                                                                   = NULL;
 | 
			
		||||
functype_eglGetCurrentSurface CopyBit::LINK_eglGetCurrentSurface = NULL;
 | 
			
		||||
int CopyBit::sYuvCount = 0;
 | 
			
		||||
int CopyBit::sYuvLayerIndex = -1;
 | 
			
		||||
bool CopyBit::sIsModeOn = false;
 | 
			
		||||
bool CopyBit::sIsLayerSkip = false;
 | 
			
		||||
void* CopyBit::egl_lib = NULL;
 | 
			
		||||
 | 
			
		||||
void CopyBit::openEglLibAndGethandle()
 | 
			
		||||
{
 | 
			
		||||
    egl_lib = ::dlopen("libEGL_adreno200.so", RTLD_GLOBAL | RTLD_LAZY);
 | 
			
		||||
    if (!egl_lib) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    updateEglHandles(egl_lib);
 | 
			
		||||
}
 | 
			
		||||
void CopyBit::closeEglLib()
 | 
			
		||||
{
 | 
			
		||||
    if(egl_lib)
 | 
			
		||||
        ::dlclose(egl_lib);
 | 
			
		||||
 | 
			
		||||
    egl_lib = NULL;
 | 
			
		||||
    updateEglHandles(NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CopyBit::updateEglHandles(void* egl_lib)
 | 
			
		||||
{
 | 
			
		||||
    if(egl_lib != NULL) {
 | 
			
		||||
        *(void **)&CopyBit::LINK_eglGetRenderBufferANDROID =
 | 
			
		||||
                             ::dlsym(egl_lib, "eglGetRenderBufferANDROID");
 | 
			
		||||
        *(void **)&CopyBit::LINK_eglGetCurrentSurface =
 | 
			
		||||
                                  ::dlsym(egl_lib, "eglGetCurrentSurface");
 | 
			
		||||
   }else {
 | 
			
		||||
        LINK_eglGetCurrentSurface = NULL;
 | 
			
		||||
        LINK_eglGetCurrentSurface = NULL;
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool CopyBit::sCopyBitDraw = false;
 | 
			
		||||
bool CopyBit::canUseCopybitForYUV(hwc_context_t *ctx) {
 | 
			
		||||
    // return true for non-overlay targets
 | 
			
		||||
    if(ctx->mMDP.hasOverlay) {
 | 
			
		||||
@@ -188,7 +153,7 @@ bool CopyBit::prepare(hwc_context_t *ctx, hwc_layer_list_t *list) {
 | 
			
		||||
       ALOGE("%s:Invalid Params", __FUNCTION__);
 | 
			
		||||
       return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sCopyBitDraw = false;
 | 
			
		||||
    for (int i=list->numHwLayers-1; i >= 0 ; i--) {
 | 
			
		||||
        private_handle_t *hnd = (private_handle_t *)list->hwLayers[i].handle;
 | 
			
		||||
 | 
			
		||||
@@ -198,11 +163,13 @@ bool CopyBit::prepare(hwc_context_t *ctx, hwc_layer_list_t *list) {
 | 
			
		||||
          //YUV layer, check, if copybit can be used
 | 
			
		||||
          if (useCopybitForYUV) {
 | 
			
		||||
              list->hwLayers[i].compositionType = HWC_USE_COPYBIT;
 | 
			
		||||
              sCopyBitDraw = true;
 | 
			
		||||
          }
 | 
			
		||||
       } else if (hnd->bufferType == BUFFER_TYPE_UI) {
 | 
			
		||||
          //RGB layer, check, if copybit can be used
 | 
			
		||||
          if (useCopybitForRGB) {
 | 
			
		||||
              list->hwLayers[i].compositionType = HWC_USE_COPYBIT;
 | 
			
		||||
              sCopyBitDraw = true;
 | 
			
		||||
          }
 | 
			
		||||
       }
 | 
			
		||||
    }
 | 
			
		||||
@@ -213,9 +180,18 @@ bool CopyBit::draw(hwc_context_t *ctx, hwc_layer_list_t *list, EGLDisplay dpy,
 | 
			
		||||
                                                               EGLSurface sur){
 | 
			
		||||
    // draw layers marked for COPYBIT
 | 
			
		||||
    int retVal = true;
 | 
			
		||||
    EGLSurface eglSurface = LINK_eglGetCurrentSurface(EGL_DRAW);
 | 
			
		||||
 | 
			
		||||
    if(sCopyBitDraw == false) // there is no any layer marked for copybit
 | 
			
		||||
       return true ;
 | 
			
		||||
 | 
			
		||||
    android_native_buffer_t *renderBuffer =
 | 
			
		||||
     (android_native_buffer_t *)LINK_eglGetRenderBufferANDROID(dpy, eglSurface);
 | 
			
		||||
          qdutils::eglHandles::getInstance().getAndroidNativeRenderBuffer(dpy);
 | 
			
		||||
    if (!renderBuffer) {
 | 
			
		||||
        ALOGE("%s: eglGetRenderBufferANDROID returned NULL buffer",
 | 
			
		||||
             __FUNCTION__);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (size_t i=0; i<list->numHwLayers; i++) {
 | 
			
		||||
        if (list->hwLayers[i].compositionType == HWC_USE_COPYBIT) {
 | 
			
		||||
            retVal = drawLayerUsingCopybit(ctx, &(list->hwLayers[i]),
 | 
			
		||||
@@ -483,13 +459,6 @@ bool CopyBit::validateParams(hwc_context_t *ctx, const hwc_layer_list_t *list) {
 | 
			
		||||
       ALOGE("%s:Invalid FB device", __FUNCTION__);
 | 
			
		||||
       return false;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (LINK_eglGetRenderBufferANDROID == NULL ||
 | 
			
		||||
            LINK_eglGetCurrentSurface == NULL) {
 | 
			
		||||
       ALOGE("%s:Not able to link to ADRENO", __FUNCTION__);
 | 
			
		||||
       return false;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -512,11 +481,9 @@ CopybitEngine::CopybitEngine(){
 | 
			
		||||
    } else {
 | 
			
		||||
       ALOGE("FATAL ERROR: copybit open failed.");
 | 
			
		||||
    }
 | 
			
		||||
    CopyBit::openEglLibAndGethandle();
 | 
			
		||||
}
 | 
			
		||||
CopybitEngine::~CopybitEngine()
 | 
			
		||||
{
 | 
			
		||||
    CopyBit::closeEglLib();
 | 
			
		||||
    if(sEngine)
 | 
			
		||||
    {
 | 
			
		||||
        copybit_close(sEngine);
 | 
			
		||||
 
 | 
			
		||||
@@ -30,11 +30,6 @@
 | 
			
		||||
#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
 | 
			
		||||
 | 
			
		||||
namespace qhwc {
 | 
			
		||||
//Feature for using Copybit to display RGB layers.
 | 
			
		||||
typedef EGLClientBuffer (*functype_eglGetRenderBufferANDROID) (
 | 
			
		||||
                                              EGLDisplay dpy,
 | 
			
		||||
                                              EGLSurface draw);
 | 
			
		||||
typedef EGLSurface (*functype_eglGetCurrentSurface)(EGLint readdraw);
 | 
			
		||||
 | 
			
		||||
class CopyBit {
 | 
			
		||||
public:
 | 
			
		||||
@@ -71,11 +66,8 @@ private:
 | 
			
		||||
    static bool sIsLayerSkip;
 | 
			
		||||
    //Flags if this feature is on.
 | 
			
		||||
    static bool sIsModeOn;
 | 
			
		||||
    //handle for adreno lib
 | 
			
		||||
    static void* egl_lib;
 | 
			
		||||
 | 
			
		||||
    static functype_eglGetRenderBufferANDROID LINK_eglGetRenderBufferANDROID;
 | 
			
		||||
    static functype_eglGetCurrentSurface LINK_eglGetCurrentSurface;
 | 
			
		||||
    // flag that indicates whether CopyBit is enabled or not
 | 
			
		||||
    static bool sCopyBitDraw;
 | 
			
		||||
 | 
			
		||||
    static  unsigned int getRGBRenderingArea (const hwc_layer_list_t *list);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,10 @@ include $(CLEAR_VARS)
 | 
			
		||||
 | 
			
		||||
LOCAL_MODULE                  := libqdutils
 | 
			
		||||
LOCAL_MODULE_TAGS             := optional
 | 
			
		||||
LOCAL_SHARED_LIBRARIES        := $(common_libs)
 | 
			
		||||
LOCAL_C_INCLUDES              := $(common_includes) $(kernel_includes)
 | 
			
		||||
LOCAL_SHARED_LIBRARIES        := $(common_libs) libdl
 | 
			
		||||
LOCAL_C_INCLUDES              := $(common_includes)
 | 
			
		||||
LOCAL_CFLAGS                  := $(common_flags)
 | 
			
		||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(common_deps)
 | 
			
		||||
LOCAL_SRC_FILES               := profiler.cpp mdp_version.cpp \
 | 
			
		||||
                                 idle_invalidator.cpp
 | 
			
		||||
                                 idle_invalidator.cpp egl_handles.cpp
 | 
			
		||||
include $(BUILD_SHARED_LIBRARY)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										93
									
								
								libqdutils/clear_regions.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								libqdutils/clear_regions.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions are
 | 
			
		||||
 * met:
 | 
			
		||||
 *   * Redistributions of source code must retain the above copyright
 | 
			
		||||
 *     notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 *   * Redistributions in binary form must reproduce the above
 | 
			
		||||
 *     copyright notice, this list of conditions and the following
 | 
			
		||||
 *     disclaimer in the documentation and/or other materials provided
 | 
			
		||||
 *     with the distribution.
 | 
			
		||||
 *   * Neither the name of Code Aurora Forum, Inc. nor the names of its
 | 
			
		||||
 *     contributors may be used to endorse or promote products derived
 | 
			
		||||
 *     from this software without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 | 
			
		||||
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 | 
			
		||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 | 
			
		||||
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 | 
			
		||||
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 | 
			
		||||
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 | 
			
		||||
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 | 
			
		||||
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef QCOM_CLEARREGIONS_H
 | 
			
		||||
#define QCOM_CLEARREGIONS_H
 | 
			
		||||
 | 
			
		||||
#include <gralloc_priv.h>
 | 
			
		||||
#include <cutils/memory.h>
 | 
			
		||||
#include <comptype.h>
 | 
			
		||||
#include "egl_handles.h"
 | 
			
		||||
 | 
			
		||||
namespace qdutils {
 | 
			
		||||
/*
 | 
			
		||||
 * Clear Region implementation for C2D/MDP versions.
 | 
			
		||||
 *
 | 
			
		||||
 * @param: region to be cleared
 | 
			
		||||
 * @param: EGL Display
 | 
			
		||||
 * @param: EGL Surface
 | 
			
		||||
 *
 | 
			
		||||
 * @return 0 on success
 | 
			
		||||
 */
 | 
			
		||||
static int qcomuiClearRegion(Region region, EGLDisplay dpy){
 | 
			
		||||
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    int compositionType = QCCompositionType::getInstance().getCompositionType();
 | 
			
		||||
    if (compositionType == (COMPOSITION_TYPE_DYN|COMPOSITION_TYPE_C2D)){
 | 
			
		||||
        // For DYN comp. with C2D, return an error, so that SF can use
 | 
			
		||||
        // the GPU to draw the wormhole.
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    android_native_buffer_t *renderBuffer =
 | 
			
		||||
          qdutils::eglHandles::getInstance().getAndroidNativeRenderBuffer(dpy);
 | 
			
		||||
    if (!renderBuffer) {
 | 
			
		||||
        ALOGE("%s: eglGetRenderBufferANDROID returned NULL buffer",
 | 
			
		||||
             __FUNCTION__);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    private_handle_t *fbHandle = (private_handle_t *)renderBuffer->handle;
 | 
			
		||||
    if(!fbHandle) {
 | 
			
		||||
        ALOGE("%s: Framebuffer handle is NULL", __FUNCTION__);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int bytesPerPixel = 4;
 | 
			
		||||
    if (HAL_PIXEL_FORMAT_RGB_565 == fbHandle->format) {
 | 
			
		||||
        bytesPerPixel = 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Region::const_iterator it = region.begin();
 | 
			
		||||
    Region::const_iterator const end = region.end();
 | 
			
		||||
    const int32_t stride = renderBuffer->stride*bytesPerPixel;
 | 
			
		||||
    while (it != end) {
 | 
			
		||||
        const Rect& r = *it++;
 | 
			
		||||
        uint8_t* dst = (uint8_t*) fbHandle->base +
 | 
			
		||||
            (r.left + r.top*renderBuffer->stride)*bytesPerPixel;
 | 
			
		||||
        int w = r.width()*bytesPerPixel;
 | 
			
		||||
        int h = r.height();
 | 
			
		||||
        do {
 | 
			
		||||
            if(4 == bytesPerPixel)
 | 
			
		||||
                android_memset32((uint32_t*)dst, 0, w);
 | 
			
		||||
            else
 | 
			
		||||
                android_memset16((uint16_t*)dst, 0, w);
 | 
			
		||||
            dst += stride;
 | 
			
		||||
        } while(--h);
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
}; //namespace qdutils
 | 
			
		||||
#endif /* end of include guard: QCOM_CLEARREGIONS_H*/
 | 
			
		||||
							
								
								
									
										91
									
								
								libqdutils/egl_handles.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								libqdutils/egl_handles.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010 The Android Open Source Project
 | 
			
		||||
 * Copyright (C) 2012, Code Aurora Forum. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Not a Contribution, Apache license notifications and license are retained
 | 
			
		||||
 * for attribution purposes only.
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <cutils/log.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include "egl_handles.h"
 | 
			
		||||
#include <dlfcn.h>
 | 
			
		||||
 | 
			
		||||
ANDROID_SINGLETON_STATIC_INSTANCE(qdutils::eglHandles);
 | 
			
		||||
namespace qdutils {
 | 
			
		||||
 | 
			
		||||
eglHandles::eglHandles(){
 | 
			
		||||
     LINK_eglGetRenderBufferANDROID = NULL ;
 | 
			
		||||
     LINK_eglGetCurrentSurface = NULL;
 | 
			
		||||
     egl_lib = NULL;
 | 
			
		||||
     openEglLibAndGethandle();
 | 
			
		||||
     updateEglHandles(egl_lib);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eglHandles::~eglHandles(){
 | 
			
		||||
    closeEglLib();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void eglHandles::updateEglHandles(void* egl_lib){
 | 
			
		||||
 | 
			
		||||
    if(egl_lib != NULL) {
 | 
			
		||||
        *(void **)&LINK_eglGetRenderBufferANDROID =
 | 
			
		||||
                             ::dlsym(egl_lib, "eglGetRenderBufferANDROID");
 | 
			
		||||
        *(void **)&LINK_eglGetCurrentSurface =
 | 
			
		||||
                                  ::dlsym(egl_lib, "eglGetCurrentSurface");
 | 
			
		||||
         if(LINK_eglGetRenderBufferANDROID == NULL ||
 | 
			
		||||
                      LINK_eglGetCurrentSurface == NULL)
 | 
			
		||||
               ALOGE(" %s::Unable to  find symbols",__FUNCTION__) ;
 | 
			
		||||
    }else {
 | 
			
		||||
        LINK_eglGetRenderBufferANDROID = NULL;
 | 
			
		||||
        LINK_eglGetCurrentSurface = NULL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void eglHandles::openEglLibAndGethandle(){
 | 
			
		||||
 | 
			
		||||
    egl_lib = ::dlopen("libEGL_adreno200.so", RTLD_GLOBAL | RTLD_LAZY);
 | 
			
		||||
    if (!egl_lib) {
 | 
			
		||||
        ALOGE(" %s::Unable to open libEGL_adreno200",__FUNCTION__) ;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
android_native_buffer_t *
 | 
			
		||||
      eglHandles::getAndroidNativeRenderBuffer(EGLDisplay dpy){
 | 
			
		||||
 | 
			
		||||
  if(LINK_eglGetRenderBufferANDROID == NULL ||
 | 
			
		||||
        LINK_eglGetCurrentSurface == NULL){
 | 
			
		||||
           ALOGE("%s:: Unable to load or find the symbols ",__FUNCTION__);
 | 
			
		||||
           return NULL;
 | 
			
		||||
  }
 | 
			
		||||
  EGLSurface eglSurface = LINK_eglGetCurrentSurface(EGL_DRAW);
 | 
			
		||||
  android_native_buffer_t *renderBuffer =
 | 
			
		||||
    (android_native_buffer_t*)LINK_eglGetRenderBufferANDROID(dpy, eglSurface);
 | 
			
		||||
  return renderBuffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void eglHandles ::closeEglLib(){
 | 
			
		||||
    if(egl_lib)
 | 
			
		||||
        ::dlclose(egl_lib);
 | 
			
		||||
    egl_lib = NULL;
 | 
			
		||||
    updateEglHandles(NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										63
									
								
								libqdutils/egl_handles.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								libqdutils/egl_handles.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010 The Android Open Source Project
 | 
			
		||||
 * Copyright (C) 2012, Code Aurora Forum. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Not a Contribution, Apache license notifications and license are retained
 | 
			
		||||
 * for attribution purposes only.
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef EGL_HANDLES_H
 | 
			
		||||
#define EGL_HANDLES_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <utils/Singleton.h>
 | 
			
		||||
#include <EGL/egl.h>
 | 
			
		||||
#include <gralloc_priv.h>
 | 
			
		||||
#include <EGL/eglext.h>
 | 
			
		||||
 | 
			
		||||
typedef EGLClientBuffer (*functype_eglGetRenderBufferANDROID) (
 | 
			
		||||
                                             EGLDisplay dpy,
 | 
			
		||||
                                            EGLSurface draw);
 | 
			
		||||
typedef EGLSurface (*functype_eglGetCurrentSurface)(EGLint readdraw);
 | 
			
		||||
 | 
			
		||||
using namespace android;
 | 
			
		||||
namespace qdutils {
 | 
			
		||||
class eglHandles : public Singleton <eglHandles>
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  functype_eglGetRenderBufferANDROID LINK_eglGetRenderBufferANDROID;
 | 
			
		||||
  functype_eglGetCurrentSurface LINK_eglGetCurrentSurface;
 | 
			
		||||
  void* egl_lib;
 | 
			
		||||
 | 
			
		||||
  void updateEglHandles(void* egl_lib);
 | 
			
		||||
  void openEglLibAndGethandle();
 | 
			
		||||
  void closeEglLib();
 | 
			
		||||
 | 
			
		||||
public :
 | 
			
		||||
   eglHandles();
 | 
			
		||||
   ~eglHandles();
 | 
			
		||||
   functype_eglGetRenderBufferANDROID getEGLRenderBufferANDROID(){
 | 
			
		||||
        return LINK_eglGetRenderBufferANDROID;
 | 
			
		||||
   }
 | 
			
		||||
   functype_eglGetCurrentSurface getEGLCurrentSurface(){
 | 
			
		||||
        return LINK_eglGetCurrentSurface;
 | 
			
		||||
   }
 | 
			
		||||
   android_native_buffer_t *getAndroidNativeRenderBuffer(EGLDisplay dpy);
 | 
			
		||||
};
 | 
			
		||||
};
 | 
			
		||||
#endif // end of EGL_HANDLES_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user