From 556adfa6b90f4c1ef12635cf78fa0bba046cf123 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 10 Feb 2012 12:54:44 +0000 Subject: [PATCH] Fixup glx support Renaming glamor_priv->dispatch and wrapping the access to the dispatch table with a function that also ensured the context was bound. dispatch = glamor_get_dispatch(glamor_priv); ... glamor_put_dispatch(glamor_priv); So that we catch all places where we attempt to call into GL withouta context. As an optimisation we can then do glamor_get_context(); glamor_put_context() around the rendering entry points to reduce the frequency of having to restore the old context. (Along with allowing the context to be recursively acquired and making the old context part of the glamor_egl state.) Reviewed-by: Zhigang Gong Signed-off-by: Zhigang Gong --- glamor/glamor.c | 21 ++++++----- glamor/glamor.h | 24 ++++++------- glamor/glamor_addtraps.c | 4 --- glamor/glamor_copyarea.c | 47 +++++++++++-------------- glamor/glamor_copyplane.c | 7 ---- glamor/glamor_copywindow.c | 4 --- glamor/glamor_core.c | 20 ++++++----- glamor/glamor_egl.c | 52 +++++++++++++++++----------- glamor/glamor_eglmodule.c | 4 +-- glamor/glamor_fbo.c | 25 ++++---------- glamor/glamor_fill.c | 26 +++++++------- glamor/glamor_fillspans.c | 7 ---- glamor/glamor_getimage.c | 12 ++----- glamor/glamor_getspans.c | 11 ++---- glamor/glamor_glyphblt.c | 24 ++----------- glamor/glamor_glyphs.c | 10 ++---- glamor/glamor_picture.c | 4 --- glamor/glamor_pixmap.c | 37 ++++++++++++-------- glamor/glamor_polyfillrect.c | 7 ---- glamor/glamor_polylines.c | 7 ---- glamor/glamor_polyops.c | 41 +++------------------- glamor/glamor_priv.h | 6 +--- glamor/glamor_putimage.c | 9 +++-- glamor/glamor_render.c | 67 +++++++++++++++++++----------------- glamor/glamor_setspans.c | 16 +++------ glamor/glamor_tile.c | 14 ++++---- glamor/glamor_triangles.c | 4 --- glamor/glamor_utils.h | 43 +++++++++++++++-------- glamor/glamor_window.c | 4 --- 29 files changed, 223 insertions(+), 334 deletions(-) diff --git a/glamor/glamor.c b/glamor/glamor.c index 6b6330f4c..86de1154b 100644 --- a/glamor/glamor.c +++ b/glamor/glamor.c @@ -196,24 +196,25 @@ glamor_block_handler(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; - GLAMOR_DEFINE_CONTEXT; + glamor_gl_dispatch *dispatch; - GLAMOR_SET_CONTEXT(glamor_priv); + dispatch = glamor_get_dispatch(glamor_priv); glamor_priv->tick++; dispatch->glFlush(); dispatch->glFinish(); glamor_fbo_expire(glamor_priv); - GLAMOR_RESTORE_CONTEXT(glamor_priv); + glamor_put_dispatch(glamor_priv); } static void _glamor_block_handler(void *data, OSTimePtr timeout, void *last_select_mask) { - glamor_gl_dispatch *dispatch = data; + glamor_screen_private *glamor_priv = data; + glamor_gl_dispatch *dispatch = glamor_get_dispatch(glamor_priv); dispatch->glFlush(); dispatch->glFinish(); + glamor_put_dispatch(glamor_priv); } static void @@ -289,8 +290,7 @@ glamor_init(ScreenPtr screen, unsigned int flags) } #endif - glamor_gl_dispatch_init(screen, &glamor_priv->dispatch, - gl_version); + glamor_gl_dispatch_init(screen, &glamor_priv->_dispatch, gl_version); #ifdef GLAMOR_GLES2 if (!glamor_gl_has_extension("GL_EXT_texture_format_BGRA8888")) { @@ -303,8 +303,8 @@ glamor_init(ScreenPtr screen, unsigned int flags) glamor_gl_has_extension("GL_MESA_pack_invert"); glamor_priv->has_fbo_blit = glamor_gl_has_extension("GL_EXT_framebuffer_blit"); - glamor_priv->dispatch.glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, - &glamor_priv->max_fbo_size); + glamor_priv->_dispatch.glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, + &glamor_priv->max_fbo_size); glamor_set_debug_level(&glamor_debug_level); @@ -324,8 +324,7 @@ glamor_init(ScreenPtr screen, unsigned int flags) if (flags & GLAMOR_USE_SCREEN) { if (!RegisterBlockAndWakeupHandlers(_glamor_block_handler, _glamor_wakeup_handler, - (void *) - &glamor_priv->dispatch)) { + glamor_priv)) { goto fail; } diff --git a/glamor/glamor.h b/glamor/glamor.h index 712a7a9b2..d3437d381 100644 --- a/glamor/glamor.h +++ b/glamor/glamor.h @@ -28,18 +28,16 @@ #ifndef GLAMOR_H #define GLAMOR_H -#include "scrnintstr.h" +#include #ifdef GLAMOR_FOR_XORG -#include "xf86str.h" +#include #endif -#include "pixmapstr.h" -#include "windowstr.h" -#include "gcstruct.h" -#include "picturestr.h" -#include "fb.h" -#include "fbpict.h" - -#endif /* GLAMOR_H */ +#include +#include +#include +#include +#include +#include /* * glamor_pixmap_type : glamor pixmap's type. @@ -145,9 +143,8 @@ extern _X_EXPORT PixmapPtr glamor_create_pixmap(ScreenPtr screen, int w, int h, extern _X_EXPORT void glamor_egl_screen_init(ScreenPtr screen); -extern _X_EXPORT void * glamor_egl_make_current(ScreenPtr screen); - -extern _X_EXPORT void glamor_egl_restore_context(ScreenPtr screen, void *context); +extern _X_EXPORT void glamor_egl_make_current(ScreenPtr screen); +extern _X_EXPORT void glamor_egl_restore_context(ScreenPtr screen); #ifdef GLAMOR_FOR_XORG @@ -320,3 +317,4 @@ extern _X_EXPORT Bool glamor_poly_line_nf(DrawablePtr pDrawable, GCPtr pGC, int extern _X_EXPORT Bool glamor_poly_lines_nf(DrawablePtr drawable, GCPtr gc, int mode, int n, DDXPointPtr points); +#endif /* GLAMOR_H */ diff --git a/glamor/glamor_addtraps.c b/glamor/glamor_addtraps.c index 28775e561..ac852963c 100644 --- a/glamor/glamor_addtraps.c +++ b/glamor/glamor_addtraps.c @@ -26,10 +26,6 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" static Bool diff --git a/glamor/glamor_copyarea.c b/glamor/glamor_copyarea.c index e6569343e..de02224a3 100644 --- a/glamor/glamor_copyarea.c +++ b/glamor/glamor_copyarea.c @@ -21,10 +21,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" /** @file glamor_copyarea.c @@ -43,7 +39,7 @@ glamor_copy_n_to_n_fbo_blit(DrawablePtr src, glamor_pixmap_private *src_pixmap_priv; glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; int dst_x_off, dst_y_off, src_x_off, src_y_off, i; if (!glamor_priv->has_fbo_blit) { @@ -78,6 +74,7 @@ glamor_copy_n_to_n_fbo_blit(DrawablePtr src, } glamor_validate_pixmap(dst_pixmap); + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glBindFramebuffer(GL_READ_FRAMEBUFFER_EXT, src_pixmap_priv->fbo->fb); glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off, @@ -136,6 +133,7 @@ glamor_copy_n_to_n_fbo_blit(DrawablePtr src, GL_NEAREST); } } + glamor_put_dispatch(glamor_priv); return TRUE; } #endif @@ -147,7 +145,7 @@ glamor_copy_n_to_n_textured(DrawablePtr src, { glamor_screen_private *glamor_priv = glamor_get_screen_private(dst->pScreen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; PixmapPtr src_pixmap = glamor_get_drawable_pixmap(src); PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(dst); int i; @@ -158,23 +156,24 @@ glamor_copy_n_to_n_textured(DrawablePtr src, enum glamor_pixmap_status src_status = GLAMOR_NONE; GLfloat dst_xscale, dst_yscale, src_xscale, src_yscale; int flush_needed = 0; + int alu = GXcopy; src_pixmap_priv = glamor_get_pixmap_private(src_pixmap); dst_pixmap_priv = glamor_get_pixmap_private(dst_pixmap); if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dst_pixmap_priv)) { glamor_delayed_fallback(dst->pScreen, "dst has no fbo.\n"); - goto fail; + return FALSE; } if (!src_pixmap_priv || !src_pixmap_priv->gl_fbo) { #ifndef GLAMOR_PIXMAP_DYNAMIC_UPLOAD glamor_delayed_fallback(dst->pScreen, "src has no fbo.\n"); - goto fail; + return FALSE; #else src_status = glamor_upload_pixmap_to_texture(src_pixmap); if (src_status != GLAMOR_UPLOAD_DONE) - goto fail; + return FALSE; src_pixmap_priv = glamor_get_pixmap_private(src_pixmap); #endif @@ -182,25 +181,26 @@ glamor_copy_n_to_n_textured(DrawablePtr src, flush_needed = 1; if (gc) { - glamor_set_alu(dispatch, gc->alu); if (!glamor_set_planemask(dst_pixmap, gc->planemask)) - goto fail; - if (gc->alu != GXcopy) { - glamor_set_destination_pixmap_priv_nc - (src_pixmap_priv); - glamor_validate_pixmap(src_pixmap); - } + return FALSE; + alu = gc->alu; } - glamor_set_destination_pixmap_priv_nc(dst_pixmap_priv); - glamor_validate_pixmap(dst_pixmap); - pixmap_priv_get_scale(dst_pixmap_priv, &dst_xscale, &dst_yscale); pixmap_priv_get_scale(src_pixmap_priv, &src_xscale, &src_yscale); glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off, &dst_y_off); + dispatch = glamor_get_dispatch(glamor_priv); + + glamor_set_alu(dispatch, alu); + if (alu != GXcopy) { + glamor_set_destination_pixmap_priv_nc (src_pixmap_priv); + glamor_validate_pixmap(src_pixmap); + } + glamor_set_destination_pixmap_priv_nc(dst_pixmap_priv); + glamor_validate_pixmap(dst_pixmap); dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), vertices); @@ -284,12 +284,8 @@ glamor_copy_n_to_n_textured(DrawablePtr src, /* The source texture is bound to a fbo, we have to flush it here. */ if (flush_needed) dispatch->glFlush(); + glamor_put_dispatch(glamor_priv); return TRUE; - - fail: - glamor_set_alu(dispatch, GXcopy); - glamor_set_planemask(dst_pixmap, ~0); - return FALSE; } static Bool @@ -317,7 +313,6 @@ _glamor_copy_n_to_n(DrawablePtr src, int i; int overlaped = 0; Bool ret = FALSE; - GLAMOR_DEFINE_CONTEXT; dst_pixmap = glamor_get_drawable_pixmap(dst); dst_pixmap_priv = glamor_get_pixmap_private(dst_pixmap); @@ -326,7 +321,6 @@ _glamor_copy_n_to_n(DrawablePtr src, screen = dst_pixmap->drawable.pScreen; glamor_priv = glamor_get_screen_private(dst->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dst_pixmap_priv)) { glamor_fallback("dest pixmap %p has no fbo. \n", @@ -448,7 +442,6 @@ _glamor_copy_n_to_n(DrawablePtr src, glamor_clear_delayed_fallbacks(dst->pScreen); if (temp_src != src) glamor_destroy_pixmap(temp_pixmap); - GLAMOR_RESTORE_CONTEXT(glamor_priv); return ret; } diff --git a/glamor/glamor_copyplane.c b/glamor/glamor_copyplane.c index b6b26a50c..6487ff7fc 100644 --- a/glamor/glamor_copyplane.c +++ b/glamor/glamor_copyplane.c @@ -26,10 +26,6 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" static Bool @@ -37,7 +33,6 @@ _glamor_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy, int w, int h, int dstx, int dsty, unsigned long bitPlane, RegionPtr *pRegion, Bool fallback) { - GLAMOR_DEFINE_CONTEXT; glamor_screen_private *glamor_priv; if (!fallback @@ -47,14 +42,12 @@ _glamor_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, goto fail; glamor_priv = glamor_get_screen_private(pDst->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); glamor_prepare_access(pDst, GLAMOR_ACCESS_RW); glamor_prepare_access(pSrc, GLAMOR_ACCESS_RO); *pRegion = fbCopyPlane(pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty, bitPlane); glamor_finish_access(pSrc, GLAMOR_ACCESS_RO); glamor_finish_access(pDst, GLAMOR_ACCESS_RW); - GLAMOR_RESTORE_CONTEXT(glamor_priv); return TRUE; fail: diff --git a/glamor/glamor_copywindow.c b/glamor/glamor_copywindow.c index 11b30363f..b181ff529 100644 --- a/glamor/glamor_copywindow.c +++ b/glamor/glamor_copywindow.c @@ -21,10 +21,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" /** @file glamor_copywindow.c diff --git a/glamor/glamor_core.c b/glamor/glamor_core.c index 01c9aeaf9..0376388ca 100644 --- a/glamor/glamor_core.c +++ b/glamor/glamor_core.c @@ -31,10 +31,6 @@ * This file covers core X rendering in glamor. */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include #include "glamor_priv.h" @@ -174,7 +170,7 @@ glamor_init_finish_access_shaders(ScreenPtr screen) GLint sampler_uniform_location; glamor_priv = glamor_get_screen_private(screen); - dispatch = &glamor_priv->dispatch; + dispatch = glamor_get_dispatch(glamor_priv); glamor_priv->finish_access_prog[0] = dispatch->glCreateProgram(); glamor_priv->finish_access_prog[1] = dispatch->glCreateProgram(); @@ -248,7 +244,7 @@ glamor_init_finish_access_shaders(ScreenPtr screen) dispatch->glUniform1i(sampler_uniform_location, 0); dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[1], 0); dispatch->glUseProgram(0); - + glamor_put_dispatch(glamor_priv); } void @@ -258,9 +254,10 @@ glamor_fini_finish_access_shaders(ScreenPtr screen) glamor_gl_dispatch *dispatch; glamor_priv = glamor_get_screen_private(screen); - dispatch = &glamor_priv->dispatch; + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glDeleteProgram(glamor_priv->finish_access_prog[0]); dispatch->glDeleteProgram(glamor_priv->finish_access_prog[1]); + glamor_put_dispatch(glamor_priv); } void @@ -271,7 +268,6 @@ glamor_finish_access(DrawablePtr drawable, glamor_access_t access_mode) glamor_get_pixmap_private(pixmap); glamor_screen_private *glamor_priv = glamor_get_screen_private(drawable->pScreen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; if (!GLAMOR_PIXMAP_PRIV_HAS_FBO_DOWNLOADED(pixmap_priv)) return; @@ -281,11 +277,17 @@ glamor_finish_access(DrawablePtr drawable, glamor_access_t access_mode) } if (pixmap_priv->fbo->pbo != 0 && pixmap_priv->fbo->pbo_valid) { + glamor_gl_dispatch *dispatch; + assert(glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP); + + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); dispatch->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); - pixmap_priv->fbo->pbo_valid = FALSE; dispatch->glDeleteBuffers(1, &pixmap_priv->fbo->pbo); + glamor_put_dispatch(glamor_priv); + + pixmap_priv->fbo->pbo_valid = FALSE; pixmap_priv->fbo->pbo = 0; } else { free(pixmap->devPrivate.ptr); diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c index a339527d8..ecbc186fa 100644 --- a/glamor/glamor_egl.c +++ b/glamor/glamor_egl.c @@ -31,11 +31,8 @@ #include "config.h" #endif -#ifdef HAVE_DIX_CONFIG_H -#include -#endif #define GLAMOR_FOR_XORG -#include "xorg-server.h" +#include #include #include #include @@ -93,7 +90,8 @@ struct glamor_egl_screen_private { struct gbm_device *gbm; #endif int has_gem; - void *gl_context; + void *gl_context, *old_context; + int gl_context_depth; PFNEGLCREATEIMAGEKHRPROC egl_create_image_khr; PFNEGLDESTROYIMAGEKHRPROC egl_destroy_image_khr; @@ -112,13 +110,18 @@ glamor_egl_get_screen_private(ScrnInfoPtr scrn) scrn->privates[xf86GlamorEGLPrivateIndex].ptr; } #ifdef GLX_USE_SHARED_DISPATCH -_X_EXPORT void * +_X_EXPORT void glamor_egl_make_current(ScreenPtr screen) { ScrnInfoPtr scrn = xf86Screens[screen->myNum]; struct glamor_egl_screen_private *glamor_egl = glamor_egl_get_screen_private(scrn); + + if (glamor_egl->gl_context_depth++) + return; + GET_CURRENT_CONTEXT(current); + glamor_egl->old_context = current; if (glamor_egl->gl_context != current) { eglMakeCurrent(glamor_egl->display, EGL_NO_SURFACE, @@ -126,24 +129,28 @@ glamor_egl_make_current(ScreenPtr screen) if (!eglMakeCurrent(glamor_egl->display, EGL_NO_SURFACE, EGL_NO_SURFACE, glamor_egl->context)) { - xf86DrvMsg(scrn->scrnIndex, X_ERROR, - "Failed to make EGL context current\n"); - return NULL; + FatalError("Failed to make EGL context current\n"); } - return current; } - return NULL; } _X_EXPORT void -glamor_egl_restore_context(ScreenPtr screen, void *context) +glamor_egl_restore_context(ScreenPtr screen) { - if (context) - SET_CURRENT_CONTEXT(context); + ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + struct glamor_egl_screen_private *glamor_egl = + glamor_egl_get_screen_private(scrn); + + if (--glamor_egl->gl_context_depth) + return; + + if (glamor_egl->old_context && + glamor_egl->gl_context != glamor_egl->old_context) + SET_CURRENT_CONTEXT(glamor_egl->old_context); } #else -#define glamor_egl_make_current(x) NULL -#define glamor_egl_restore_context(s, c) +#define glamor_egl_make_current(x) +#define glamor_egl_restore_context(s) #endif static EGLImageKHR @@ -252,12 +259,11 @@ glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride) EGLImageKHR image; GLuint texture; int name; - void *prev_context; Bool ret = FALSE; glamor_egl = glamor_egl_get_screen_private(scrn); - prev_context = glamor_egl_make_current(screen); + glamor_egl_make_current(screen); if (glamor_egl->has_gem) { if (!glamor_get_flink_name(glamor_egl->fd, handle, &name)) { xf86DrvMsg(scrn->scrnIndex, X_ERROR, @@ -285,8 +291,7 @@ glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride) ret = TRUE; done: - if (prev_context) - glamor_egl_restore_context(screen, prev_context); + glamor_egl_restore_context(screen); return ret; } @@ -497,6 +502,13 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd) #endif glamor_egl->saved_free_screen = scrn->FreeScreen; scrn->FreeScreen = glamor_egl_free_screen; +#ifdef GLAMOR_GLES2 + xf86DrvMsg(scrn->scrnIndex, X_INFO, "Using GLES2.\n"); +#ifdef GLX_USE_SHARED_DISPATCH + xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Glamor is using GLES2 but GLX needs GL. " + "Indirect GLX may not work correctly.\n"); +#endif +#endif return TRUE; } diff --git a/glamor/glamor_eglmodule.c b/glamor/glamor_eglmodule.c index e1f6672af..096165162 100644 --- a/glamor/glamor_eglmodule.c +++ b/glamor/glamor_eglmodule.c @@ -28,10 +28,10 @@ #include "config.h" #endif -#include #define GLAMOR_FOR_XORG #include "glamor.h" -#include "xf86Module.h" +#include +#include static XF86ModuleVersionInfo VersRec = { GLAMOR_EGL_MODULE_NAME, diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c index 929cababa..e5675d81c 100644 --- a/glamor/glamor_fbo.c +++ b/glamor/glamor_fbo.c @@ -1,7 +1,3 @@ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include #include "glamor_priv.h" @@ -126,17 +122,14 @@ glamor_pixmap_fbo_cache_get(glamor_screen_private *glamor_priv, void glamor_purge_fbo(glamor_pixmap_fbo *fbo) { - GLAMOR_DEFINE_CONTEXT; - - GLAMOR_SET_CONTEXT(fbo->glamor_priv); - glamor_gl_dispatch *dispatch = &fbo->glamor_priv->dispatch; + glamor_gl_dispatch *dispatch = glamor_get_dispatch(fbo->glamor_priv); if (fbo->fb) dispatch->glDeleteFramebuffers(1, &fbo->fb); if (fbo->tex) dispatch->glDeleteTextures(1, &fbo->tex); if (fbo->pbo) dispatch->glDeleteBuffers(1, &fbo->pbo); - GLAMOR_RESTORE_CONTEXT(fbo->glamor_priv); + glamor_put_dispatch(fbo->glamor_priv); free(fbo); } @@ -292,7 +285,6 @@ glamor_create_tex_obj(glamor_screen_private *glamor_priv, glamor_pixmap_fbo *fbo; int cache_flag = GLAMOR_CACHE_TEXTURE; GLuint tex; - GLAMOR_DEFINE_CONTEXT; if (flag == GLAMOR_CREATE_TEXTURE_EXACT_SIZE) cache_flag |= GLAMOR_CACHE_EXACT_SIZE; @@ -305,10 +297,9 @@ glamor_create_tex_obj(glamor_screen_private *glamor_priv, if (fbo == NULL) return NULL; - GLAMOR_SET_CONTEXT(glamor_priv); list_init(&fbo->list); - dispatch = &glamor_priv->dispatch; + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glGenTextures(1, &tex); dispatch->glBindTexture(GL_TEXTURE_2D, tex); dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, @@ -317,12 +308,13 @@ glamor_create_tex_obj(glamor_screen_private *glamor_priv, GL_NEAREST); dispatch->glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0, format, GL_UNSIGNED_BYTE, NULL); + glamor_put_dispatch(glamor_priv); + fbo->tex = tex; fbo->width = w; fbo->height = h; fbo->format = format; fbo->glamor_priv = glamor_priv; - GLAMOR_RESTORE_CONTEXT(glamor_priv); return fbo; } @@ -344,7 +336,6 @@ glamor_create_fbo(glamor_screen_private *glamor_priv, GLenum format; GLint tex; int cache_flag; - GLAMOR_DEFINE_CONTEXT; if (!glamor_check_fbo_size(glamor_priv, w, h) || !glamor_check_fbo_depth(depth)) @@ -364,9 +355,7 @@ glamor_create_fbo(glamor_screen_private *glamor_priv, if (fbo) return fbo; new_fbo: - - GLAMOR_SET_CONTEXT(glamor_priv); - dispatch = &glamor_priv->dispatch; + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glGenTextures(1, &tex); dispatch->glBindTexture(GL_TEXTURE_2D, tex); dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, @@ -377,7 +366,7 @@ new_fbo: GL_UNSIGNED_BYTE, NULL); fbo = glamor_create_fbo_from_tex(glamor_priv, w, h, depth, tex, flag); - GLAMOR_RESTORE_CONTEXT(glamor_priv); + glamor_put_dispatch(glamor_priv); return fbo; } diff --git a/glamor/glamor_fill.c b/glamor/glamor_fill.c index b462f5922..85733099b 100644 --- a/glamor/glamor_fill.c +++ b/glamor/glamor_fill.c @@ -21,10 +21,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" /** @file glamor_fillspans.c @@ -112,7 +108,7 @@ glamor_init_solid_shader(ScreenPtr screen) GLint fs_prog, vs_prog; glamor_priv = glamor_get_screen_private(screen); - dispatch = &glamor_priv->dispatch; + dispatch = glamor_get_dispatch(glamor_priv); glamor_priv->solid_prog = dispatch->glCreateProgram(); vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, solid_vs); fs_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER, @@ -127,6 +123,7 @@ glamor_init_solid_shader(ScreenPtr screen) glamor_priv->solid_color_uniform_location = dispatch->glGetUniformLocation(glamor_priv->solid_prog, "color"); + glamor_put_dispatch(glamor_priv); } void @@ -136,8 +133,9 @@ glamor_fini_solid_shader(ScreenPtr screen) glamor_gl_dispatch *dispatch; glamor_priv = glamor_get_screen_private(screen); - dispatch = &glamor_priv->dispatch; + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glDeleteProgram(glamor_priv->solid_prog); + glamor_put_dispatch(glamor_priv); } Bool @@ -150,7 +148,7 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, glamor_get_screen_private(screen); glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; int x1 = x; int x2 = x + width; int y1 = y; @@ -158,15 +156,16 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, GLfloat color[4]; float vertices[8]; GLfloat xscale, yscale; + if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) { glamor_fallback("dest %p has no fbo.\n", pixmap); - goto fail; + return FALSE; } - glamor_set_alu(dispatch, alu); + if (!glamor_set_planemask(pixmap, planemask)) { glamor_fallback ("Failedto set planemask in glamor_solid.\n"); - goto fail; + return FALSE; } glamor_get_rgba_from_pixel(fg_pixel, @@ -189,6 +188,8 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, glamor_set_destination_pixmap_priv_nc(pixmap_priv); glamor_validate_pixmap(pixmap); + dispatch = glamor_get_dispatch(glamor_priv); + glamor_set_alu(dispatch, alu); dispatch->glUseProgram(glamor_priv->solid_prog); dispatch->glUniform4fv(glamor_priv->solid_color_uniform_location, @@ -205,9 +206,6 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4); dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS); dispatch->glUseProgram(0); + glamor_put_dispatch(glamor_priv); return TRUE; - fail: - glamor_set_alu(dispatch, GXcopy); - glamor_set_planemask(pixmap, ~0); - return FALSE; } diff --git a/glamor/glamor_fillspans.c b/glamor/glamor_fillspans.c index 97e449784..6598249fd 100644 --- a/glamor/glamor_fillspans.c +++ b/glamor/glamor_fillspans.c @@ -20,10 +20,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - /** @file glamor_fillspans.c * * FillSpans implementation, taken from fb_fillsp.c @@ -41,11 +37,9 @@ _glamor_fill_spans(DrawablePtr drawable, int x1, x2, y; RegionPtr pClip = fbGetCompositeClip(gc); glamor_screen_private *glamor_priv; - GLAMOR_DEFINE_CONTEXT; Bool ret = FALSE; glamor_priv = glamor_get_screen_private(drawable->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); if (gc->fillStyle != FillSolid && gc->fillStyle != FillTiled) goto fail; @@ -99,7 +93,6 @@ fail: ret = TRUE; done: - GLAMOR_RESTORE_CONTEXT(glamor_priv); return ret; } diff --git a/glamor/glamor_getimage.c b/glamor/glamor_getimage.c index 7caf2a372..efbd1baca 100644 --- a/glamor/glamor_getimage.c +++ b/glamor/glamor_getimage.c @@ -26,10 +26,6 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" @@ -46,13 +42,11 @@ _glamor_get_image(DrawablePtr drawable, int x, int y, int w, int h, int no_alpha, no_revert; PixmapPtr temp_pixmap = NULL; glamor_gl_dispatch * dispatch; - GLAMOR_DEFINE_CONTEXT; Bool ret = FALSE; goto fall_back; glamor_priv = glamor_get_screen_private(drawable->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); if (format != ZPixmap) goto fall_back; @@ -65,7 +59,6 @@ _glamor_get_image(DrawablePtr drawable, int x, int y, int w, int h, } glamor_priv = glamor_get_screen_private(drawable->pScreen); pixmap_priv = glamor_get_pixmap_private(pixmap); - dispatch = &glamor_priv->dispatch; if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) @@ -97,6 +90,8 @@ _glamor_get_image(DrawablePtr drawable, int x, int y, int w, int h, int row_length = PixmapBytePad(w, drawable->depth); row_length = (row_length * 8) / drawable->bitsPerPixel; + + dispatch = glamor_get_dispatch(glamor_priv); if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) { dispatch->glPixelStorei(GL_PACK_ALIGNMENT, 1); dispatch->glPixelStorei(GL_PACK_ROW_LENGTH, row_length); @@ -117,14 +112,13 @@ _glamor_get_image(DrawablePtr drawable, int x, int y, int w, int h, h, tex_format, tex_type, d); + glamor_put_dispatch(glamor_priv); if (temp_pixmap) glamor_destroy_pixmap(temp_pixmap); ret = TRUE; fall_back: - - GLAMOR_RESTORE_CONTEXT(glamor_priv); if (ret == FALSE) miGetImage(drawable, x, y, w, h, format, planeMask, d); return TRUE; diff --git a/glamor/glamor_getspans.c b/glamor/glamor_getspans.c index 2d30f37a8..91030a3d4 100644 --- a/glamor/glamor_getspans.c +++ b/glamor/glamor_getspans.c @@ -25,10 +25,6 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" static Bool @@ -44,15 +40,13 @@ _glamor_get_spans(DrawablePtr drawable, glamor_get_screen_private(drawable->pScreen); glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; PixmapPtr temp_pixmap = NULL; int i; uint8_t *readpixels_dst = (uint8_t *) dst; int x_off, y_off; - GLAMOR_DEFINE_CONTEXT; Bool ret = FALSE; - GLAMOR_SET_CONTEXT(glamor_priv); if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) { glamor_fallback("pixmap has no fbo.\n"); goto fail; @@ -82,6 +76,7 @@ _glamor_get_spans(DrawablePtr drawable, } glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off); + dispatch = glamor_get_dispatch(glamor_priv); for (i = 0; i < count; i++) { if (glamor_priv->yInverted) { dispatch->glReadPixels(points[i].x + x_off, @@ -98,6 +93,7 @@ _glamor_get_spans(DrawablePtr drawable, readpixels_dst += PixmapBytePad(widths[i], drawable->depth); } + glamor_put_dispatch(glamor_priv); if (temp_pixmap) glamor_destroy_pixmap(temp_pixmap); @@ -116,7 +112,6 @@ fail: glamor_finish_access(drawable, GLAMOR_ACCESS_RO); } done: - GLAMOR_RESTORE_CONTEXT(glamor_priv); return ret; } diff --git a/glamor/glamor_glyphblt.c b/glamor/glamor_glyphblt.c index 8c853e91a..163099847 100644 --- a/glamor/glamor_glyphblt.c +++ b/glamor/glamor_glyphblt.c @@ -26,10 +26,6 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" static Bool @@ -37,7 +33,6 @@ _glamor_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC, int x, int y, unsigned int nglyph, CharInfoPtr * ppci, pointer pglyphBase, Bool fallback) { - GLAMOR_DEFINE_CONTEXT; glamor_screen_private *glamor_priv; if (!fallback @@ -46,13 +41,11 @@ _glamor_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC, goto fail; glamor_priv = glamor_get_screen_private(pDrawable->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); glamor_prepare_access(pDrawable, GLAMOR_ACCESS_RW); glamor_prepare_access_gc(pGC); fbImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); glamor_finish_access_gc(pGC); glamor_finish_access(pDrawable, GLAMOR_ACCESS_RW); - GLAMOR_RESTORE_CONTEXT(glamor_priv); return TRUE; fail: return FALSE; @@ -79,25 +72,20 @@ _glamor_poly_glyph_blt(DrawablePtr pDrawable, GCPtr pGC, int x, int y, unsigned int nglyph, CharInfoPtr * ppci, pointer pglyphBase, Bool fallback) { - GLAMOR_DEFINE_CONTEXT; glamor_screen_private *glamor_priv; if (!fallback && glamor_ddx_fallback_check_pixmap(pDrawable) && glamor_ddx_fallback_check_gc(pGC)) - goto fail; + return FALSE; glamor_priv = glamor_get_screen_private(pDrawable->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); glamor_prepare_access(pDrawable, GLAMOR_ACCESS_RW); glamor_prepare_access_gc(pGC); fbPolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); glamor_finish_access_gc(pGC); glamor_finish_access(pDrawable, GLAMOR_ACCESS_RW); - GLAMOR_RESTORE_CONTEXT(glamor_priv); return TRUE; - fail: - return FALSE; } void @@ -120,17 +108,12 @@ static Bool _glamor_push_pixels(GCPtr pGC, PixmapPtr pBitmap, DrawablePtr pDrawable, int w, int h, int x, int y, Bool fallback) { - GLAMOR_DEFINE_CONTEXT; - glamor_screen_private *glamor_priv; - if (!fallback && glamor_ddx_fallback_check_pixmap(pDrawable) && glamor_ddx_fallback_check_pixmap(&pBitmap->drawable) && glamor_ddx_fallback_check_gc(pGC)) - goto fail; + return FALSE; - glamor_priv = glamor_get_screen_private(pDrawable->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); glamor_prepare_access(pDrawable, GLAMOR_ACCESS_RW); glamor_prepare_access(&pBitmap->drawable, GLAMOR_ACCESS_RO); glamor_prepare_access_gc(pGC); @@ -138,10 +121,7 @@ _glamor_push_pixels(GCPtr pGC, PixmapPtr pBitmap, glamor_finish_access_gc(pGC); glamor_finish_access(&pBitmap->drawable, GLAMOR_ACCESS_RO); glamor_finish_access(pDrawable, GLAMOR_ACCESS_RW); - GLAMOR_RESTORE_CONTEXT(glamor_priv); return TRUE; - fail: - return FALSE; } void diff --git a/glamor/glamor_glyphs.c b/glamor/glamor_glyphs.c index 33e06f1d3..fe7d9de26 100644 --- a/glamor/glamor_glyphs.c +++ b/glamor/glamor_glyphs.c @@ -40,15 +40,11 @@ * Based on code by: Keith Packard */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include #include "glamor_priv.h" -#include "mipict.h" +#include #if DEBUG_GLYPH_CACHE #define DBG_GLYPH_CACHE(a) ErrorF a @@ -163,7 +159,7 @@ glamor_realize_glyph_caches(ScreenPtr pScreen) glamor_glyph_cache_t *cache = &glamor->glyphCaches[i]; PixmapPtr pixmap; PicturePtr picture; - CARD32 component_alpha; + XID component_alpha; int depth = PIXMAN_FORMAT_DEPTH(formats[i]); int error; PictFormatPtr pPictFormat = @@ -652,7 +648,7 @@ glamor_glyphs_via_mask(CARD8 op, GlyphPtr glyph; int error; BoxRec extents = { 0, 0, 0, 0 }; - CARD32 component_alpha; + XID component_alpha; glamor_glyph_buffer_t buffer; xRectangle fill_rect; diff --git a/glamor/glamor_picture.c b/glamor/glamor_picture.c index 217fd4048..38185a491 100644 --- a/glamor/glamor_picture.c +++ b/glamor/glamor_picture.c @@ -1,7 +1,3 @@ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include #include "glamor_priv.h" diff --git a/glamor/glamor_pixmap.c b/glamor/glamor_pixmap.c index 1a63ffdd1..7f4a90b81 100644 --- a/glamor/glamor_pixmap.c +++ b/glamor/glamor_pixmap.c @@ -1,7 +1,3 @@ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include #include "glamor_priv.h" @@ -31,7 +27,7 @@ static void _glamor_pixmap_validate_filling(glamor_screen_private * glamor_priv, glamor_pixmap_private * pixmap_priv) { - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch = glamor_get_dispatch(glamor_priv); GLfloat vertices[8]; dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), @@ -52,6 +48,7 @@ _glamor_pixmap_validate_filling(glamor_screen_private * glamor_priv, dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS); dispatch->glUseProgram(0); pixmap_priv->pending_op.type = GLAMOR_PENDING_NONE; + glamor_put_dispatch(glamor_priv); } @@ -94,7 +91,7 @@ glamor_validate_pixmap(PixmapPtr pixmap) void glamor_set_destination_pixmap_priv_nc(glamor_pixmap_private * pixmap_priv) { - glamor_gl_dispatch *dispatch = &pixmap_priv->glamor_priv->dispatch; + glamor_gl_dispatch *dispatch = glamor_get_dispatch(pixmap_priv->glamor_priv); dispatch->glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->fbo->fb); #ifndef GLAMOR_GLES2 dispatch->glMatrixMode(GL_PROJECTION); @@ -106,6 +103,7 @@ glamor_set_destination_pixmap_priv_nc(glamor_pixmap_private * pixmap_priv) pixmap_priv->fbo->width, pixmap_priv->fbo->height); + glamor_put_dispatch(pixmap_priv->glamor_priv); } int @@ -222,7 +220,7 @@ __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, GLenum format, glamor_get_pixmap_private(pixmap); glamor_screen_private *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; unsigned int stride, row_length; void *texels; GLenum iformat; @@ -235,6 +233,7 @@ __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, GLenum format, stride = pixmap->devKind; row_length = (stride * 8) / pixmap->drawable.bitsPerPixel; + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glBindTexture(GL_TEXTURE_2D, tex); dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -271,6 +270,7 @@ __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, GLenum format, if (pixmap_priv->fbo->pbo && pixmap_priv->fbo->pbo_valid) dispatch->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); + glamor_put_dispatch(glamor_priv); } @@ -289,7 +289,7 @@ _glamor_upload_pixmap_to_texture(PixmapPtr pixmap, GLenum format, glamor_get_pixmap_private(pixmap); glamor_screen_private *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; static float vertices[8]; static float texcoords[8] = { 0, 1, 1, 1, @@ -339,6 +339,7 @@ _glamor_upload_pixmap_to_texture(PixmapPtr pixmap, GLenum format, vertices); /* Slow path, we need to flip y or wire alpha to 1. */ + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), vertices); @@ -379,13 +380,17 @@ _glamor_upload_pixmap_to_texture(PixmapPtr pixmap, GLenum format, dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); dispatch->glDeleteTextures(1, &tex); dispatch->glBindFramebuffer(GL_FRAMEBUFFER, 0); + + glamor_put_dispatch(glamor_priv); } void glamor_pixmap_ensure_fb(glamor_pixmap_fbo *fbo) { + glamor_gl_dispatch *dispatch; int status; - glamor_gl_dispatch *dispatch = &fbo->glamor_priv->dispatch; + + dispatch = glamor_get_dispatch(fbo->glamor_priv); if (fbo->fb == 0) dispatch->glGenFramebuffers(1, &fbo->fb); @@ -422,11 +427,10 @@ glamor_pixmap_ensure_fb(glamor_pixmap_fbo *fbo) break; } - LogMessageVerb(X_INFO, 0, - "destination is framebuffer incomplete: %s [%#x]\n", - str, status); - assert(0); + FatalError("destination is framebuffer incomplete: %s [%#x]\n", + str, status); } + glamor_put_dispatch(fbo->glamor_priv); } /* @@ -571,7 +575,6 @@ glamor_es2_pixmap_read_prepare(PixmapPtr source, GLenum * format, glamor_priv = glamor_get_screen_private(screen); source_priv = glamor_get_pixmap_private(source); - dispatch = &glamor_priv->dispatch; if (*format == GL_BGRA) { *format = GL_RGBA; swap_rb = 1; @@ -585,6 +588,7 @@ glamor_es2_pixmap_read_prepare(PixmapPtr source, GLenum * format, temp_pixmap_priv = glamor_get_pixmap_private(temp_pixmap); + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glBindTexture(GL_TEXTURE_2D, temp_pixmap_priv->fbo->tex); dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, @@ -631,6 +635,7 @@ glamor_es2_pixmap_read_prepare(PixmapPtr source, GLenum * format, dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS); dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); dispatch->glUseProgram(0); + glamor_put_dispatch(glamor_priv); return temp_pixmap; } @@ -657,7 +662,7 @@ glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access) ScreenPtr screen; glamor_screen_private *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; screen = pixmap->drawable.pScreen; if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) @@ -715,6 +720,7 @@ glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access) } row_length = (stride * 8) / pixmap->drawable.bitsPerPixel; + dispatch = glamor_get_dispatch(glamor_priv); if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) { dispatch->glPixelStorei(GL_PACK_ALIGNMENT, 1); dispatch->glPixelStorei(GL_PACK_ROW_LENGTH, row_length); @@ -795,6 +801,7 @@ glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access) } dispatch->glBindFramebuffer(GL_FRAMEBUFFER, 0); + glamor_put_dispatch(glamor_priv); done: pixmap_priv->gl_fbo = GLAMOR_FBO_DOWNLOADED; diff --git a/glamor/glamor_polyfillrect.c b/glamor/glamor_polyfillrect.c index 8b362415f..61e707f59 100644 --- a/glamor/glamor_polyfillrect.c +++ b/glamor/glamor_polyfillrect.c @@ -26,10 +26,6 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" /** @file glamor_fillspans.c @@ -48,10 +44,8 @@ _glamor_poly_fill_rect(DrawablePtr drawable, RegionPtr pClip = fbGetCompositeClip(gc); Bool ret = FALSE; glamor_screen_private *glamor_priv; - GLAMOR_DEFINE_CONTEXT; glamor_priv = glamor_get_screen_private(drawable->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); if (gc->fillStyle != FillSolid && gc->fillStyle != FillTiled) { goto fail; @@ -119,7 +113,6 @@ fail: ret = TRUE; done: - GLAMOR_RESTORE_CONTEXT(glamor_priv); return ret; } diff --git a/glamor/glamor_polylines.c b/glamor/glamor_polylines.c index 0d37a1dd1..175e9580d 100644 --- a/glamor/glamor_polylines.c +++ b/glamor/glamor_polylines.c @@ -26,10 +26,6 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" /** @file glamor_polylines.c @@ -50,7 +46,6 @@ _glamor_poly_lines(DrawablePtr drawable, GCPtr gc, int mode, int n, int x1, x2, y1, y2; int i; glamor_screen_private *glamor_priv; - GLAMOR_DEFINE_CONTEXT; /* Don't try to do wide lines or non-solid fill style. */ if (gc->lineWidth != 0) { @@ -112,7 +107,6 @@ _glamor_poly_lines(DrawablePtr drawable, GCPtr gc, int mode, int n, return FALSE; glamor_priv = glamor_get_screen_private(drawable->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); if (gc->lineWidth == 0) { if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) { if (glamor_prepare_access_gc(gc)) { @@ -126,7 +120,6 @@ wide_line: /* fb calls mi functions in the lineWidth != 0 case. */ fbPolyLine(drawable, gc, mode, n, points); } - GLAMOR_RESTORE_CONTEXT(glamor_priv); return TRUE; } diff --git a/glamor/glamor_polyops.c b/glamor/glamor_polyops.c index ca21b8b9a..7320c1762 100644 --- a/glamor/glamor_polyops.c +++ b/glamor/glamor_polyops.c @@ -26,36 +26,23 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" static Bool _glamor_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, DDXPointPtr ppt, Bool fallback) { - GLAMOR_DEFINE_CONTEXT; - glamor_screen_private *glamor_priv; - if (!fallback && glamor_ddx_fallback_check_gc(pGC) && glamor_ddx_fallback_check_pixmap(pDrawable)) - goto fail; + return FALSE; - glamor_priv = glamor_get_screen_private(pDrawable->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); glamor_prepare_access_gc(pGC); glamor_prepare_access(pDrawable, GLAMOR_ACCESS_RW); fbPolyPoint(pDrawable, pGC, mode, npt, ppt); glamor_finish_access(pDrawable, GLAMOR_ACCESS_RW); glamor_finish_access_gc(pGC); - GLAMOR_RESTORE_CONTEXT(glamor_priv); return TRUE; - -fail: - return FALSE; } void @@ -76,16 +63,11 @@ static Bool _glamor_poly_segment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment *pSeg, Bool fallback) { - GLAMOR_DEFINE_CONTEXT; - glamor_screen_private *glamor_priv; - if (!fallback && glamor_ddx_fallback_check_gc(pGC) && glamor_ddx_fallback_check_pixmap(pDrawable)) - goto fail; + return FALSE; - glamor_priv = glamor_get_screen_private(pDrawable->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); /* For lineWidth is not zero, fb calls to mi functions. */ if (pGC->lineWidth == 0) { glamor_prepare_access_gc(pGC); @@ -94,13 +76,9 @@ _glamor_poly_segment(DrawablePtr pDrawable, GCPtr pGC, int nseg, glamor_finish_access(pDrawable, GLAMOR_ACCESS_RW); glamor_finish_access_gc(pGC); } else - fbPolySegment(pDrawable, pGC, nseg, pSeg); + fbPolySegment(pDrawable, pGC, nseg, pSeg); - GLAMOR_RESTORE_CONTEXT(glamor_priv); return TRUE; - -fail: - return FALSE; } void @@ -121,17 +99,12 @@ static Bool _glamor_poly_line(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, DDXPointPtr ppt, Bool fallback) { - GLAMOR_DEFINE_CONTEXT; - glamor_screen_private *glamor_priv; - if (!fallback && glamor_ddx_fallback_check_gc(pGC) && glamor_ddx_fallback_check_pixmap(pDrawable)) - goto fail; + return FALSE; /* For lineWidth is not zero, fb calls to mi functions. */ - glamor_priv = glamor_get_screen_private(pDrawable->pScreen); - GLAMOR_SET_CONTEXT(glamor_priv); if (pGC->lineWidth == 0) { glamor_prepare_access_gc(pGC); glamor_prepare_access(pDrawable, GLAMOR_ACCESS_RW); @@ -139,13 +112,9 @@ _glamor_poly_line(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, glamor_finish_access(pDrawable, GLAMOR_ACCESS_RW); glamor_finish_access_gc(pGC); } else - fbPolyLine(pDrawable, pGC, mode, npt, ppt); + fbPolyLine(pDrawable, pGC, mode, npt, ppt); - GLAMOR_RESTORE_CONTEXT(glamor_priv); return TRUE; - -fail: - return FALSE; } void diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h index d04421b6a..05bb18ac1 100644 --- a/glamor/glamor_priv.h +++ b/glamor/glamor_priv.h @@ -31,10 +31,6 @@ #include "config.h" #endif -#ifdef HAVE_DIX_CONFIG_H -#include -#include -#endif #include #include "glamor.h" @@ -171,7 +167,7 @@ struct glamor_saved_procs { (((int)(t1) - (int)(t0)) < 0) typedef struct glamor_screen_private { - struct glamor_gl_dispatch dispatch; + struct glamor_gl_dispatch _dispatch; int yInverted; unsigned int tick; enum glamor_gl_flavor gl_flavor; diff --git a/glamor/glamor_putimage.c b/glamor/glamor_putimage.c index 581382261..75e5b4cdd 100644 --- a/glamor/glamor_putimage.c +++ b/glamor/glamor_putimage.c @@ -251,7 +251,7 @@ _glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, { glamor_screen_private *glamor_priv = glamor_get_screen_private(drawable->pScreen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable); glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); @@ -265,10 +265,8 @@ _glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, GLfloat xscale, yscale, txscale, tyscale; GLuint tex; int no_alpha, no_revert; - GLAMOR_DEFINE_CONTEXT; Bool ret = FALSE; - GLAMOR_SET_CONTEXT(glamor_priv); if (image_format == XYBitmap) { assert(depth == 1); goto fail; @@ -287,7 +285,6 @@ _glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, if (!glamor_set_planemask(pixmap, gc->planemask)) { goto fail; } - glamor_set_alu(dispatch, gc->alu); if (glamor_get_tex_format_type_from_pixmap(pixmap, &format, @@ -298,6 +295,8 @@ _glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, } /* XXX consider to reuse a function to do the following work. */ + dispatch = glamor_get_dispatch(glamor_priv); + glamor_set_alu(dispatch, gc->alu); glamor_set_destination_pixmap_priv_nc(pixmap_priv); glamor_validate_pixmap(pixmap); dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, @@ -400,6 +399,7 @@ _glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, dispatch->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glamor_set_alu(dispatch, GXcopy); glamor_set_planemask(pixmap, ~0); + glamor_put_dispatch(glamor_priv); ret = TRUE; goto done; @@ -421,7 +421,6 @@ fail: ret = TRUE; done: - GLAMOR_RESTORE_CONTEXT(glamor_priv); return ret; } diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c index b240eac6a..89e8265a8 100644 --- a/glamor/glamor_render.c +++ b/glamor/glamor_render.c @@ -220,15 +220,16 @@ glamor_create_composite_shader(ScreenPtr screen, struct shader_key *key, GLuint vs, fs, prog; GLint source_sampler_uniform_location, mask_sampler_uniform_location; - glamor_screen_private *glamor = glamor_get_screen_private(screen); - glamor_gl_dispatch *dispatch = &glamor->dispatch; + glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); + glamor_gl_dispatch *dispatch; + dispatch = glamor_get_dispatch(glamor_priv); vs = glamor_create_composite_vs(dispatch, key); if (vs == 0) - return; + goto out; fs = glamor_create_composite_fs(dispatch, key); if (fs == 0) - return; + goto out; prog = dispatch->glCreateProgram(); dispatch->glAttachShader(prog, vs); @@ -268,6 +269,9 @@ glamor_create_composite_shader(ScreenPtr screen, struct shader_key *key, (mask_sampler_uniform_location, 1); } } + +out: + glamor_put_dispatch(glamor_priv); } static glamor_composite_shader * @@ -316,7 +320,7 @@ glamor_init_composite_shaders(ScreenPtr screen) int vb_size; glamor_priv = glamor_get_screen_private(screen); - dispatch = &glamor_priv->dispatch; + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glGenBuffers(1, &glamor_priv->vbo); dispatch->glGenBuffers(1, &glamor_priv->ebo); dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo); @@ -331,17 +335,13 @@ glamor_init_composite_shaders(ScreenPtr screen) } else { vb = malloc(GLAMOR_COMPOSITE_VBO_VERT_CNT * sizeof(float) * 2); - if (vb == NULL) { - ErrorF("Failed to allocate vb memory.\n"); - exit(1); - } + if (vb == NULL) + FatalError("Failed to allocate vb memory.\n"); eb = malloc(eb_size); } - if (eb == NULL) { - ErrorF("fatal error, fail to get eb.\n"); - exit(1); - } + if (eb == NULL) + FatalError("fatal error, fail to get eb.\n"); glamor_init_eb(eb, GLAMOR_COMPOSITE_VBO_VERT_CNT); if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) { @@ -362,6 +362,8 @@ glamor_init_composite_shaders(ScreenPtr screen) free(eb); glamor_priv->vb = (char*)vb; } + + glamor_put_dispatch(glamor_priv); } void @@ -373,7 +375,7 @@ glamor_fini_composite_shaders(ScreenPtr screen) int i,j,k; glamor_priv = glamor_get_screen_private(screen); - dispatch = &glamor_priv->dispatch; + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glDeleteBuffers(1, &glamor_priv->vbo); dispatch->glDeleteBuffers(1, &glamor_priv->ebo); @@ -388,8 +390,9 @@ glamor_fini_composite_shaders(ScreenPtr screen) if (glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP && glamor_priv->vb) free(glamor_priv->vb); -} + glamor_put_dispatch(glamor_priv); +} static Bool glamor_set_composite_op(ScreenPtr screen, @@ -399,7 +402,7 @@ glamor_set_composite_op(ScreenPtr screen, struct blendinfo *op_info; glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; if (op >= ARRAY_SIZE(composite_op_info)) { glamor_fallback("unsupported render op %d \n", op); @@ -435,12 +438,14 @@ glamor_set_composite_op(ScreenPtr screen, dest_blend = GL_ONE_MINUS_SRC_COLOR; } + dispatch = glamor_get_dispatch(glamor_priv); if (source_blend == GL_ONE && dest_blend == GL_ZERO) { dispatch->glDisable(GL_BLEND); } else { dispatch->glEnable(GL_BLEND); dispatch->glBlendFunc(source_blend, dest_blend); } + glamor_put_dispatch(glamor_priv); return TRUE; } @@ -451,7 +456,6 @@ glamor_composite_texture_fixup(ScreenPtr screen, { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; Bool has_repeat; int width, height; @@ -478,7 +482,9 @@ glamor_set_composite_texture(ScreenPtr screen, int unit, { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; + + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glActiveTexture(GL_TEXTURE0 + unit); dispatch->glBindTexture(GL_TEXTURE_2D, pixmap_priv->fbo->tex); switch (picture->repeatType) { @@ -533,6 +539,7 @@ glamor_set_composite_texture(ScreenPtr screen, int unit, #ifndef GLAMOR_GLES2 dispatch->glEnable(GL_TEXTURE_2D); #endif + glamor_put_dispatch(glamor_priv); } static void @@ -654,7 +661,7 @@ glamor_setup_composite_vbo(ScreenPtr screen, int n_verts) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; glamor_priv->vbo_offset = 0; glamor_priv->vbo_offset = 0; @@ -667,6 +674,7 @@ glamor_setup_composite_vbo(ScreenPtr screen, int n_verts) if (glamor_priv->has_mask_coords) glamor_priv->vb_stride += 2 * sizeof(float); + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo); if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) { dispatch->glBufferData(GL_ARRAY_BUFFER, @@ -706,6 +714,7 @@ glamor_setup_composite_vbo(ScreenPtr screen, int n_verts) sizeof(float))); dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_MASK); } + glamor_put_dispatch(glamor_priv); } static void @@ -739,9 +748,12 @@ glamor_flush_composite_rects(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; + if (!glamor_priv->render_nr_verts) return; + + dispatch = glamor_get_dispatch(glamor_priv); if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) dispatch->glUnmapBuffer(GL_ARRAY_BUFFER); else { @@ -754,6 +766,7 @@ glamor_flush_composite_rects(ScreenPtr screen) dispatch->glDrawElements(GL_TRIANGLES, (glamor_priv->render_nr_verts * 3) / 2, GL_UNSIGNED_SHORT, NULL); + glamor_put_dispatch(glamor_priv); } static void @@ -846,7 +859,7 @@ glamor_composite_with_shader(CARD8 op, ScreenPtr screen = dest->pDrawable->pScreen; glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; PixmapPtr dest_pixmap = glamor_get_drawable_pixmap(dest->pDrawable); PixmapPtr source_pixmap = NULL, mask_pixmap = NULL; @@ -870,10 +883,8 @@ glamor_composite_with_shader(CARD8 op, dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap); int vert_stride = 4; int nrect_max; - GLAMOR_DEFINE_CONTEXT; Bool ret = FALSE; - GLAMOR_SET_CONTEXT(glamor_priv); if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)) { glamor_fallback("dest has no fbo.\n"); goto fail; @@ -1090,6 +1101,7 @@ glamor_composite_with_shader(CARD8 op, goto fail; } + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glUseProgram(shader->prog); if (key.source == SHADER_SOURCE_SOLID) { @@ -1233,6 +1245,7 @@ glamor_composite_with_shader(CARD8 op, dispatch->glUseProgram(0); if (saved_source_format) source->format = saved_source_format; + glamor_put_dispatch(glamor_priv); ret = TRUE; goto done; @@ -1240,12 +1253,7 @@ glamor_composite_with_shader(CARD8 op, fail: if (saved_source_format) source->format = saved_source_format; - - dispatch->glDisable(GL_BLEND); - dispatch->glUseProgram(0); - done: - GLAMOR_RESTORE_CONTEXT(glamor_priv); return ret; } @@ -1320,7 +1328,6 @@ _glamor_composite(CARD8 op, RegionRec region; BoxPtr box; int nbox, i, ok; - GLAMOR_DEFINE_CONTEXT; x_temp_src = x_source; y_temp_src = y_source; @@ -1328,7 +1335,6 @@ _glamor_composite(CARD8 op, y_temp_mask = y_mask; dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap); - GLAMOR_SET_CONTEXT(glamor_priv); /* Currently. Always fallback to cpu if destination is in CPU memory. */ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)) { goto fail; @@ -1535,7 +1541,6 @@ fail: FreePicture(temp_mask, 0); if (prect != rect) free(prect); - GLAMOR_RESTORE_CONTEXT(glamor_priv); return ret; } diff --git a/glamor/glamor_setspans.c b/glamor/glamor_setspans.c index 07c94ab57..a9471698a 100644 --- a/glamor/glamor_setspans.c +++ b/glamor/glamor_setspans.c @@ -25,10 +25,6 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" static Bool @@ -40,17 +36,15 @@ _glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src, glamor_pixmap_private *dest_pixmap_priv; glamor_screen_private *glamor_priv = glamor_get_screen_private(drawable->pScreen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; GLenum format, type; int no_alpha, no_revert, i; uint8_t *drawpixels_src = (uint8_t *) src; RegionPtr clip = fbGetCompositeClip(gc); BoxRec *pbox; int x_off, y_off; - GLAMOR_DEFINE_CONTEXT; Bool ret = FALSE; - GLAMOR_SET_CONTEXT(glamor_priv); dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap); if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)) { glamor_fallback("pixmap has no fbo.\n"); @@ -70,17 +64,15 @@ _glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src, goto fail; } - glamor_set_destination_pixmap_priv_nc(dest_pixmap_priv); glamor_validate_pixmap(dest_pixmap); - if (!glamor_set_planemask(dest_pixmap, gc->planemask)) - goto fail; - glamor_set_alu(dispatch, gc->alu); if (!glamor_set_planemask(dest_pixmap, gc->planemask)) goto fail; glamor_get_drawable_deltas(drawable, dest_pixmap, &x_off, &y_off); + dispatch = glamor_get_dispatch(glamor_priv); + glamor_set_alu(dispatch, gc->alu); for (i = 0; i < n; i++) { n = REGION_NUM_RECTS(clip); @@ -103,6 +95,7 @@ _glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src, glamor_set_planemask(dest_pixmap, ~0); glamor_set_alu(dispatch, GXcopy); dispatch->glDisable(GL_SCISSOR_TEST); + glamor_put_dispatch(glamor_priv); ret = TRUE; goto done; @@ -120,7 +113,6 @@ fail: ret = TRUE; done: - GLAMOR_RESTORE_CONTEXT(glamor_priv); return ret; } diff --git a/glamor/glamor_tile.c b/glamor/glamor_tile.c index 3087bea6e..917078fa2 100644 --- a/glamor/glamor_tile.c +++ b/glamor/glamor_tile.c @@ -25,10 +25,6 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" /** @file glamor_tile.c @@ -60,7 +56,7 @@ glamor_init_tile_shader(ScreenPtr screen) GLint sampler_uniform_location; glamor_priv = glamor_get_screen_private(screen); - dispatch = &glamor_priv->dispatch; + dispatch = glamor_get_dispatch(glamor_priv); glamor_priv->tile_prog = dispatch->glCreateProgram(); vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, tile_vs); fs_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER, @@ -81,6 +77,7 @@ glamor_init_tile_shader(ScreenPtr screen) dispatch->glUseProgram(glamor_priv->tile_prog); dispatch->glUniform1i(sampler_uniform_location, 0); dispatch->glUseProgram(0); + glamor_put_dispatch(glamor_priv); } void @@ -90,8 +87,9 @@ glamor_fini_tile_shader(ScreenPtr screen) glamor_gl_dispatch *dispatch; glamor_priv = glamor_get_screen_private(screen); - dispatch = &glamor_priv->dispatch; + dispatch = glamor_get_dispatch(glamor_priv); dispatch->glDeleteProgram(glamor_priv->tile_prog); + glamor_put_dispatch(glamor_priv); } Bool @@ -103,7 +101,7 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, ScreenPtr screen = pixmap->drawable.pScreen; glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_gl_dispatch *dispatch = &glamor_priv->dispatch; + glamor_gl_dispatch *dispatch; int x1 = x; int x2 = x + width; int y1 = y; @@ -161,6 +159,7 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, glamor_validate_pixmap(pixmap); pixmap_priv_get_scale(dst_pixmap_priv, &dst_xscale, &dst_yscale); + dispatch = glamor_get_dispatch(glamor_priv); glamor_set_alu(dispatch, alu); if (GLAMOR_PIXMAP_PRIV_NO_PENDING(src_pixmap_priv)) { @@ -219,6 +218,7 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, dispatch->glUseProgram(0); glamor_set_alu(dispatch, GXcopy); glamor_set_planemask(pixmap, ~0); + glamor_put_dispatch(glamor_priv); return TRUE; fail: diff --git a/glamor/glamor_triangles.c b/glamor/glamor_triangles.c index 208ac77f1..e0f4a9708 100644 --- a/glamor/glamor_triangles.c +++ b/glamor/glamor_triangles.c @@ -26,10 +26,6 @@ * */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" static Bool diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h index a66e24802..4a51ba59e 100644 --- a/glamor/glamor_utils.h +++ b/glamor/glamor_utils.h @@ -664,31 +664,44 @@ static inline void glamor_dump_pixmap(PixmapPtr pixmap, int x, int y, int w, int glamor_finish_access(&pixmap->drawable, GLAMOR_ACCESS_RO); } -static inline void *glamor_make_current(ScreenPtr screen) +static inline void glamor_make_current(ScreenPtr screen) { - return glamor_egl_make_current(screen); + glamor_egl_make_current(screen); } -static inline void glamor_restore_current(ScreenPtr screen, void *previous_context) +static inline void glamor_restore_current(ScreenPtr screen) { - glamor_egl_restore_context(screen, previous_context); + glamor_egl_restore_context(screen); } #ifdef GLX_USE_SHARED_DISPATCH -#define GLAMOR_DEFINE_CONTEXT void *_previous_context_ = NULL -#define GLAMOR_SET_CONTEXT(glamor_priv) \ - if (glamor_priv->flags & GLAMOR_USE_EGL_SCREEN) \ - _previous_context_ = glamor_make_current(glamor_priv->screen) +static inline glamor_gl_dispatch * +glamor_get_dispatch(glamor_screen_private *glamor_priv) +{ + if (glamor_priv->flags & GLAMOR_USE_EGL_SCREEN) + glamor_make_current(glamor_priv->screen); -#define GLAMOR_RESTORE_CONTEXT(glamor_priv) \ - if ((glamor_priv->flags & GLAMOR_USE_EGL_SCREEN) \ - && _previous_context_ != NULL) \ - glamor_restore_current(glamor_priv->screen, _previous_context_) + return &glamor_priv->_dispatch; +} + +static inline void +glamor_put_dispatch(glamor_screen_private *glamor_priv) +{ + if (glamor_priv->flags & GLAMOR_USE_EGL_SCREEN) + glamor_restore_current(glamor_priv->screen); +} #else +#warning "Indirect GLX may be broken, need to implement context switch." +static inline glamor_gl_dispatch * +glamor_get_dispatch(glamor_screen_private *glamor_priv) +{ + return &glamor_priv->_dispatch; +} -#define GLAMOR_DEFINE_CONTEXT -#define GLAMOR_SET_CONTEXT(glamor_priv) -#define GLAMOR_RESTORE_CONTEXT(glamor_priv) +static inline void +glamor_put_dispatch(glamor_screen_private *glamor_priv) +{ +} #endif diff --git a/glamor/glamor_window.c b/glamor/glamor_window.c index f6e4cd175..3da11e447 100644 --- a/glamor/glamor_window.c +++ b/glamor/glamor_window.c @@ -21,10 +21,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - #include "glamor_priv.h" /** @file glamor_window.c