From f79ca75d082bbe7fa2e132da7576717312d4f0a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Thu, 8 Nov 2007 22:08:08 +0100 Subject: [PATCH] wined3d: Implement a detection for the MacOS OpenGL implementation. --- dlls/wined3d/directx.c | 32 ++++++++++++++++++++++++++++++++ include/wine/wined3d_gl.h | 17 +++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index cff6550f22f..65a5b2aba15 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -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); diff --git a/include/wine/wined3d_gl.h b/include/wine/wined3d_gl.h index 1c316e97344..254826ed856 100644 --- a/include/wine/wined3d_gl.h +++ b/include/wine/wined3d_gl.h @@ -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 \