am 8066f12a: Merge "opengles emulator: code cleanup removing dead code"
* commit '8066f12a07b050809c62fda1bdae5296e81a4c11': opengles emulator: code cleanup removing dead code
This commit is contained in:
@@ -87,88 +87,22 @@ InitConfigStatus FBConfig::initConfigList(FrameBuffer *fb)
|
||||
s_egl.eglGetConfigs(dpy, configs, nConfigs, &nConfigs);
|
||||
|
||||
//
|
||||
// Find number of usable configs which support pbuffer rendering
|
||||
// for each ES and ES2 as well as number of configs supporting
|
||||
// EGL_BIND_TO_TEXTURE_RGBA for each of ES and ES2.
|
||||
// copy the config attributes, filter out
|
||||
// configs we do not want to support.
|
||||
//
|
||||
const int GL = 0;
|
||||
const int GL1 = 1;
|
||||
const int GL2 = 2;
|
||||
int numPbuf[3] = {0, 0, 0};
|
||||
int numBindToTexture[3] = {0, 0, 0};
|
||||
for (int i=0; i<nConfigs; i++) {
|
||||
GLint depthSize, stencilSize;
|
||||
GLint renderType, surfaceType;
|
||||
GLint bindToTexture;
|
||||
|
||||
s_egl.eglGetConfigAttrib(dpy, configs[i], EGL_DEPTH_SIZE, &depthSize);
|
||||
s_egl.eglGetConfigAttrib(dpy, configs[i], EGL_STENCIL_SIZE, &stencilSize);
|
||||
s_egl.eglGetConfigAttrib(dpy, configs[i], EGL_RENDERABLE_TYPE, &renderType);
|
||||
s_egl.eglGetConfigAttrib(dpy, configs[i], EGL_SURFACE_TYPE, &surfaceType);
|
||||
if (depthSize > 0 && stencilSize > 0 &&
|
||||
(surfaceType & EGL_PBUFFER_BIT) != 0) {
|
||||
|
||||
numPbuf[GL]++;
|
||||
|
||||
if ((renderType & EGL_OPENGL_ES_BIT) != 0) {
|
||||
numPbuf[GL1]++;
|
||||
}
|
||||
|
||||
if ((renderType & EGL_OPENGL_ES2_BIT) != 0) {
|
||||
numPbuf[GL2]++;
|
||||
}
|
||||
|
||||
s_egl.eglGetConfigAttrib(dpy, configs[i],
|
||||
EGL_BIND_TO_TEXTURE_RGBA, &bindToTexture);
|
||||
if (bindToTexture) {
|
||||
numBindToTexture[GL]++;
|
||||
if ((renderType & EGL_OPENGL_ES_BIT) != 0) {
|
||||
numBindToTexture[GL1]++;
|
||||
}
|
||||
|
||||
if ((renderType & EGL_OPENGL_ES2_BIT) != 0) {
|
||||
numBindToTexture[GL2]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool useOnlyPbuf = false;
|
||||
bool useOnlyBindToTexture = false;
|
||||
int numConfigs = nConfigs;
|
||||
if ( numPbuf[GL1] > 0 &&
|
||||
(!caps.hasGL2 || numPbuf[GL2] > 0)) {
|
||||
useOnlyPbuf = true;
|
||||
numConfigs = numPbuf[GL];
|
||||
}
|
||||
if (useOnlyPbuf &&
|
||||
!(caps.has_eglimage_texture_2d &&
|
||||
caps.has_eglimage_renderbuffer) &&
|
||||
numBindToTexture[GL1] > 0 &&
|
||||
(!caps.hasGL2 || numBindToTexture[GL2] > 0)) {
|
||||
useOnlyBindToTexture = true;
|
||||
numConfigs = numBindToTexture[GL];
|
||||
ret = INIT_CONFIG_HAS_BIND_TO_TEXTURE;
|
||||
}
|
||||
else {
|
||||
ret = INIT_CONFIG_PASSED;
|
||||
}
|
||||
|
||||
int j = 0;
|
||||
s_fbConfigs = new FBConfig*[nConfigs];
|
||||
for (int i=0; i<nConfigs; i++) {
|
||||
if (useOnlyBindToTexture) {
|
||||
EGLint bindToTexture;
|
||||
s_egl.eglGetConfigAttrib(dpy, configs[i],
|
||||
EGL_BIND_TO_TEXTURE_RGBA, &bindToTexture);
|
||||
if (!bindToTexture) continue;
|
||||
}
|
||||
else if (useOnlyPbuf) {
|
||||
|
||||
//
|
||||
// filter out configs which does not support pbuffers.
|
||||
// we only support pbuffer configs since we use a pbuffer
|
||||
// handle to bind a guest created window object.
|
||||
//
|
||||
EGLint surfaceType;
|
||||
s_egl.eglGetConfigAttrib(dpy, configs[i],
|
||||
EGL_SURFACE_TYPE, &surfaceType);
|
||||
if (!(surfaceType & EGL_PBUFFER_BIT)) continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Filter out not RGB configs
|
||||
@@ -184,7 +118,8 @@ InitConfigStatus FBConfig::initConfigList(FrameBuffer *fb)
|
||||
s_numConfigs = j;
|
||||
|
||||
delete[] configs;
|
||||
return ret;
|
||||
|
||||
return s_numConfigs > 0 ? INIT_CONFIG_PASSED : INIT_CONFIG_FAILED;
|
||||
}
|
||||
|
||||
const FBConfig *FBConfig::get(int p_config)
|
||||
|
||||
@@ -23,8 +23,7 @@ class FrameBuffer;
|
||||
|
||||
enum InitConfigStatus {
|
||||
INIT_CONFIG_FAILED = 0,
|
||||
INIT_CONFIG_PASSED = 1,
|
||||
INIT_CONFIG_HAS_BIND_TO_TEXTURE = 2
|
||||
INIT_CONFIG_PASSED = 1
|
||||
};
|
||||
|
||||
class FBConfig
|
||||
|
||||
@@ -275,6 +275,18 @@ bool FrameBuffer::initialize(int width, int height)
|
||||
fb->m_caps.has_eglimage_renderbuffer = false;
|
||||
}
|
||||
|
||||
//
|
||||
// Fail initialization if not all of the following extensions
|
||||
// exist:
|
||||
// EGL_KHR_gl_texture_2d_image
|
||||
// GL_OES_EGL_IMAGE (by both GLES implementations [1 and 2])
|
||||
//
|
||||
if (!fb->m_caps.has_eglimage_texture_2d) {
|
||||
ERR("Failed: Missing egl_image related extension(s)\n");
|
||||
delete fb;
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize set of configs
|
||||
//
|
||||
@@ -316,13 +328,6 @@ bool FrameBuffer::initialize(int width, int height)
|
||||
fb->m_caps.hasGL2 = false;
|
||||
}
|
||||
|
||||
//
|
||||
// update Pbuffer bind to texture capability based on configs
|
||||
//
|
||||
fb->m_caps.has_BindToTexture =
|
||||
(configStatus == INIT_CONFIG_HAS_BIND_TO_TEXTURE);
|
||||
|
||||
|
||||
//
|
||||
// Initialize some GL state
|
||||
//
|
||||
|
||||
@@ -35,7 +35,6 @@ struct FrameBufferCaps
|
||||
bool hasGL2;
|
||||
bool has_eglimage_texture_2d;
|
||||
bool has_eglimage_renderbuffer;
|
||||
bool has_BindToTexture;
|
||||
EGLint eglMajor;
|
||||
EGLint eglMinor;
|
||||
};
|
||||
|
||||
@@ -35,9 +35,7 @@ WindowSurface::WindowSurface() :
|
||||
m_width(0),
|
||||
m_height(0),
|
||||
m_pbufWidth(0),
|
||||
m_pbufHeight(0),
|
||||
m_useEGLImage(false),
|
||||
m_useBindToTexture(false)
|
||||
m_pbufHeight(0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -64,34 +62,13 @@ WindowSurface *WindowSurface::create(int p_config, int p_width, int p_height)
|
||||
const FrameBufferCaps &caps = fb->getCaps();
|
||||
|
||||
//
|
||||
// We can use eglimage and prevent copies if:
|
||||
// GL_KHR_gl_texture_2D_image is present.
|
||||
// and either there is no need for depth or stencil buffer
|
||||
// or GL_KHR_gl_renderbuffer_image present.
|
||||
// Create a pbuffer to be used as the egl surface
|
||||
// for that window.
|
||||
//
|
||||
#if 0
|
||||
//XXX: This path should be implemented
|
||||
win->m_useEGLImage =
|
||||
(caps.has_eglimage_texture_2d &&
|
||||
(caps.has_eglimage_renderbuffer ||
|
||||
(fbconf->getDepthSize() + fbconf->getStencilSize() == 0)) );
|
||||
#else
|
||||
win->m_useEGLImage = false;
|
||||
#endif
|
||||
|
||||
if (win->m_useEGLImage) {
|
||||
}
|
||||
else if (0 != (fbconf->getSurfaceType() & EGL_PBUFFER_BIT)) {
|
||||
if (!win->resizePbuffer(p_width, p_height)) {
|
||||
delete win;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// no EGLImage support and not Pbuffer support - fail
|
||||
delete win;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
win->m_width = p_width;
|
||||
win->m_height = p_height;
|
||||
@@ -108,22 +85,10 @@ void WindowSurface::flushColorBuffer()
|
||||
{
|
||||
if (m_attachedColorBuffer.Ptr() != NULL) {
|
||||
|
||||
if (!m_useEGLImage) {
|
||||
bool copied = false;
|
||||
if (m_useBindToTexture) {
|
||||
copied = m_attachedColorBuffer->blitFromPbuffer(m_eglSurface);
|
||||
}
|
||||
|
||||
if (!copied) {
|
||||
//copyToColorBuffer();
|
||||
blitToColorBuffer();
|
||||
}
|
||||
}
|
||||
else {
|
||||
//TODO: EGLImage
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// setColorBuffer - this function is called when a new color buffer needs to
|
||||
@@ -175,9 +140,6 @@ void WindowSurface::bind(RenderContextPtr p_ctx, SurfaceBindType p_bindType)
|
||||
return; // bad param
|
||||
}
|
||||
|
||||
if (m_useEGLImage) {
|
||||
// XXX: should be implemented
|
||||
}
|
||||
}
|
||||
|
||||
void WindowSurface::copyToColorBuffer()
|
||||
@@ -323,27 +285,14 @@ bool WindowSurface::resizePbuffer(unsigned int p_width, unsigned int p_height)
|
||||
const FrameBufferCaps &caps = fb->getCaps();
|
||||
|
||||
//
|
||||
// Create pbuffer surface, if possible
|
||||
// set it such that it will be able to be bound to a texture
|
||||
// later to prevent readback.
|
||||
// Create pbuffer surface.
|
||||
//
|
||||
EGLint pbufAttribs[12];
|
||||
EGLint pbufAttribs[5];
|
||||
pbufAttribs[0] = EGL_WIDTH;
|
||||
pbufAttribs[1] = p_width;
|
||||
pbufAttribs[2] = EGL_HEIGHT;
|
||||
pbufAttribs[3] = p_height;
|
||||
|
||||
if (caps.has_BindToTexture) {
|
||||
pbufAttribs[4] = EGL_TEXTURE_FORMAT;
|
||||
pbufAttribs[5] = EGL_TEXTURE_RGBA;
|
||||
pbufAttribs[6] = EGL_TEXTURE_TARGET;
|
||||
pbufAttribs[7] = EGL_TEXTURE_2D;
|
||||
pbufAttribs[8] = EGL_NONE;
|
||||
m_useBindToTexture = true;
|
||||
}
|
||||
else {
|
||||
pbufAttribs[4] = EGL_NONE;
|
||||
}
|
||||
|
||||
m_eglSurface = s_egl.eglCreatePbufferSurface(fb->getDisplay(),
|
||||
m_fbconf->getEGLConfig(),
|
||||
|
||||
Reference in New Issue
Block a user