emulator opengl: implement eglChooseConfig functionality.
Added new RenderControl command to request the host to execute the ChooseConfig functionality. Change-Id: Ib92be313a6df740de69d671c6994ec6cae17ea13
This commit is contained in:
committed by
Guy Zadikario
parent
33dc9add2a
commit
a7b7e95b03
@@ -24,15 +24,15 @@ int FBConfig::s_numConfigs = 0;
|
||||
const GLuint FBConfig::s_configAttribs[] = {
|
||||
EGL_DEPTH_SIZE, // must be first - see getDepthSize()
|
||||
EGL_STENCIL_SIZE, // must be second - see getStencilSize()
|
||||
EGL_RENDERABLE_TYPE, // must be third - see getRenderableType()
|
||||
EGL_SURFACE_TYPE, // must be fourth - see getSurfaceType()
|
||||
EGL_RENDERABLE_TYPE,// must be third - see getRenderableType()
|
||||
EGL_SURFACE_TYPE, // must be fourth - see getSurfaceType()
|
||||
EGL_CONFIG_ID, // must be fifth - see chooseConfig()
|
||||
EGL_BUFFER_SIZE,
|
||||
EGL_ALPHA_SIZE,
|
||||
EGL_BLUE_SIZE,
|
||||
EGL_GREEN_SIZE,
|
||||
EGL_RED_SIZE,
|
||||
EGL_CONFIG_CAVEAT,
|
||||
EGL_CONFIG_ID,
|
||||
EGL_LEVEL,
|
||||
EGL_MAX_PBUFFER_HEIGHT,
|
||||
EGL_MAX_PBUFFER_PIXELS,
|
||||
@@ -201,6 +201,52 @@ void FBConfig::packConfigsInfo(GLuint *buffer)
|
||||
}
|
||||
}
|
||||
|
||||
int FBConfig::chooseConfig(FrameBuffer *fb, EGLint * attribs, uint32_t * configs, uint32_t configs_size)
|
||||
{
|
||||
EGLDisplay dpy = fb->getDisplay();
|
||||
int ret = 0;
|
||||
|
||||
if (dpy == EGL_NO_DISPLAY) {
|
||||
fprintf(stderr,"Could not get EGL Display\n");
|
||||
return ret;
|
||||
}
|
||||
//
|
||||
// Query the num of configs in the EGL backend
|
||||
//
|
||||
EGLint nConfigs;
|
||||
if (!s_egl.eglGetConfigs(dpy, NULL, 0, &nConfigs)) {
|
||||
fprintf(stderr, "Could not get number of available configs\n");
|
||||
return ret;
|
||||
}
|
||||
//
|
||||
// Query the max matching configs in the backend
|
||||
//
|
||||
EGLConfig *matchedConfigs = new EGLConfig[nConfigs];
|
||||
s_egl.eglChooseConfig(dpy, attribs, matchedConfigs, nConfigs, &nConfigs);
|
||||
|
||||
//
|
||||
// From all matchedConfigs we need only config_size FBConfigs, so we intersect both lists compating the CONFIG_ID attribute
|
||||
//
|
||||
uint32_t nVerifiedCfgs = 0;
|
||||
for (int matchedIdx=0; matchedIdx<nConfigs; matchedIdx++) {
|
||||
if (nVerifiedCfgs >= configs_size) break; //We have enouhgt configs
|
||||
int sCfgId;
|
||||
s_egl.eglGetConfigAttrib(dpy, matchedConfigs[matchedIdx], EGL_CONFIG_ID, &sCfgId);
|
||||
for (int fbIdx=0; fbIdx<s_numConfigs; fbIdx++) {
|
||||
int dCfgId = s_fbConfigs[fbIdx]->m_attribValues[4]; //CONFIG_ID
|
||||
if (sCfgId == dCfgId) {
|
||||
//This config matches the requested attributes and filtered into fbConfigs, so we're happy with it
|
||||
configs[nVerifiedCfgs++] = fbIdx;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete matchedConfigs;
|
||||
|
||||
return nVerifiedCfgs;
|
||||
}
|
||||
|
||||
FBConfig::FBConfig(EGLDisplay p_eglDpy, EGLConfig p_eglCfg)
|
||||
{
|
||||
m_eglConfig = p_eglCfg;
|
||||
|
||||
@@ -35,6 +35,7 @@ public:
|
||||
static int getNumConfigs();
|
||||
static int getNumAttribs() { return s_numConfigAttribs; }
|
||||
static void packConfigsInfo(GLuint *buffer);
|
||||
static int chooseConfig(FrameBuffer *fb, EGLint * attribs, uint32_t * configs, uint32_t configs_size);
|
||||
~FBConfig();
|
||||
|
||||
EGLConfig getEGLConfig() const { return m_eglConfig; }
|
||||
|
||||
@@ -78,6 +78,16 @@ static EGLint rcGetConfigs(uint32_t bufSize, GLuint* buffer)
|
||||
return nConfigs;
|
||||
}
|
||||
|
||||
static EGLint rcChooseConfig(EGLint *attribs, uint32_t attribs_size, uint32_t *configs, uint32_t configs_size)
|
||||
{
|
||||
FrameBuffer *fb = FrameBuffer::getFB();
|
||||
if (!fb) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return FBConfig::chooseConfig(fb, attribs, configs, configs_size);
|
||||
}
|
||||
|
||||
static EGLint rcGetFBParam(EGLint param)
|
||||
{
|
||||
FrameBuffer *fb = FrameBuffer::getFB();
|
||||
@@ -252,6 +262,7 @@ void initRenderControlContext(renderControl_decoder_context_t *dec)
|
||||
dec->set_rcQueryEGLString(rcQueryEGLString);
|
||||
dec->set_rcGetNumConfigs(rcGetNumConfigs);
|
||||
dec->set_rcGetConfigs(rcGetConfigs);
|
||||
dec->set_rcChooseConfig(rcChooseConfig);
|
||||
dec->set_rcGetFBParam(rcGetFBParam);
|
||||
dec->set_rcCreateContext(rcCreateContext);
|
||||
dec->set_rcDestroyContext(rcDestroyContext);
|
||||
|
||||
Reference in New Issue
Block a user