PDA

View Full Version : Create and initialize a pbuffer.



muratmat
09-16-2009, 06:31 AM
I'm working on my Xperia X1 (WinCE 6.1, MSM7200a, OpenGL ES 1.1) and I'm trying to setup a pbuffer in order to perform offline rendering.
Here's the code I'm using:



// EGL variables
EGLDisplay eglDisplay = 0;
EGLConfig eglConfigWindow = 0;
EGLConfig eglConfigPbuffer = 0;
EGLSurface eglSurfaceWindow = 0;
EGLSurface eglSurfacePbuffer = 0;
EGLContext eglContext = 0;

unsigned int testEGLError(HWND hWnd, char* pszLocation) {

EGLint iErr = eglGetError();

if (iErr != EGL_SUCCESS) {
TCHAR pszStr[256];
TCHAR tmsg[256];
int i;

i = 0;
while (pszLocation[i] != '\0' && i < 255) {
tmsg[i] = (TCHAR)(pszLocation[i]);
i++;
}
tmsg[i] = (TCHAR)('\0');

_stprintf(pszStr, _T("%s failed (%d).\n"), tmsg, iErr);
MessageBox(hWnd, pszStr, _T("Error"), MB_OK | MB_ICONEXCLAMATION);
return 0;
}
return 1;
}

unsigned int initEGL(void) {

EGLint iMajorVersion, iMinorVersion;
int iConfigs;
const EGLint attribListWindow[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RED_SIZE, 5,
EGL_GREEN_SIZE, 6,
EGL_BLUE_SIZE, 5,
EGL_ALPHA_SIZE, 0,
EGL_DEPTH_SIZE, 16,
EGL_STENCIL_SIZE, 0,
EGL_NONE
};
const EGLint attribListPbuffer[] = {
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_RED_SIZE, 5,
EGL_GREEN_SIZE, 6,
EGL_BLUE_SIZE, 5,
EGL_ALPHA_SIZE, 0,
EGL_DEPTH_SIZE, 16,
EGL_STENCIL_SIZE, 0,
EGL_NONE
};
const EGLint srfPbufferAttr[] = {
EGL_WIDTH, 256,
EGL_HEIGHT, 256,
// if enabled, the following lines result in a EGL_BAD_ATTRIBUTE error on the eglCreatePbufferSurface
// EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
// EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB,
EGL_NONE
};

eglDisplay = eglGetDisplay((NativeDisplayType)hDC);
if (eglDisplay == EGL_NO_DISPLAY)
eglDisplay = eglGetDisplay((NativeDisplayType)EGL_DEFAULT_DISPL AY);

if (!eglInitialize(eglDisplay, &iMajorVersion, &iMinorVersion))
goto cleanup;

// choose a config valid for window surfaces
if (!eglChooseConfig(eglDisplay, attribListWindow, &eglConfigWindow, 1, &iConfigs) || (iConfigs != 1))
goto cleanup;

// create a window surface
eglSurfaceWindow = eglCreateWindowSurface(eglDisplay, eglConfigWindow, hWnd, NULL);
if (eglSurfaceWindow == EGL_NO_SURFACE) {
eglGetError();
eglSurfaceWindow = eglCreateWindowSurface(eglDisplay, eglConfigWindow, NULL, NULL);
}
if (!testEGLError(hWnd, "eglCreateWindowSurface"))
goto cleanup;

// create a rendering context
eglContext = eglCreateContext(eglDisplay, eglConfigWindow, NULL, NULL);
if (!testEGLError(hWnd, "eglCreateContext"))
goto cleanup;

// try to make window the current surface
eglMakeCurrent(eglDisplay, eglSurfaceWindow, eglSurfaceWindow, eglContext);
if (!testEGLError(hWnd, "eglMakeCurrent(eglSurfaceWindow)"))
goto cleanup;

// choose a config valid for pbuffer surfaces
if (!eglChooseConfig(eglDisplay, attribListPbuffer, &eglConfigPbuffer, 1, &iConfigs) || (iConfigs != 1))
goto cleanup;

// create a pbuffer surface
eglSurfacePbuffer = eglCreatePbufferSurface(eglDisplay, eglConfigPbuffer, srfPbufferAttr);
if (!testEGLError(hWnd, "eglCreatePbufferSurface"))
goto cleanup;

// try to make pbuffer the current surface
eglMakeCurrent(eglDisplay, eglSurfacePbuffer, eglSurfacePbuffer, eglContext);
if (!testEGLError(hWnd, "eglMakeCurrent(eglSurfacePbuffer)"))
goto cleanup;

return 1;

cleanup:
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
if (eglSurfaceWindow != EGL_NO_SURFACE)
eglDestroySurface(eglDisplay, eglSurfaceWindow);
if (eglSurfacePbuffer != EGL_NO_SURFACE)
eglDestroySurface(eglDisplay, eglSurfacePbuffer);
if (eglContext != EGL_NO_CONTEXT)
eglDestroyContext(eglDisplay, eglContext);
eglTerminate(eglDisplay);
return 0;
}


When the application run the eglMakeCurrent(eglDisplay, eglSurfacePbuffer, eglSurfacePbuffer, eglContext) command, it crashes and exits. Then, the device must be restarted in order to have other OpenGL ES applications running.
Could someone point me to a possible solution? Is my EGL initialization code wrong/incomplete?

Many thanks in advance.
Matteo.