Various pbuffer struct members aren't used, use_render_texture_emulation is always TRUE.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/opengl.c | 297 +++++++++++++++++++------------------- 1 file changed, 149 insertions(+), 148 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 532e3b20c3e..2c04aeedd4f 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -321,9 +321,6 @@ static void dump_PIXELFORMATDESCRIPTOR(const PIXELFORMATDESCRIPTOR *ppfd) { TRACE("\n"); }
-#define PUSH1(attribs,att) do { attribs[nAttribs++] = (att); } while (0) -#define PUSH2(attribs,att,value) do { attribs[nAttribs++] = (att); attribs[nAttribs++] = (value); } while(0) - /* GLX 1.0 */ static XVisualInfo* (*pglXChooseVisual)( Display *dpy, int screen, int *attribList ); static GLXContext (*pglXCreateContext)( Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct ); @@ -1986,195 +1983,199 @@ static struct wgl_context *X11DRV_wglCreateContextAttribsARB( HDC hdc, struct wg * * WGL_ARB_pbuffer: wglCreatePbufferARB */ -static struct wgl_pbuffer *X11DRV_wglCreatePbufferARB( HDC hdc, int iPixelFormat, int iWidth, int iHeight, - const int *piAttribList ) +static struct wgl_pbuffer *X11DRV_wglCreatePbufferARB( HDC hdc, int format, int width, int height, + const int *attribs ) { - struct wgl_pbuffer* object; + int glx_attribs[256], count = 0, value; const struct glx_pixel_format *fmt; - int attribs[256]; - int nAttribs = 0; + struct wgl_pbuffer *object;
- TRACE("(%p, %d, %d, %d, %p)\n", hdc, iPixelFormat, iWidth, iHeight, piAttribList); + TRACE( "(%p, %d, %d, %d, %p)\n", hdc, format, width, height, attribs );
/* Convert the WGL pixelformat to a GLX format, if it fails then the format is invalid */ - fmt = get_pixel_format(gdi_display, iPixelFormat, TRUE /* Offscreen */); - if(!fmt) { - ERR("(%p): invalid pixel format %d\n", hdc, iPixelFormat); - RtlSetLastWin32Error(ERROR_INVALID_PIXEL_FORMAT); + if (!(fmt = get_pixel_format( gdi_display, format, TRUE /* Offscreen */ ))) + { + ERR( "(%p): invalid pixel format %d\n", hdc, format ); + RtlSetLastWin32Error( ERROR_INVALID_PIXEL_FORMAT ); return NULL; }
- object = calloc( 1, sizeof(*object) ); - if (NULL == object) { - RtlSetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + if (!(object = calloc( 1, sizeof(*object) ))) + { + RtlSetLastWin32Error( ERROR_NO_SYSTEM_RESOURCES ); return NULL; } - object->width = iWidth; - object->height = iHeight; - object->pixel_format = iPixelFormat; + object->width = width; + object->height = height; + object->pixel_format = format; object->fmt = fmt;
- PUSH2(attribs, GLX_PBUFFER_WIDTH, iWidth); - PUSH2(attribs, GLX_PBUFFER_HEIGHT, iHeight); - while (piAttribList && 0 != *piAttribList) { - int attr_v; - switch (*piAttribList) { - case WGL_PBUFFER_LARGEST_ARB: { - ++piAttribList; - attr_v = *piAttribList; - TRACE("WGL_LARGEST_PBUFFER_ARB = %d\n", attr_v); - PUSH2(attribs, GLX_LARGEST_PBUFFER, attr_v); - break; + glx_attribs[count++] = GLX_PBUFFER_WIDTH; + glx_attribs[count++] = width; + glx_attribs[count++] = GLX_PBUFFER_HEIGHT; + glx_attribs[count++] = height; + + while (attribs && 0 != *attribs) + { + switch (*attribs) + { + case WGL_PBUFFER_LARGEST_ARB: + ++attribs; + value = *attribs; + TRACE( "WGL_LARGEST_PBUFFER_ARB = %d\n", value ); + glx_attribs[count++] = GLX_LARGEST_PBUFFER; + glx_attribs[count++] = value; + break; + + case WGL_TEXTURE_FORMAT_ARB: + ++attribs; + value = *attribs; + TRACE( "WGL_render_texture Attribute: WGL_TEXTURE_FORMAT_ARB as %x\n", value ); + if (WGL_NO_TEXTURE_ARB == value) + { + object->use_render_texture = 0; + } + else if (!use_render_texture_emulation) + { + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + goto create_failed; } + else switch (value) + { + case WGL_TEXTURE_RGB_ARB: + object->use_render_texture = GL_RGB; + object->texture_bpp = 3; + object->texture_format = GL_RGB; + object->texture_type = GL_UNSIGNED_BYTE; + break; + case WGL_TEXTURE_RGBA_ARB: + object->use_render_texture = GL_RGBA; + object->texture_bpp = 4; + object->texture_format = GL_RGBA; + object->texture_type = GL_UNSIGNED_BYTE; + break;
- case WGL_TEXTURE_FORMAT_ARB: { - ++piAttribList; - attr_v = *piAttribList; - TRACE("WGL_render_texture Attribute: WGL_TEXTURE_FORMAT_ARB as %x\n", attr_v); - if (WGL_NO_TEXTURE_ARB == attr_v) { - object->use_render_texture = 0; - } else { - if (!use_render_texture_emulation) { - RtlSetLastWin32Error(ERROR_INVALID_DATA); - goto create_failed; - } - switch (attr_v) { - case WGL_TEXTURE_RGB_ARB: - object->use_render_texture = GL_RGB; - object->texture_bpp = 3; - object->texture_format = GL_RGB; - object->texture_type = GL_UNSIGNED_BYTE; - break; - case WGL_TEXTURE_RGBA_ARB: - object->use_render_texture = GL_RGBA; - object->texture_bpp = 4; - object->texture_format = GL_RGBA; - object->texture_type = GL_UNSIGNED_BYTE; - break; - - /* WGL_FLOAT_COMPONENTS_NV */ - case WGL_TEXTURE_FLOAT_R_NV: - object->use_render_texture = GL_FLOAT_R_NV; - object->texture_bpp = 4; - object->texture_format = GL_RED; - object->texture_type = GL_FLOAT; - break; - case WGL_TEXTURE_FLOAT_RG_NV: - object->use_render_texture = GL_FLOAT_RG_NV; - object->texture_bpp = 8; - object->texture_format = GL_LUMINANCE_ALPHA; - object->texture_type = GL_FLOAT; - break; - case WGL_TEXTURE_FLOAT_RGB_NV: - object->use_render_texture = GL_FLOAT_RGB_NV; - object->texture_bpp = 12; - object->texture_format = GL_RGB; - object->texture_type = GL_FLOAT; - break; - case WGL_TEXTURE_FLOAT_RGBA_NV: - object->use_render_texture = GL_FLOAT_RGBA_NV; - object->texture_bpp = 16; - object->texture_format = GL_RGBA; - object->texture_type = GL_FLOAT; - break; - default: - ERR("Unknown texture format: %x\n", attr_v); - RtlSetLastWin32Error(ERROR_INVALID_DATA); - goto create_failed; - } - } + /* WGL_FLOAT_COMPONENTS_NV */ + case WGL_TEXTURE_FLOAT_R_NV: + object->use_render_texture = GL_FLOAT_R_NV; + object->texture_bpp = 4; + object->texture_format = GL_RED; + object->texture_type = GL_FLOAT; + break; + case WGL_TEXTURE_FLOAT_RG_NV: + object->use_render_texture = GL_FLOAT_RG_NV; + object->texture_bpp = 8; + object->texture_format = GL_LUMINANCE_ALPHA; + object->texture_type = GL_FLOAT; + break; + case WGL_TEXTURE_FLOAT_RGB_NV: + object->use_render_texture = GL_FLOAT_RGB_NV; + object->texture_bpp = 12; + object->texture_format = GL_RGB; + object->texture_type = GL_FLOAT; break; + case WGL_TEXTURE_FLOAT_RGBA_NV: + object->use_render_texture = GL_FLOAT_RGBA_NV; + object->texture_bpp = 16; + object->texture_format = GL_RGBA; + object->texture_type = GL_FLOAT; + break; + default: + ERR( "Unknown texture format: %x\n", value ); + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + goto create_failed; } + break;
- case WGL_TEXTURE_TARGET_ARB: { - ++piAttribList; - attr_v = *piAttribList; - TRACE("WGL_render_texture Attribute: WGL_TEXTURE_TARGET_ARB as %x\n", attr_v); - if (WGL_NO_TEXTURE_ARB == attr_v) { - object->texture_target = 0; - } else { - if (!use_render_texture_emulation) { - RtlSetLastWin32Error(ERROR_INVALID_DATA); - goto create_failed; - } - switch (attr_v) { - case WGL_TEXTURE_CUBE_MAP_ARB: { - if (iWidth != iHeight) { - RtlSetLastWin32Error(ERROR_INVALID_DATA); - goto create_failed; - } - object->texture_target = GL_TEXTURE_CUBE_MAP; - object->texture_bind_target = GL_TEXTURE_BINDING_CUBE_MAP; - break; - } - case WGL_TEXTURE_1D_ARB: { - if (1 != iHeight) { - RtlSetLastWin32Error(ERROR_INVALID_DATA); - goto create_failed; - } - object->texture_target = GL_TEXTURE_1D; - object->texture_bind_target = GL_TEXTURE_BINDING_1D; - break; - } - case WGL_TEXTURE_2D_ARB: { - object->texture_target = GL_TEXTURE_2D; - object->texture_bind_target = GL_TEXTURE_BINDING_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); - RtlSetLastWin32Error(ERROR_INVALID_DATA); - goto create_failed; - } + case WGL_TEXTURE_TARGET_ARB: + ++attribs; + value = *attribs; + TRACE( "WGL_render_texture Attribute: WGL_TEXTURE_TARGET_ARB as %x\n", value ); + if (WGL_NO_TEXTURE_ARB == value) + { + object->texture_target = 0; + } + else if (!use_render_texture_emulation) + { + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + goto create_failed; + } + else switch (value) + { + case WGL_TEXTURE_CUBE_MAP_ARB: + if (width != height) + { + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + goto create_failed; } + object->texture_target = GL_TEXTURE_CUBE_MAP; + object->texture_bind_target = GL_TEXTURE_BINDING_CUBE_MAP; break; - } - - case WGL_MIPMAP_TEXTURE_ARB: { - ++piAttribList; - attr_v = *piAttribList; - TRACE("WGL_render_texture Attribute: WGL_MIPMAP_TEXTURE_ARB as %x\n", attr_v); - if (!use_render_texture_emulation) { - RtlSetLastWin32Error(ERROR_INVALID_DATA); + case WGL_TEXTURE_1D_ARB: + if (1 != height) + { + RtlSetLastWin32Error( ERROR_INVALID_DATA ); goto create_failed; } + object->texture_target = GL_TEXTURE_1D; + object->texture_bind_target = GL_TEXTURE_BINDING_1D; + break; + case WGL_TEXTURE_2D_ARB: + object->texture_target = GL_TEXTURE_2D; + object->texture_bind_target = GL_TEXTURE_BINDING_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", value ); + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + goto create_failed; } + break; + + case WGL_MIPMAP_TEXTURE_ARB: + ++attribs; + value = *attribs; + TRACE( "WGL_render_texture Attribute: WGL_MIPMAP_TEXTURE_ARB as %x\n", value ); + if (!use_render_texture_emulation) + { + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + goto create_failed; + } + break; } - ++piAttribList; + ++attribs; } + glx_attribs[count++] = 0;
- PUSH1(attribs, None); if (!(object->gl = calloc( 1, sizeof(*object->gl) ))) { - RtlSetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + RtlSetLastWin32Error( ERROR_NO_SYSTEM_RESOURCES ); goto create_failed; } object->gl->type = DC_GL_PBUFFER; object->gl->format = object->fmt; object->gl->ref = 1;
- object->gl->drawable = pglXCreatePbuffer(gdi_display, fmt->fbconfig, attribs); - TRACE("new Pbuffer drawable as %p (%lx)\n", object->gl, object->gl->drawable); - if (!object->gl->drawable) { + object->gl->drawable = pglXCreatePbuffer( gdi_display, fmt->fbconfig, glx_attribs ); + TRACE( "new Pbuffer drawable as %p (%lx)\n", object->gl, object->gl->drawable ); + if (!object->gl->drawable) + { free( object->gl ); - RtlSetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + RtlSetLastWin32Error( ERROR_NO_SYSTEM_RESOURCES ); goto create_failed; /* unexpected error */ } pthread_mutex_lock( &context_mutex ); list_add_head( &pbuffer_list, &object->entry ); pthread_mutex_unlock( &context_mutex ); - TRACE("->(%p)\n", object); + TRACE( "->(%p)\n", object ); return object;
create_failed: free( object ); - TRACE("->(FAILED)\n"); + TRACE( "->(FAILED)\n" ); return NULL; }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/opengl.c | 134 ++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 72 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 2c04aeedd4f..ad318fed0e9 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -2236,85 +2236,75 @@ static HDC X11DRV_wglGetPbufferDCARB( struct wgl_pbuffer *object ) * * WGL_ARB_pbuffer: wglQueryPbufferARB */ -static BOOL X11DRV_wglQueryPbufferARB( struct wgl_pbuffer *object, int iAttribute, int *piValue ) +static BOOL X11DRV_wglQueryPbufferARB( struct wgl_pbuffer *object, int attrib, int *value ) { - TRACE("(%p, 0x%x, %p)\n", object, iAttribute, piValue); + TRACE( "(%p, 0x%x, %p)\n", object, attrib, value );
- switch (iAttribute) { - case WGL_PBUFFER_WIDTH_ARB: - pglXQueryDrawable(gdi_display, object->gl->drawable, GLX_WIDTH, (unsigned int*) piValue); - break; - case WGL_PBUFFER_HEIGHT_ARB: - pglXQueryDrawable(gdi_display, object->gl->drawable, GLX_HEIGHT, (unsigned int*) piValue); - break; + switch (attrib) + { + case WGL_PBUFFER_WIDTH_ARB: + pglXQueryDrawable( gdi_display, object->gl->drawable, GLX_WIDTH, (unsigned int *)value ); + break; + case WGL_PBUFFER_HEIGHT_ARB: + pglXQueryDrawable( gdi_display, object->gl->drawable, GLX_HEIGHT, (unsigned int *)value ); + break;
- case WGL_PBUFFER_LOST_ARB: - /* GLX Pbuffers cannot be lost by default. We can support this by - * setting GLX_PRESERVED_CONTENTS to False and using glXSelectEvent - * to receive pixel buffer clobber events, however that may or may - * not give any benefit */ - *piValue = GL_FALSE; - break; + case WGL_PBUFFER_LOST_ARB: + /* GLX Pbuffers cannot be lost by default. We can support this by + * setting GLX_PRESERVED_CONTENTS to False and using glXSelectEvent + * to receive pixel buffer clobber events, however that may or may + * not give any benefit */ + *value = GL_FALSE; + break;
- case WGL_TEXTURE_FORMAT_ARB: - if (!object->use_render_texture) { - *piValue = WGL_NO_TEXTURE_ARB; - } else { - if (!use_render_texture_emulation) { - RtlSetLastWin32Error(ERROR_INVALID_HANDLE); - return GL_FALSE; - } - 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); - } - } - break; + case WGL_TEXTURE_FORMAT_ARB: + if (!object->use_render_texture) + { + *value = WGL_NO_TEXTURE_ARB; + } + else if (!use_render_texture_emulation) + { + RtlSetLastWin32Error( ERROR_INVALID_HANDLE ); + return GL_FALSE; + } + else switch (object->use_render_texture) + { + case GL_RGB: *value = WGL_TEXTURE_RGB_ARB; break; + case GL_RGBA: *value = WGL_TEXTURE_RGBA_ARB; break; + /* WGL_FLOAT_COMPONENTS_NV */ + case GL_FLOAT_R_NV: *value = WGL_TEXTURE_FLOAT_R_NV; break; + case GL_FLOAT_RG_NV: *value = WGL_TEXTURE_FLOAT_RG_NV; break; + case GL_FLOAT_RGB_NV: *value = WGL_TEXTURE_FLOAT_RGB_NV; break; + case GL_FLOAT_RGBA_NV: *value = WGL_TEXTURE_FLOAT_RGBA_NV; break; + default: ERR( "Unknown texture format: %x\n", object->use_render_texture ); + } + break;
- case WGL_TEXTURE_TARGET_ARB: - if (!object->texture_target){ - *piValue = WGL_NO_TEXTURE_ARB; - } else { - if (!use_render_texture_emulation) { - RtlSetLastWin32Error(ERROR_INVALID_DATA); - return GL_FALSE; - } - switch (object->texture_target) { - 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; - } - } - break; + case WGL_TEXTURE_TARGET_ARB: + if (!object->texture_target) + { + *value = WGL_NO_TEXTURE_ARB; + } + else if (!use_render_texture_emulation) + { + RtlSetLastWin32Error( ERROR_INVALID_DATA ); + return GL_FALSE; + } + else switch (object->texture_target) + { + case GL_TEXTURE_1D: *value = WGL_TEXTURE_1D_ARB; break; + case GL_TEXTURE_2D: *value = WGL_TEXTURE_2D_ARB; break; + case GL_TEXTURE_CUBE_MAP: *value = WGL_TEXTURE_CUBE_MAP_ARB; break; + case GL_TEXTURE_RECTANGLE_NV: *value = WGL_TEXTURE_RECTANGLE_NV; break; + } + break;
- case WGL_MIPMAP_TEXTURE_ARB: - *piValue = GL_FALSE; /** don't support that */ - FIXME("unsupported WGL_ARB_render_texture attribute query for 0x%x\n", iAttribute); - break; + case WGL_MIPMAP_TEXTURE_ARB: + *value = GL_FALSE; /** don't support that */ + FIXME( "unsupported WGL_ARB_render_texture attribute query for 0x%x\n", attrib ); + break;
- default: - FIXME("unexpected attribute %x\n", iAttribute); - break; + default: FIXME( "unexpected attribute %x\n", attrib ); break; }
return GL_TRUE;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/opengl.c | 72 +++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 36 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index ad318fed0e9..e3f0f9fdac1 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -2363,6 +2363,10 @@ static BOOL X11DRV_wglSetPbufferAttribARB( struct wgl_pbuffer *object, const int */ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer ) { + static BOOL initialized = FALSE; + int prev_binded_texture = 0; + GLXContext prev_context; + GLXDrawable prev_drawable; GLboolean ret = GL_FALSE;
TRACE("(%p, %d)\n", object, iBuffer); @@ -2372,48 +2376,44 @@ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer ) return GL_FALSE; }
- if (use_render_texture_emulation) { - static BOOL initialized = FALSE; - int prev_binded_texture = 0; - GLXContext prev_context; - GLXDrawable prev_drawable; - - prev_context = pglXGetCurrentContext(); - prev_drawable = pglXGetCurrentDrawable(); - - /* Our render_texture emulation is basic and lacks some features (1D/Cube support). - This is mostly due to lack of demos/games using them. Further the use of glReadPixels - isn't ideal performance wise but I wasn't able to get other ways working. - */ - if(!initialized) { - initialized = TRUE; /* Only show the FIXME once for performance reasons */ - FIXME("partial stub!\n"); - } + if (!use_render_texture_emulation) return ret;
- TRACE("drawable=%p (%lx), context=%p\n", object->gl, object->gl->drawable, prev_context); - if (!object->tmp_context || object->prev_context != prev_context) { - if (object->tmp_context) - pglXDestroyContext(gdi_display, object->tmp_context); - object->tmp_context = pglXCreateNewContext(gdi_display, object->fmt->fbconfig, object->fmt->render_type, prev_context, True); - object->prev_context = prev_context; - } + prev_context = pglXGetCurrentContext(); + prev_drawable = pglXGetCurrentDrawable();
- opengl_funcs.p_glGetIntegerv(object->texture_bind_target, &prev_binded_texture); + /* Our render_texture emulation is basic and lacks some features (1D/Cube support). + This is mostly due to lack of demos/games using them. Further the use of glReadPixels + isn't ideal performance wise but I wasn't able to get other ways working. + */ + if (!initialized) + { + initialized = TRUE; /* Only show the FIXME once for performance reasons */ + FIXME( "partial stub!\n" ); + }
- /* Switch to our pbuffer */ - pglXMakeCurrent(gdi_display, object->gl->drawable, object->tmp_context); + TRACE( "drawable=%p (%lx), context=%p\n", object->gl, object->gl->drawable, prev_context ); + if (!object->tmp_context || object->prev_context != prev_context) + { + if (object->tmp_context) pglXDestroyContext( gdi_display, object->tmp_context ); + object->tmp_context = pglXCreateNewContext( gdi_display, object->fmt->fbconfig, + object->fmt->render_type, prev_context, True ); + object->prev_context = prev_context; + }
- /* Make sure that the prev_binded_texture is set as the current texture state isn't shared between contexts. - * After that copy the pbuffer texture data. */ - opengl_funcs.p_glBindTexture(object->texture_target, prev_binded_texture); - opengl_funcs.p_glCopyTexImage2D(object->texture_target, 0, object->use_render_texture, 0, 0, object->width, object->height, 0); + opengl_funcs.p_glGetIntegerv( object->texture_bind_target, &prev_binded_texture );
- /* Switch back to the original drawable and context */ - pglXMakeCurrent(gdi_display, prev_drawable, prev_context); - return GL_TRUE; - } + /* Switch to our pbuffer */ + pglXMakeCurrent( gdi_display, object->gl->drawable, object->tmp_context );
- return ret; + /* Make sure that the prev_binded_texture is set as the current texture state isn't shared + * between contexts. After that copy the pbuffer texture data. */ + opengl_funcs.p_glBindTexture( object->texture_target, prev_binded_texture ); + opengl_funcs.p_glCopyTexImage2D( object->texture_target, 0, object->use_render_texture, 0, 0, + object->width, object->height, 0 ); + + /* Switch back to the original drawable and context */ + pglXMakeCurrent( gdi_display, prev_drawable, prev_context ); + return GL_TRUE; }
/**
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/opengl.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index e3f0f9fdac1..6134493fb77 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -245,7 +245,6 @@ struct wgl_pbuffer int pixel_format; int* attribList; int use_render_texture; /* This is also the internal texture format */ - int texture_bind_target; int texture_bpp; GLint texture_format; GLuint texture_target; @@ -2109,7 +2108,6 @@ static struct wgl_pbuffer *X11DRV_wglCreatePbufferARB( HDC hdc, int format, int goto create_failed; } object->texture_target = GL_TEXTURE_CUBE_MAP; - object->texture_bind_target = GL_TEXTURE_BINDING_CUBE_MAP; break; case WGL_TEXTURE_1D_ARB: if (1 != height) @@ -2118,15 +2116,12 @@ static struct wgl_pbuffer *X11DRV_wglCreatePbufferARB( HDC hdc, int format, int goto create_failed; } object->texture_target = GL_TEXTURE_1D; - object->texture_bind_target = GL_TEXTURE_BINDING_1D; break; case WGL_TEXTURE_2D_ARB: object->texture_target = GL_TEXTURE_2D; - object->texture_bind_target = GL_TEXTURE_BINDING_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", value ); @@ -2356,6 +2351,19 @@ static BOOL X11DRV_wglSetPbufferAttribARB( struct wgl_pbuffer *object, const int return ret; }
+static GLenum binding_from_target( GLenum target ) +{ + switch (target) + { + case GL_TEXTURE_CUBE_MAP: return GL_TEXTURE_BINDING_CUBE_MAP; + case GL_TEXTURE_1D: return GL_TEXTURE_BINDING_1D; + case GL_TEXTURE_2D: return GL_TEXTURE_BINDING_2D; + case GL_TEXTURE_RECTANGLE_NV: return GL_TEXTURE_BINDING_RECTANGLE_NV; + } + FIXME( "Unsupported target %#x\n", target ); + return 0; +} + /** * X11DRV_wglBindTexImageARB * @@ -2400,7 +2408,7 @@ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer ) object->prev_context = prev_context; }
- opengl_funcs.p_glGetIntegerv( object->texture_bind_target, &prev_binded_texture ); + opengl_funcs.p_glGetIntegerv( binding_from_target( object->texture_target ), &prev_binded_texture );
/* Switch to our pbuffer */ pglXMakeCurrent( gdi_display, object->gl->drawable, object->tmp_context );
From: Rémi Bernon rbernon@codeweavers.com
Various pbuffer struct members aren't used, use_render_texture_emulation is always TRUE. --- dlls/winex11.drv/opengl.c | 131 +++++++++----------------------------- 1 file changed, 30 insertions(+), 101 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 6134493fb77..a4c41e1289b 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -243,14 +243,8 @@ struct wgl_pbuffer int width; int height; int pixel_format; - int* attribList; - int use_render_texture; /* This is also the internal texture format */ - int texture_bpp; GLint texture_format; GLuint texture_target; - GLenum texture_type; - GLuint texture; - int texture_level; GLXContext tmp_context; GLXContext prev_context; struct list entry; @@ -273,7 +267,6 @@ static struct list context_list = LIST_INIT( context_list ); static struct list pbuffer_list = LIST_INIT( pbuffer_list ); static struct glx_pixel_format *pixel_formats; static int nb_pixel_formats, nb_onscreen_formats; -static BOOL use_render_texture_emulation = TRUE;
/* Selects the preferred GLX swap control method for use by wglSwapIntervalEXT */ static enum glx_swap_control_method swap_control_method = GLX_SWAP_CONTROL_NONE; @@ -1535,8 +1528,7 @@ static int describe_pixel_format( int iPixelFormat, struct wgl_pixel_format *pf if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT, &value )) value = -1; pf->framebuffer_srgb_capable = value;
- pf->bind_to_texture_rgb = pf->bind_to_texture_rgba = - use_render_texture_emulation && render_type != GLX_COLOR_INDEX_BIT && (drawable_type & GLX_PBUFFER_BIT); + pf->bind_to_texture_rgb = pf->bind_to_texture_rgba = render_type != GLX_COLOR_INDEX_BIT && (drawable_type & GLX_PBUFFER_BIT); pf->bind_to_texture_rectangle_rgb = pf->bind_to_texture_rectangle_rgba = GL_FALSE;
if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_FLOAT_COMPONENTS_NV, &value )) value = -1; @@ -2030,54 +2022,29 @@ static struct wgl_pbuffer *X11DRV_wglCreatePbufferARB( HDC hdc, int format, int ++attribs; value = *attribs; TRACE( "WGL_render_texture Attribute: WGL_TEXTURE_FORMAT_ARB as %x\n", value ); - if (WGL_NO_TEXTURE_ARB == value) - { - object->use_render_texture = 0; - } - else if (!use_render_texture_emulation) - { - RtlSetLastWin32Error( ERROR_INVALID_DATA ); - goto create_failed; - } - else switch (value) + switch (value) { + case WGL_NO_TEXTURE_ARB: + object->texture_format = 0; + break; case WGL_TEXTURE_RGB_ARB: - object->use_render_texture = GL_RGB; - object->texture_bpp = 3; object->texture_format = GL_RGB; - object->texture_type = GL_UNSIGNED_BYTE; break; case WGL_TEXTURE_RGBA_ARB: - object->use_render_texture = GL_RGBA; - object->texture_bpp = 4; object->texture_format = GL_RGBA; - object->texture_type = GL_UNSIGNED_BYTE; break; - /* WGL_FLOAT_COMPONENTS_NV */ case WGL_TEXTURE_FLOAT_R_NV: - object->use_render_texture = GL_FLOAT_R_NV; - object->texture_bpp = 4; - object->texture_format = GL_RED; - object->texture_type = GL_FLOAT; + object->texture_format = GL_FLOAT_R_NV; break; case WGL_TEXTURE_FLOAT_RG_NV: - object->use_render_texture = GL_FLOAT_RG_NV; - object->texture_bpp = 8; - object->texture_format = GL_LUMINANCE_ALPHA; - object->texture_type = GL_FLOAT; + object->texture_format = GL_FLOAT_RG_NV; break; case WGL_TEXTURE_FLOAT_RGB_NV: - object->use_render_texture = GL_FLOAT_RGB_NV; - object->texture_bpp = 12; - object->texture_format = GL_RGB; - object->texture_type = GL_FLOAT; + object->texture_format = GL_FLOAT_RGB_NV; break; case WGL_TEXTURE_FLOAT_RGBA_NV: - object->use_render_texture = GL_FLOAT_RGBA_NV; - object->texture_bpp = 16; - object->texture_format = GL_RGBA; - object->texture_type = GL_FLOAT; + object->texture_format = GL_FLOAT_RGBA_NV; break; default: ERR( "Unknown texture format: %x\n", value ); @@ -2090,17 +2057,11 @@ static struct wgl_pbuffer *X11DRV_wglCreatePbufferARB( HDC hdc, int format, int ++attribs; value = *attribs; TRACE( "WGL_render_texture Attribute: WGL_TEXTURE_TARGET_ARB as %x\n", value ); - if (WGL_NO_TEXTURE_ARB == value) + switch (value) { + case WGL_NO_TEXTURE_ARB: object->texture_target = 0; - } - else if (!use_render_texture_emulation) - { - RtlSetLastWin32Error( ERROR_INVALID_DATA ); - goto create_failed; - } - else switch (value) - { + break; case WGL_TEXTURE_CUBE_MAP_ARB: if (width != height) { @@ -2134,11 +2095,6 @@ static struct wgl_pbuffer *X11DRV_wglCreatePbufferARB( HDC hdc, int format, int ++attribs; value = *attribs; TRACE( "WGL_render_texture Attribute: WGL_MIPMAP_TEXTURE_ARB as %x\n", value ); - if (!use_render_texture_emulation) - { - RtlSetLastWin32Error( ERROR_INVALID_DATA ); - goto create_failed; - } break; } ++attribs; @@ -2253,17 +2209,9 @@ static BOOL X11DRV_wglQueryPbufferARB( struct wgl_pbuffer *object, int attrib, i break;
case WGL_TEXTURE_FORMAT_ARB: - if (!object->use_render_texture) - { - *value = WGL_NO_TEXTURE_ARB; - } - else if (!use_render_texture_emulation) - { - RtlSetLastWin32Error( ERROR_INVALID_HANDLE ); - return GL_FALSE; - } - else switch (object->use_render_texture) + switch (object->texture_format) { + case 0: *value = WGL_NO_TEXTURE_ARB; break; case GL_RGB: *value = WGL_TEXTURE_RGB_ARB; break; case GL_RGBA: *value = WGL_TEXTURE_RGBA_ARB; break; /* WGL_FLOAT_COMPONENTS_NV */ @@ -2271,22 +2219,14 @@ static BOOL X11DRV_wglQueryPbufferARB( struct wgl_pbuffer *object, int attrib, i case GL_FLOAT_RG_NV: *value = WGL_TEXTURE_FLOAT_RG_NV; break; case GL_FLOAT_RGB_NV: *value = WGL_TEXTURE_FLOAT_RGB_NV; break; case GL_FLOAT_RGBA_NV: *value = WGL_TEXTURE_FLOAT_RGBA_NV; break; - default: ERR( "Unknown texture format: %x\n", object->use_render_texture ); + default: ERR( "Unknown texture format: %x\n", object->texture_format ); } break;
case WGL_TEXTURE_TARGET_ARB: - if (!object->texture_target) - { - *value = WGL_NO_TEXTURE_ARB; - } - else if (!use_render_texture_emulation) - { - RtlSetLastWin32Error( ERROR_INVALID_DATA ); - return GL_FALSE; - } - else switch (object->texture_target) + switch (object->texture_target) { + case 0: *value = WGL_NO_TEXTURE_ARB; break; case GL_TEXTURE_1D: *value = WGL_TEXTURE_1D_ARB; break; case GL_TEXTURE_2D: *value = WGL_TEXTURE_2D_ARB; break; case GL_TEXTURE_CUBE_MAP: *value = WGL_TEXTURE_CUBE_MAP_ARB; break; @@ -2337,18 +2277,14 @@ static int X11DRV_wglReleasePbufferDCARB( struct wgl_pbuffer *object, HDC hdc ) */ static BOOL X11DRV_wglSetPbufferAttribARB( struct wgl_pbuffer *object, const int *piAttribList ) { - GLboolean ret = GL_FALSE; - WARN("(%p, %p): alpha-testing, report any problem\n", object, piAttribList);
- if (!object->use_render_texture) { - RtlSetLastWin32Error(ERROR_INVALID_HANDLE); + if (!object->texture_format) + { + RtlSetLastWin32Error( ERROR_INVALID_HANDLE ); return GL_FALSE; } - if (use_render_texture_emulation) { - return GL_TRUE; - } - return ret; + return GL_TRUE; }
static GLenum binding_from_target( GLenum target ) @@ -2375,17 +2311,15 @@ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer ) int prev_binded_texture = 0; GLXContext prev_context; GLXDrawable prev_drawable; - GLboolean ret = GL_FALSE;
TRACE("(%p, %d)\n", object, iBuffer);
- if (!object->use_render_texture) { - RtlSetLastWin32Error(ERROR_INVALID_HANDLE); + if (!object->texture_format) + { + RtlSetLastWin32Error( ERROR_INVALID_HANDLE ); return GL_FALSE; }
- if (!use_render_texture_emulation) return ret; - prev_context = pglXGetCurrentContext(); prev_drawable = pglXGetCurrentDrawable();
@@ -2416,7 +2350,7 @@ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer ) /* Make sure that the prev_binded_texture is set as the current texture state isn't shared * between contexts. After that copy the pbuffer texture data. */ opengl_funcs.p_glBindTexture( object->texture_target, prev_binded_texture ); - opengl_funcs.p_glCopyTexImage2D( object->texture_target, 0, object->use_render_texture, 0, 0, + opengl_funcs.p_glCopyTexImage2D( object->texture_target, 0, object->texture_format, 0, 0, object->width, object->height, 0 );
/* Switch back to the original drawable and context */ @@ -2431,18 +2365,14 @@ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer ) */ static BOOL X11DRV_wglReleaseTexImageARB( struct wgl_pbuffer *object, int iBuffer ) { - GLboolean ret = GL_FALSE; - TRACE("(%p, %d)\n", object, iBuffer);
- if (!object->use_render_texture) { - RtlSetLastWin32Error(ERROR_INVALID_HANDLE); + if (!object->texture_format) + { + RtlSetLastWin32Error( ERROR_INVALID_HANDLE ); return GL_FALSE; } - if (use_render_texture_emulation) { - return GL_TRUE; - } - return ret; + return GL_TRUE; }
/** @@ -2599,8 +2529,7 @@ static const char *x11drv_init_wgl_extensions(void) }
/* Support WGL_ARB_render_texture when there's support or pbuffer based emulation */ - if (has_extension( glxExtensions, "GLX_ARB_render_texture") || - (glxRequireVersion(3) && use_render_texture_emulation)) + if (has_extension( glxExtensions, "GLX_ARB_render_texture" ) || glxRequireVersion( 3 )) { register_extension( "WGL_ARB_render_texture" ); opengl_funcs.p_wglBindTexImageARB = X11DRV_wglBindTexImageARB;
That's what I was planning to do some time ago (but because I wasn't able to get a game working I didn't submit the patches)