am dbe3b024: Merge "emulator: opengl: fallback gralloc module"
* commit 'dbe3b024cb81419796f01eebb64fba28eedaa301': emulator: opengl: fallback gralloc module
This commit is contained in:
committed by
Android Git Automerger
commit
846dd22375
@@ -23,11 +23,12 @@
|
|||||||
#include <cutils/ashmem.h>
|
#include <cutils/ashmem.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include "HostConnection.h"
|
#include "HostConnection.h"
|
||||||
#include "glUtils.h"
|
#include "glUtils.h"
|
||||||
#include <cutils/log.h>
|
#include <cutils/log.h>
|
||||||
|
#include <cutils/properties.h>
|
||||||
|
|
||||||
#define DBG_FUNC DBG("%s\n", __FUNCTION__)
|
#define DBG_FUNC DBG("%s\n", __FUNCTION__)
|
||||||
//
|
//
|
||||||
@@ -37,6 +38,16 @@ struct private_module_t {
|
|||||||
gralloc_module_t base;
|
gralloc_module_t base;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* If not NULL, this is a pointer to the fallback module.
|
||||||
|
* This really is gralloc.default, which we'll use if we detect
|
||||||
|
* that the emulator we're running in does not support GPU emulation.
|
||||||
|
*/
|
||||||
|
static gralloc_module_t* sFallback;
|
||||||
|
static pthread_once_t sFallbackOnce = PTHREAD_ONCE_INIT;
|
||||||
|
|
||||||
|
static void fallback_init(void); // forward
|
||||||
|
|
||||||
|
|
||||||
typedef struct _alloc_list_node {
|
typedef struct _alloc_list_node {
|
||||||
buffer_handle_t handle;
|
buffer_handle_t handle;
|
||||||
_alloc_list_node *next;
|
_alloc_list_node *next;
|
||||||
@@ -401,6 +412,12 @@ static int fb_close(struct hw_device_t *dev)
|
|||||||
static int gralloc_register_buffer(gralloc_module_t const* module,
|
static int gralloc_register_buffer(gralloc_module_t const* module,
|
||||||
buffer_handle_t handle)
|
buffer_handle_t handle)
|
||||||
{
|
{
|
||||||
|
pthread_once(&sFallbackOnce, fallback_init);
|
||||||
|
if (sFallback != NULL) {
|
||||||
|
return sFallback->registerBuffer(sFallback, handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private_module_t *gr = (private_module_t *)module;
|
private_module_t *gr = (private_module_t *)module;
|
||||||
cb_handle_t *cb = (cb_handle_t *)handle;
|
cb_handle_t *cb = (cb_handle_t *)handle;
|
||||||
if (!gr || !cb_handle_t::validate(cb)) {
|
if (!gr || !cb_handle_t::validate(cb)) {
|
||||||
@@ -428,6 +445,10 @@ static int gralloc_register_buffer(gralloc_module_t const* module,
|
|||||||
static int gralloc_unregister_buffer(gralloc_module_t const* module,
|
static int gralloc_unregister_buffer(gralloc_module_t const* module,
|
||||||
buffer_handle_t handle)
|
buffer_handle_t handle)
|
||||||
{
|
{
|
||||||
|
if (sFallback != NULL) {
|
||||||
|
return sFallback->unregisterBuffer(sFallback, handle);
|
||||||
|
}
|
||||||
|
|
||||||
private_module_t *gr = (private_module_t *)module;
|
private_module_t *gr = (private_module_t *)module;
|
||||||
cb_handle_t *cb = (cb_handle_t *)handle;
|
cb_handle_t *cb = (cb_handle_t *)handle;
|
||||||
if (!gr || !cb_handle_t::validate(cb)) {
|
if (!gr || !cb_handle_t::validate(cb)) {
|
||||||
@@ -458,6 +479,10 @@ static int gralloc_lock(gralloc_module_t const* module,
|
|||||||
int l, int t, int w, int h,
|
int l, int t, int w, int h,
|
||||||
void** vaddr)
|
void** vaddr)
|
||||||
{
|
{
|
||||||
|
if (sFallback != NULL) {
|
||||||
|
return sFallback->lock(sFallback, handle, usage, l, t, w, h, vaddr);
|
||||||
|
}
|
||||||
|
|
||||||
private_module_t *gr = (private_module_t *)module;
|
private_module_t *gr = (private_module_t *)module;
|
||||||
cb_handle_t *cb = (cb_handle_t *)handle;
|
cb_handle_t *cb = (cb_handle_t *)handle;
|
||||||
if (!gr || !cb_handle_t::validate(cb)) {
|
if (!gr || !cb_handle_t::validate(cb)) {
|
||||||
@@ -546,6 +571,10 @@ static int gralloc_lock(gralloc_module_t const* module,
|
|||||||
static int gralloc_unlock(gralloc_module_t const* module,
|
static int gralloc_unlock(gralloc_module_t const* module,
|
||||||
buffer_handle_t handle)
|
buffer_handle_t handle)
|
||||||
{
|
{
|
||||||
|
if (sFallback != NULL) {
|
||||||
|
return sFallback->unlock(sFallback, handle);
|
||||||
|
}
|
||||||
|
|
||||||
private_module_t *gr = (private_module_t *)module;
|
private_module_t *gr = (private_module_t *)module;
|
||||||
cb_handle_t *cb = (cb_handle_t *)handle;
|
cb_handle_t *cb = (cb_handle_t *)handle;
|
||||||
if (!gr || !cb_handle_t::validate(cb)) {
|
if (!gr || !cb_handle_t::validate(cb)) {
|
||||||
@@ -603,6 +632,7 @@ static int gralloc_unlock(gralloc_module_t const* module,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int gralloc_device_open(const hw_module_t* module,
|
static int gralloc_device_open(const hw_module_t* module,
|
||||||
const char* name,
|
const char* name,
|
||||||
hw_device_t** device)
|
hw_device_t** device)
|
||||||
@@ -611,6 +641,11 @@ static int gralloc_device_open(const hw_module_t* module,
|
|||||||
|
|
||||||
LOGD("gralloc_device_open %s\n", name);
|
LOGD("gralloc_device_open %s\n", name);
|
||||||
|
|
||||||
|
pthread_once( &sFallbackOnce, fallback_init );
|
||||||
|
if (sFallback != NULL) {
|
||||||
|
return sFallback->common.methods->open(&sFallback->common, name, device);
|
||||||
|
}
|
||||||
|
|
||||||
if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
|
if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
|
||||||
|
|
||||||
// Create host connection and keep it in the TLS.
|
// Create host connection and keep it in the TLS.
|
||||||
@@ -731,3 +766,32 @@ struct private_module_t HAL_MODULE_INFO_SYM = {
|
|||||||
reserved_proc : {NULL, }
|
reserved_proc : {NULL, }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* This function is called once to detect whether the emulator supports
|
||||||
|
* GPU emulation (this is done by looking at the qemu.gles kernel
|
||||||
|
* parameter, which must be > 0 if this is the case).
|
||||||
|
*
|
||||||
|
* If not, then load gralloc.default instead as a fallback.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
fallback_init(void)
|
||||||
|
{
|
||||||
|
char prop[PROPERTY_VALUE_MAX];
|
||||||
|
void* module;
|
||||||
|
|
||||||
|
property_get("ro.kernel.qemu.gles", prop, "0");
|
||||||
|
if (atoi(prop) > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LOGD("Emulator without GPU emulation detected.");
|
||||||
|
module = dlopen("/system/lib/hw/gralloc.default.so", RTLD_LAZY|RTLD_LOCAL);
|
||||||
|
if (module != NULL) {
|
||||||
|
sFallback = reinterpret_cast<gralloc_module_t*>(dlsym(module, HAL_MODULE_INFO_SYM_AS_STR));
|
||||||
|
if (sFallback == NULL) {
|
||||||
|
dlclose(module);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sFallback == NULL) {
|
||||||
|
LOGE("Could not find software fallback module!?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user