opengl32: Add a test case for WGL_ARB_create_context/opengl3.
This commit is contained in:
parent
b426a0b5ce
commit
a3dff8af94
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Some tests for OpenGL functions
|
* Some tests for OpenGL functions
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007 Roderick Colenbrander
|
* Copyright (C) 2007-2008 Roderick Colenbrander
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -30,6 +30,18 @@ const unsigned char * WINAPI glGetString(unsigned int);
|
|||||||
#define MAX_FORMATS 256
|
#define MAX_FORMATS 256
|
||||||
typedef void* HPBUFFERARB;
|
typedef void* HPBUFFERARB;
|
||||||
|
|
||||||
|
/* WGL_ARB_create_context */
|
||||||
|
HGLRC (WINAPI *pwglCreateContextAttribsARB)(HDC hDC, HGLRC hShareContext, const int *attribList);
|
||||||
|
/* GetLastError */
|
||||||
|
#define ERROR_INVALID_VERSION_ARB 0x2095
|
||||||
|
#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
||||||
|
#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
|
||||||
|
#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
|
||||||
|
#define WGL_CONTEXT_FLAGS_ARB 0x2094
|
||||||
|
/* Flags for WGL_CONTEXT_FLAGS_ARB */
|
||||||
|
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001
|
||||||
|
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
|
||||||
|
|
||||||
/* WGL_ARB_extensions_string */
|
/* WGL_ARB_extensions_string */
|
||||||
static const char* (WINAPI *pwglGetExtensionsStringARB)(HDC);
|
static const char* (WINAPI *pwglGetExtensionsStringARB)(HDC);
|
||||||
static int (WINAPI *pwglReleasePbufferDCARB)(HPBUFFERARB, HDC);
|
static int (WINAPI *pwglReleasePbufferDCARB)(HPBUFFERARB, HDC);
|
||||||
@ -64,6 +76,9 @@ static void init_functions(void)
|
|||||||
if(!p ## func) \
|
if(!p ## func) \
|
||||||
trace("wglGetProcAddress(%s) failed\n", #func);
|
trace("wglGetProcAddress(%s) failed\n", #func);
|
||||||
|
|
||||||
|
/* WGL_ARB_create_context */
|
||||||
|
GET_PROC(wglCreateContextAttribsARB);
|
||||||
|
|
||||||
/* WGL_ARB_extensions_string */
|
/* WGL_ARB_extensions_string */
|
||||||
GET_PROC(wglGetExtensionsStringARB)
|
GET_PROC(wglGetExtensionsStringARB)
|
||||||
|
|
||||||
@ -400,6 +415,108 @@ static void test_dc(HWND hwnd, HDC hdc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_opengl3(HDC hdc)
|
||||||
|
{
|
||||||
|
/* Try to create a context using an invalid OpenGL version namely 0.x */
|
||||||
|
{
|
||||||
|
HGLRC gl3Ctx;
|
||||||
|
int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 0, 0};
|
||||||
|
|
||||||
|
gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs);
|
||||||
|
ok(gl3Ctx == 0, "wglCreateContextAttribs with major version=0 should fail!\n");
|
||||||
|
|
||||||
|
if(gl3Ctx)
|
||||||
|
wglDeleteContext(gl3Ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try to create a context compatible with OpenGL 1.x; 1.0-2.1 is allowed */
|
||||||
|
{
|
||||||
|
HGLRC gl3Ctx;
|
||||||
|
int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 1, 0};
|
||||||
|
|
||||||
|
gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs);
|
||||||
|
ok(gl3Ctx != 0, "pwglCreateContextAttribsARB for a 1.x context failed!\n");
|
||||||
|
wglDeleteContext(gl3Ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try to pass an invalid HDC */
|
||||||
|
{
|
||||||
|
HGLRC gl3Ctx;
|
||||||
|
DWORD error;
|
||||||
|
gl3Ctx = pwglCreateContextAttribsARB((HDC)0xdeadbeef, 0, 0);
|
||||||
|
ok(gl3Ctx == 0, "pwglCreateContextAttribsARB using an invalid HDC passed\n");
|
||||||
|
error = GetLastError();
|
||||||
|
ok(error == ERROR_DC_NOT_FOUND, "Expected ERROR_DC_NOT_FOUND, got error=%x\n", error);
|
||||||
|
wglDeleteContext(gl3Ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try to pass an invalid shareList */
|
||||||
|
{
|
||||||
|
HGLRC gl3Ctx;
|
||||||
|
DWORD error;
|
||||||
|
gl3Ctx = pwglCreateContextAttribsARB(hdc, (HGLRC)0xdeadbeef, 0);
|
||||||
|
ok(gl3Ctx == 0, "pwglCreateContextAttribsARB using an invalid shareList passed\n");
|
||||||
|
error = GetLastError();
|
||||||
|
ok(error == ERROR_INVALID_OPERATION, "Expected ERROR_INVALID_OPERATION, got error=%x\n", error);
|
||||||
|
wglDeleteContext(gl3Ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try to create an OpenGL 3.0 context */
|
||||||
|
{
|
||||||
|
int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0};
|
||||||
|
HGLRC gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs);
|
||||||
|
|
||||||
|
if(gl3Ctx == NULL)
|
||||||
|
{
|
||||||
|
skip("Skipping the rest of the WGL_ARB_create_context test due to lack of OpenGL 3.0\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wglDeleteContext(gl3Ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test matching an OpenGL 3.0 context with an older one, OpenGL 3.0 should allow it until the new object model is introduced in a future revision */
|
||||||
|
{
|
||||||
|
HGLRC glCtx = wglCreateContext(hdc);
|
||||||
|
|
||||||
|
int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0};
|
||||||
|
int attribs_future[] = {WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0};
|
||||||
|
|
||||||
|
HGLRC gl3Ctx = pwglCreateContextAttribsARB(hdc, glCtx, attribs);
|
||||||
|
ok(gl3Ctx != NULL, "Sharing of a display list between OpenGL 3.0 and OpenGL 1.x/2.x failed!\n");
|
||||||
|
if(gl3Ctx)
|
||||||
|
wglDeleteContext(gl3Ctx);
|
||||||
|
|
||||||
|
gl3Ctx = pwglCreateContextAttribsARB(hdc, glCtx, attribs_future);
|
||||||
|
ok(gl3Ctx != NULL, "Sharing of a display list between a forward compatible OpenGL 3.0 context and OpenGL 1.x/2.x failed!\n");
|
||||||
|
if(gl3Ctx)
|
||||||
|
wglDeleteContext(gl3Ctx);
|
||||||
|
|
||||||
|
if(glCtx)
|
||||||
|
wglDeleteContext(glCtx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try to create an OpenGL 3.0 context and test windowless rendering */
|
||||||
|
{
|
||||||
|
HGLRC gl3Ctx;
|
||||||
|
int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0};
|
||||||
|
BOOL res;
|
||||||
|
|
||||||
|
gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs);
|
||||||
|
ok(gl3Ctx != 0, "pwglCreateContextAttribsARB for a 3.0 context failed!\n");
|
||||||
|
|
||||||
|
/* OpenGL 3.0 allows offscreen rendering WITHOUT a drawable */
|
||||||
|
/* NOTE: Nvidia's 177.89 beta drivers don't allow this yet */
|
||||||
|
res = wglMakeCurrent(0, gl3Ctx);
|
||||||
|
ok(res == TRUE, "OpenGL 3.0 should allow windowless rendering, but the test failed!\n");
|
||||||
|
if(res)
|
||||||
|
wglMakeCurrent(0, 0);
|
||||||
|
|
||||||
|
if(gl3Ctx)
|
||||||
|
wglDeleteContext(gl3Ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(opengl)
|
START_TEST(opengl)
|
||||||
{
|
{
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
@ -477,6 +594,9 @@ START_TEST(opengl)
|
|||||||
wgl_extensions = pwglGetExtensionsStringARB(hdc);
|
wgl_extensions = pwglGetExtensionsStringARB(hdc);
|
||||||
if(wgl_extensions == NULL) skip("Skipping opengl32 tests because this OpenGL implementation doesn't support WGL extensions!\n");
|
if(wgl_extensions == NULL) skip("Skipping opengl32 tests because this OpenGL implementation doesn't support WGL extensions!\n");
|
||||||
|
|
||||||
|
if(strstr(wgl_extensions, "WGL_ARB_create_context"))
|
||||||
|
test_opengl3(hdc);
|
||||||
|
|
||||||
if(strstr(wgl_extensions, "WGL_ARB_make_current_read"))
|
if(strstr(wgl_extensions, "WGL_ARB_make_current_read"))
|
||||||
test_make_current_read(hdc);
|
test_make_current_read(hdc);
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user