Unable to use eglGetDisplay

Hi,

I am trying to setup a simple Windows Mobile program which utilizes OpenGL ES and EGL. For some reason, whenever I call eglGetDisplay (with either EGL_DEFAULT_DISPLAY or my windows HDC) I get NULL returned back. I’ve looked through every thread here that mentions eglGetDisplay and I haven’t found anything that seems related to my problem. Without posting my whole program, here is the relevant code:

#pragma comment(lib, "libGLES_CM.lib")

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <aygshell.h>

#include <GLES/gl.h>
#include <EGL/egl.h>

LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
BOOL OnCreateMainWindow(HWND hwnd);

NativeDisplayType	createNativeDisplay(NativeWindowType window);
NativeWindowType	createNativeWindow();

//strings
static const TCHAR g_szClassName[] = TEXT("hatfat");

//globals
HINSTANCE g_hInstance;

const int configAttributes[] =
{
	EGL_RED_SIZE, 8,
	EGL_GREEN_SIZE, 8,
	EGL_BLUE_SIZE, 8,
	EGL_ALPHA_SIZE, 8,
	EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT|EGL_OPENGL_ES_BIT,
	EGL_NONE
};

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
{
	char *renderer		= (char *)glGetString(GL_RENDERER);
	char *vendor		= (char *)glGetString(GL_VENDOR);
	char *version		= (char *)glGetString(GL_VERSION);
	printf("%s
%s
%s
", renderer, vendor, version);

	const char *eglVendor		= eglQueryString(NULL, EGL_VENDOR);
	printf("vendor %s
", eglVendor); //vendor is null :/
	
	//blah is null :/
	void *blah			= eglGetProcAddress("eglGetDisplay");
	
	EGLDisplay			display;
    EGLConfig			config;
    EGLContext			context;
    EGLSurface			surface;
    EGLint				num_config;
    NativeWindowType	native_window;
	NativeDisplayType	native_display;

	/* create a native window */
    native_window = createNativeWindow();

	/* get native display */
	native_display = createNativeDisplay(native_window);
	
    /* get an EGL display connection */
    display = eglGetDisplay(native_display);

	int error = eglGetError();
	if (error != EGL_SUCCESS)
	{
		printf("error = %x
", error);
	}

    /* initialize the EGL display connection */
    eglInitialize(display, NULL, NULL);

	error = eglGetError();
	if (error != EGL_SUCCESS)
	{
		printf("error = %x
", error);
	}

    /* get an appropriate EGL frame buffer configuration */
    eglChooseConfig(display, configAttributes, &config, 1, &num_config);

    /* create an EGL rendering context */
    context = eglCreateContext(display, config, EGL_NO_CONTEXT, NULL);


    /* create an EGL window surface */
    surface = eglCreateWindowSurface(display, config, native_window, NULL);

    /* connect the context to the surface */
    eglMakeCurrent(display, surface, surface, context);

	/*
    glClearColor(1.0, 1.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();

    eglSwapBuffers(display, surface);
	*/

	Sleep(3000);

    return EXIT_SUCCESS;
}

NativeDisplayType createNativeDisplay(NativeWindowType window)
{
	return GetWindowDC(window);
}

NativeWindowType createNativeWindow()
{
    WNDCLASS wc;
    ATOM     atm;
    HWND     hwnd;

    // Set up the window class description
    ZeroMemory(&wc, sizeof(wc));
    wc.lpfnWndProc = MainWindowProc;
    wc.hInstance = g_hInstance;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = g_szClassName;

	// We want to redraw the window contents anytime we get resized. That way
	// we'll respond appropriately when the user switches between portrait and
	// landscape. If we had any child windows or controls, we'd need to
	// reposition or resize them when we get a WM_SIZE message.
    wc.style = CS_HREDRAW | CS_VREDRAW;

    // Register the window class
    atm = RegisterClass(&wc);
    if (atm == 0)
    {
        // Failed!!
        return NULL;
    }

    // Create a window using the class we just registered. Note that the
	// initial size and position don't matter, because we're going to make it
	// fullscreen when we get WM_CREATE, before it's ever displayed.
    hwnd = CreateWindow((LPCTSTR)atm, TEXT("hatfat"), WS_OVERLAPPED | WS_SYSMENU,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, NULL, g_hInstance, NULL);
    if (hwnd == NULL)
    {
        // Failed!!
        return NULL;
    }

    // Make the window visible and paint before returning
    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);
    return hwnd;
}

Any ideas? The program compiles correctly and runs. It looks like it is correctly creating the Window’s window (I pulled that code out of a Microsoft sample, so I think its correct).

What concerns me is that:

const char *eglVendor		= eglQueryString(NULL, EGL_VENDOR);
	printf("vendor %s
", eglVendor); //vendor is null :/

is NULL, and also:

//blah is null :/
	void *blah			= eglGetProcAddress("eglGetDisplay");

is null.

The OpenGL glGetStrings calls do return valid data though:

Q3Dimension MSM7500W 01.02.03 0 5.1.2
QUALCOMM, Inc.
OpenGL ES-CM 1.0

I feel like EGL isn’t working correctly, but I am not sure what is wrong. Any help is greatly appreciated.

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.