 |
|
| Computers Forum Index » Computer - Graphics - API (Opengl) » Create and initialize a pbuffer (OpenGL ES)... |
|
Page 1 of 1 |
|
| Author |
Message |
| Turbo... |
Posted: Wed Sep 16, 2009 5:41 pm |
|
|
|
Guest
|
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_DISPLAY);
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. |
|
|
| Back to top |
|
|
|
| jbwest... |
Posted: Thu Sep 17, 2009 3:23 am |
|
|
|
Guest
|
"Turbo" <nospam at (no spam) gmail.com> wrote in message
news:4ab0ea1e$0$1101$4fafbaef at (no spam) reader4.news.tin.it...
Quote:
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_DISPLAY);
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.
Does it work without them ? (the render-to-texture args?).
jbw |
|
|
| Back to top |
|
|
|
|
|
All times are GMT
The time now is Fri Dec 04, 2009 9:10 am
|
|