From 8873478e052fb186c252de1b6e9cb84d8c72fadd Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Fri, 27 Jul 2007 15:01:52 +0200 Subject: [PATCH] wgl: Add WGL_NV_float_buffer and WGL_NV_texture_rectangle support. --- dlls/winex11.drv/opengl.c | 76 ++++++++++++++++++++++++++++++++++++--- include/wine/wgl.h | 40 +++++++++++++++++++++ 2 files changed, 111 insertions(+), 5 deletions(-) diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index db9eb4400ec..89238ef6dc9 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -759,9 +759,17 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, Wine_GLPBuf } } break ; - + case WGL_FLOAT_COMPONENTS_NV: + pop = iWGLAttr[++cur]; + PUSH2(oGLXAttr, GLX_FLOAT_COMPONENTS_NV, pop); + TRACE("pAttr[%d] = GLX_FLOAT_COMPONENTS_NV: %x\n", cur, pop); + break ; case WGL_BIND_TO_TEXTURE_RGB_ARB: case WGL_BIND_TO_TEXTURE_RGBA_ARB: + case WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV: + case WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV: + case WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV: + case WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV: pop = iWGLAttr[++cur]; /** cannot be converted, see direct handling on * - wglGetPixelFormatAttribivARB @@ -2023,7 +2031,22 @@ static HPBUFFERARB WINAPI X11DRV_wglCreatePbufferARB(HDC hdc, int iPixelFormat, case WGL_TEXTURE_RGBA_ARB: object->use_render_texture = GL_RGBA; break; + + /* WGL_FLOAT_COMPONENTS_NV */ + case WGL_TEXTURE_FLOAT_R_NV: + object->use_render_texture = GL_FLOAT_R_NV; + break; + case WGL_TEXTURE_FLOAT_RG_NV: + object->use_render_texture = GL_FLOAT_RG_NV; + break; + case WGL_TEXTURE_FLOAT_RGB_NV: + object->use_render_texture = GL_FLOAT_RGB_NV; + break; + case WGL_TEXTURE_FLOAT_RGBA_NV: + object->use_render_texture = GL_FLOAT_RGBA_NV; + break; default: + ERR("Unknown texture format: %x\n", attr_v); SetLastError(ERROR_INVALID_DATA); goto create_failed; } @@ -2080,7 +2103,13 @@ static HPBUFFERARB WINAPI X11DRV_wglCreatePbufferARB(HDC hdc, int iPixelFormat, object->texture_bind_target = GL_TEXTURE_2D; break; } + case WGL_TEXTURE_RECTANGLE_NV: { + object->texture_target = GL_TEXTURE_RECTANGLE_NV; + object->texture_bind_target = GL_TEXTURE_BINDING_RECTANGLE_NV; + break; + } default: + ERR("Unknown texture target: %x\n", attr_v); SetLastError(ERROR_INVALID_DATA); goto create_failed; } @@ -2212,10 +2241,28 @@ static GLboolean WINAPI X11DRV_wglQueryPbufferARB(HPBUFFERARB hPbuffer, int iAtt SetLastError(ERROR_INVALID_HANDLE); return GL_FALSE; } - if (GL_RGBA == object->use_render_texture) { - *piValue = WGL_TEXTURE_RGBA_ARB; - } else { - *piValue = WGL_TEXTURE_RGB_ARB; + switch(object->use_render_texture) { + case GL_RGB: + *piValue = WGL_TEXTURE_RGB_ARB; + break; + case GL_RGBA: + *piValue = WGL_TEXTURE_RGBA_ARB; + break; + /* WGL_FLOAT_COMPONENTS_NV */ + case GL_FLOAT_R_NV: + *piValue = WGL_TEXTURE_FLOAT_R_NV; + break; + case GL_FLOAT_RG_NV: + *piValue = WGL_TEXTURE_FLOAT_RG_NV; + break; + case GL_FLOAT_RGB_NV: + *piValue = WGL_TEXTURE_FLOAT_RGB_NV; + break; + case GL_FLOAT_RGBA_NV: + *piValue = WGL_TEXTURE_FLOAT_RGBA_NV; + break; + default: + ERR("Unknown texture format: %x\n", object->use_render_texture); } } } @@ -2245,6 +2292,7 @@ static GLboolean WINAPI X11DRV_wglQueryPbufferARB(HPBUFFERARB hPbuffer, int iAtt case GL_TEXTURE_1D: *piValue = WGL_TEXTURE_1D_ARB; break; case GL_TEXTURE_2D: *piValue = WGL_TEXTURE_2D_ARB; break; case GL_TEXTURE_CUBE_MAP: *piValue = WGL_TEXTURE_CUBE_MAP_ARB; break; + case GL_TEXTURE_RECTANGLE_NV: *piValue = WGL_TEXTURE_RECTANGLE_NV; break; } } } @@ -2792,6 +2840,14 @@ static BOOL glxRequireExtension(const char *requiredExtension) return TRUE; } +static void register_extension_string(const char *ext) +{ + strcat(WineGLInfo.wglExtensions, " "); + strcat(WineGLInfo.wglExtensions, ext); + + TRACE("'%s'\n", ext); +} + static BOOL register_extension(const WineGLExtension * ext) { int i; @@ -2944,8 +3000,18 @@ static void X11DRV_WineGL_LoadExtensions(void) if (glxRequireExtension("GLX_ATI_render_texture") || glxRequireExtension("GLX_ARB_render_texture") || (glxRequireVersion(3) && glxRequireExtension("GLX_SGIX_pbuffer") && use_render_texture_emulation)) + { register_extension(&WGL_ARB_render_texture); + /* The WGL version of GLX_NV_float_buffer requires render_texture */ + if(glxRequireExtension("GLX_NV_float_buffer")) + register_extension_string("WGL_NV_float_buffer"); + + /* Again there's no GLX equivalent for this extension, so depend on the required GL extension */ + if(strstr(WineGLInfo.glExtensions, "GL_NV_texture_rectangle") != NULL) + register_extension_string("WGL_NV_texture_rectangle"); + } + /* EXT Extensions */ register_extension(&WGL_EXT_extensions_string); diff --git a/include/wine/wgl.h b/include/wine/wgl.h index e191407148f..14dfa42286c 100644 --- a/include/wine/wgl.h +++ b/include/wine/wgl.h @@ -139,6 +139,44 @@ #define WGL_AUX8_ARB 0x208F #define WGL_AUX9_ARB 0x2090 +/** WGL_NV_render_texture_rectangle */ +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 +#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 +/** WGL_NV_render_depth_texture */ +#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 +#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 +#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 +#define WGL_DEPTH_COMPONENT_NV 0x20A7 +/** WGL_NV_float_buffer */ +#define WGL_FLOAT_COMPONENTS_NV 0x20B0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 +#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 +#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 +#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 +#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 +/** GL_NV_float_buffer */ +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E + + /** * WGL_ATI_pixel_format_float / WGL_ARB_color_buffer_float */ @@ -189,3 +227,5 @@ #define GLX_AUX9_ATI 0x9820 #define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 #define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 +/** GLX_NV_float_buffer */ +#define GLX_FLOAT_COMPONENTS_NV 0x20B0