wined3d: Implement a detection for the MacOS OpenGL implementation.

This commit is contained in:
Stefan Dösinger 2007-11-08 22:08:08 +01:00 committed by Alexandre Julliard
parent 8454cb17a8
commit f79ca75d08
2 changed files with 49 additions and 0 deletions

View File

@ -44,6 +44,8 @@ static const struct {
/* APPLE */
{"GL_APPLE_client_storage", APPLE_CLIENT_STORAGE},
{"GL_APPLE_fence", APPLE_FENCE},
{"GL_APPLE_flush_render", APPLE_FLUSH_RENDER},
{"GL_APPLE_ycbcr_422", APPLE_YCBCR_422},
/* ATI */
{"GL_ATI_separate_stencil", ATI_SEPARATE_STENCIL},
@ -2715,6 +2717,33 @@ ULONG WINAPI D3DCB_DefaultDestroyVolume(IWineD3DVolume *pVolume) {
return IUnknown_Release(volumeParent);
}
static BOOL implementation_is_apple(WineD3D_GL_Info *gl_info) {
/* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
* the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
* detect the Apple OpenGL implementation to apply some extension fixups afterwards.
*
* Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks
* aren't sufficient either because a Linux binary may display on a macos X server via remote X11.
* So try to detect the GL implementation by looking at certain Apple extensions. Some extensions
* like client storage might be supported on other implementations too, but GL_APPLE_flush_render
* is specific to the MacOS window management, and GL_APPLE_ycbcr_422 is a Quicktime specific, so
* it the chance that other implementations support it is rather rare since Win32 Quicktime uses
* DirectDraw, not OpenGL.
*/
if(gl_info->supported[APPLE_FENCE] &&
gl_info->supported[APPLE_CLIENT_STORAGE] &&
gl_info->supported[APPLE_FLUSH_RENDER] &&
gl_info->supported[APPLE_YCBCR_422]) {
TRACE_(d3d_caps)("GL_APPLE_fence, GL_APPLE_client_storage, GL_APPLE_flush_render and GL_ycbcr_422 are supported\n");
TRACE_(d3d_caps)("Activating MacOS fixups\n");
return TRUE;
} else {
TRACE_(d3d_caps)("Apple extensions are not supported\n");
TRACE_(d3d_caps)("Not activating MacOS fixups\n");
return FALSE;
}
}
#define PUSH1(att) attribs[nAttribs++] = (att);
#define GLINFO_LOCATION (Adapters[0].gl_info)
BOOL InitAdapters(void) {
@ -2769,6 +2798,7 @@ BOOL InitAdapters(void) {
int attribute;
DISPLAY_DEVICEW DisplayDevice;
HDC hdc;
BOOL apple;
TRACE("Initializing default adapter\n");
Adapters[0].monitorPoint.x = -1;
@ -2853,6 +2883,8 @@ BOOL InitAdapters(void) {
}
WineD3D_ReleaseFakeGLContext();
apple = implementation_is_apple(&Adapters[0].gl_info);
select_shader_mode(&Adapters[0].gl_info, WINED3DDEVTYPE_HAL, &ps_selected_mode, &vs_selected_mode);
select_shader_max_constants(ps_selected_mode, vs_selected_mode, &Adapters[0].gl_info);

View File

@ -2854,6 +2854,18 @@ typedef int (WINE_GLAPI * PGLXFNWAITVIDEOSYNCSGIPROC) (int, int, unsigned int *)
#define GL_DEPTH_CLAMP_NV 0x864F
#endif
/* GL_APPLE_flush_render */
typedef void (WINE_GLAPI * PGLFNFLUSHRENDERAPPLEPROC) (void);
typedef void (WINE_GLAPI * PGLFNFINISHRENDERAPPLEPROC) (void);
/* GL_APPLE_ycbcr_422 */
#ifndef GL_APPLE_ycbcr_422
#define GL_APPLE_ycbcr_422
#define GL_YCBCR_422_APPLE 0x85B9
#define UNSIGNED_SHORT_8_8_APPLE 0x85BA
#define UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB
#endif
/* GL_VERSION_2_0 */
#ifndef GL_VERSION_2_0
#define GL_VERSION_2_0 1
@ -3206,6 +3218,8 @@ typedef enum _GL_SupportedExt {
/* APPLE */
APPLE_FENCE,
APPLE_CLIENT_STORAGE,
APPLE_FLUSH_RENDER,
APPLE_YCBCR_422,
/* SGI */
SGI_VIDEO_SYNC,
SGIS_GENERATE_MIPMAP,
@ -3488,6 +3502,9 @@ typedef enum _GL_SupportedExt {
/* GLX_SGI_video_sync */ \
USE_GL_FUNC(PGLXFNGETVIDEOSYNCSGIPROC, glXGetVideoSyncSGI); \
USE_GL_FUNC(PGLXFNWAITVIDEOSYNCSGIPROC, glXWaitVideoSyncSGI); \
/* GL_APPLE_flush_render */ \
USE_GL_FUNC(PGLFNFLUSHRENDERAPPLEPROC, glFlushRenderApple); \
USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC, glFinishRenderApple); \
/* OpenGL 2.0 functions */
#define GL2_FUNCS_GEN \