Module: wine Branch: refs/heads/master Commit: 13268261bbe0d4013937a6a9804fbda378244512 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=13268261bbe0d4013937a6a9...
Author: Huw Davies huw@codeweavers.com Date: Thu Feb 2 13:23:55 2006 +0100
opengl: Sync a dibsection to its pixmap before drawing to it via opengl.
---
dlls/opengl32/opengl_ext.h | 3 ++- dlls/opengl32/wgl.c | 22 +++++++++++++++++++++- dlls/x11drv/init.c | 10 ++++++++-- dlls/x11drv/x11drv.h | 3 ++- 4 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/dlls/opengl32/opengl_ext.h b/dlls/opengl32/opengl_ext.h index 274f8d3..ad176c4 100644 --- a/dlls/opengl32/opengl_ext.h +++ b/dlls/opengl32/opengl_ext.h @@ -58,7 +58,8 @@ extern void (*wine_tsx11_lock_ptr)(void) extern void (*wine_tsx11_unlock_ptr)(void);
/* As GLX relies on X, this is needed */ -#define ENTER_GL() wine_tsx11_lock_ptr() +void enter_gl(void); +#define ENTER_GL() enter_gl() #define LEAVE_GL() wine_tsx11_unlock_ptr()
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index afb4c86..04eb40f 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -54,7 +54,8 @@ enum x11drv_escape_codes X11DRV_END_EXPOSURES, /* end graphics exposures */ X11DRV_GET_DCE, /* get the DCE pointer */ X11DRV_SET_DCE, /* set the DCE pointer */ - X11DRV_GET_GLX_DRAWABLE /* get current glx drawable for a DC */ + X11DRV_GET_GLX_DRAWABLE, /* get current glx drawable for a DC */ + X11DRV_SYNC_PIXMAP /* sync the dibsection to its pixmap */ };
void (*wine_tsx11_lock_ptr)(void) = NULL; @@ -88,6 +89,25 @@ static inline Wine_GLContext *get_contex return ret; }
+void enter_gl(void) +{ + GLXContext gl_ctx; + Wine_GLContext *ctx; + enum x11drv_escape_codes escape = X11DRV_SYNC_PIXMAP; + + wine_tsx11_lock_ptr(); + gl_ctx = glXGetCurrentContext(); + if(!gl_ctx) return; + ctx = get_context_from_GLXContext(gl_ctx); + wine_tsx11_unlock_ptr(); /* unlock before calling GDI apis */ + + if(ctx && GetObjectType(ctx->hdc) == OBJ_MEMDC) + ExtEscape(ctx->hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape, 0, NULL); + + wine_tsx11_lock_ptr(); + return; +} + static inline void free_context(Wine_GLContext *context) { if (context->next != NULL) context->next->prev = context->prev; diff --git a/dlls/x11drv/init.c b/dlls/x11drv/init.c index c2729b4..9774c6f 100644 --- a/dlls/x11drv/init.c +++ b/dlls/x11drv/init.c @@ -414,8 +414,6 @@ INT X11DRV_ExtEscape( X11DRV_PDEVICE *ph { if(!physDev->bitmap->glxpixmap) physDev->bitmap->glxpixmap = create_glxpixmap(physDev); - - X11DRV_CoerceDIBSection(physDev, DIB_Status_GdiMod, FALSE); *(Drawable *)out_data = physDev->bitmap->glxpixmap; } else @@ -423,6 +421,14 @@ INT X11DRV_ExtEscape( X11DRV_PDEVICE *ph return TRUE; } break; + case X11DRV_SYNC_PIXMAP: + if(physDev->bitmap) + { + X11DRV_CoerceDIBSection(physDev, DIB_Status_GdiMod, FALSE); + return TRUE; + } + return FALSE; + break; } } break; diff --git a/dlls/x11drv/x11drv.h b/dlls/x11drv/x11drv.h index 21b28d5..0339fad 100644 --- a/dlls/x11drv/x11drv.h +++ b/dlls/x11drv/x11drv.h @@ -480,7 +480,8 @@ enum x11drv_escape_codes X11DRV_END_EXPOSURES, /* end graphics exposures */ X11DRV_GET_DCE, /* get the DCE pointer */ X11DRV_SET_DCE, /* set the DCE pointer */ - X11DRV_GET_GLX_DRAWABLE /* get current glx drawable for a DC */ + X11DRV_GET_GLX_DRAWABLE, /* get current glx drawable for a DC */ + X11DRV_SYNC_PIXMAP /* sync the dibsection to its pixmap */ };
struct x11drv_escape_set_drawable