On Friday, 2016-11-11 16:31:16 +0000, Emil Velikov wrote: > From: Emil Velikov <emil.veli...@collabora.com> > > Just fetch and store it once, rather than doing the > xcb_setup_roots_iterator + get_xcb_screen dance five times. > > Signed-off-by: Emil Velikov <emil.veli...@collabora.com> > --- > These two patches are an example of the duplication we have within each > loader (be that egl, gbm or glx)_and how we can fold it up :-) > > src/egl/drivers/dri2/egl_dri2.h | 2 +- > src/egl/drivers/dri2/platform_x11.c | 51 > ++++++++++---------------------- > src/egl/drivers/dri2/platform_x11_dri3.c | 32 ++------------------ > 3 files changed, 19 insertions(+), 66 deletions(-) > > diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h > index 0020a5b..fa94cbe 100644 > --- a/src/egl/drivers/dri2/egl_dri2.h > +++ b/src/egl/drivers/dri2/egl_dri2.h > @@ -199,7 +199,7 @@ struct dri2_egl_display > > #ifdef HAVE_X11_PLATFORM > xcb_connection_t *conn; > - int screen; > + xcb_screen_t *screen; > int swap_available; > #ifdef HAVE_DRI3 > struct loader_dri3_extensions loader_dri3_ext; > diff --git a/src/egl/drivers/dri2/platform_x11.c > b/src/egl/drivers/dri2/platform_x11.c > index e152868..f4bcf4a 100644 > --- a/src/egl/drivers/dri2/platform_x11.c > +++ b/src/egl/drivers/dri2/platform_x11.c > @@ -206,10 +206,8 @@ dri2_x11_create_surface(_EGLDriver *drv, _EGLDisplay > *disp, EGLint type, > struct dri2_egl_surface *dri2_surf; > xcb_get_geometry_cookie_t cookie; > xcb_get_geometry_reply_t *reply; > - xcb_screen_iterator_t s; > xcb_generic_error_t *error; > xcb_drawable_t drawable; > - xcb_screen_t *screen; > const __DRIconfig *config; > > STATIC_ASSERT(sizeof(uintptr_t) == sizeof(native_surface)); > @@ -228,16 +226,9 @@ dri2_x11_create_surface(_EGLDriver *drv, _EGLDisplay > *disp, EGLint type, > > dri2_surf->region = XCB_NONE; > if (type == EGL_PBUFFER_BIT) { > - s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); > - screen = get_xcb_screen(s, dri2_dpy->screen); > - if (!screen) { > - _eglError(EGL_BAD_ALLOC, "failed to get xcb screen"); > - goto cleanup_surf; > - } > - > dri2_surf->drawable = xcb_generate_id(dri2_dpy->conn); > xcb_create_pixmap(dri2_dpy->conn, conf->BufferSize, > - dri2_surf->drawable, screen->root, > + dri2_surf->drawable, dri2_dpy->screen->root, > dri2_surf->base.Width, dri2_surf->base.Height); > } else { > if (!drawable) { > @@ -544,20 +535,10 @@ dri2_x11_do_authenticate(struct dri2_egl_display > *dri2_dpy, uint32_t id) > { > xcb_dri2_authenticate_reply_t *authenticate; > xcb_dri2_authenticate_cookie_t authenticate_cookie; > - xcb_screen_iterator_t s; > - xcb_screen_t *screen; > int ret = 0; > > - s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); > - > - screen = get_xcb_screen(s, dri2_dpy->screen); > - if (!screen) { > - _eglLog(_EGL_WARNING, "DRI2: failed to get xcb screen"); > - return -1; > - } > - > authenticate_cookie = > - xcb_dri2_authenticate_unchecked(dri2_dpy->conn, screen->root, id); > + xcb_dri2_authenticate_unchecked(dri2_dpy->conn, > dri2_dpy->screen->root, id); > authenticate = > xcb_dri2_authenticate_reply(dri2_dpy->conn, authenticate_cookie, NULL); > > @@ -598,8 +579,6 @@ dri2_x11_connect(struct dri2_egl_display *dri2_dpy) > xcb_dri2_connect_reply_t *connect; > xcb_dri2_connect_cookie_t connect_cookie; > xcb_generic_error_t *error; > - xcb_screen_iterator_t s; > - xcb_screen_t *screen; > char *driver_name, *loader_driver_name, *device_name; > const xcb_query_extension_reply_t *extension; > > @@ -622,13 +601,7 @@ dri2_x11_connect(struct dri2_egl_display *dri2_dpy) > XCB_DRI2_MAJOR_VERSION, > XCB_DRI2_MINOR_VERSION); > > - s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); > - screen = get_xcb_screen(s, dri2_dpy->screen); > - if (!screen) { > - _eglLog(_EGL_WARNING, "DRI2: failed to get xcb screen"); > - return EGL_FALSE; > - } > - connect_cookie = xcb_dri2_connect_unchecked(dri2_dpy->conn, screen->root, > + connect_cookie = xcb_dri2_connect_unchecked(dri2_dpy->conn, > dri2_dpy->screen->root, > XCB_DRI2_DRIVER_TYPE_DRI); > > xfixes_query = > @@ -720,7 +693,6 @@ static EGLBoolean > dri2_x11_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy, > _EGLDisplay *disp, bool supports_preserved) > { > - xcb_screen_iterator_t s; > xcb_depth_iterator_t d; > xcb_visualtype_t *visuals; > int i, j, count; > @@ -732,8 +704,7 @@ dri2_x11_add_configs_for_visuals(struct dri2_egl_display > *dri2_dpy, > EGL_NONE > }; > > - s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); > - d = xcb_screen_allowed_depths_iterator(get_xcb_screen(s, > dri2_dpy->screen)); > + d = xcb_screen_allowed_depths_iterator(dri2_dpy->screen); > count = 0; > > surface_type = > @@ -1183,20 +1154,30 @@ static EGLBoolean > dri2_get_xcb_connection(_EGLDriver *drv, _EGLDisplay *disp, > struct dri2_egl_display *dri2_dpy) > { > + xcb_screen_iterator_t s; > + int screen = 0; > + > disp->DriverData = (void *) dri2_dpy; > if (disp->PlatformDisplay == NULL) { > - dri2_dpy->conn = xcb_connect(0, &dri2_dpy->screen); > + dri2_dpy->conn = xcb_connect(NULL, &screen); > dri2_dpy->own_device = true; > } else { > Display *dpy = disp->PlatformDisplay; > > dri2_dpy->conn = XGetXCBConnection(dpy); > - dri2_dpy->screen = DefaultScreen(dpy); > + screen = DefaultScreen(dpy); > } > > if (!dri2_dpy->conn || xcb_connection_has_error(dri2_dpy->conn)) > return _eglError(EGL_BAD_ALLOC, "xcb_connect failed"); > > + s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); > + dri2_dpy->screen = get_xcb_screen(s, screen); > + if (!dri2_dpy->screen) { > + _eglError(EGL_BAD_ALLOC, "failed to get xcb screen"); > + return EGL_FALSE;
Shouldn't we disconnect xcb here? We're past the point handling its failure, so it should be connected now. With that fixed, the series is Reviewed-by: Eric Engestrom <eric.engest...@imgtec.com> > + } > + > return EGL_TRUE; > } > > diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c > b/src/egl/drivers/dri2/platform_x11_dri3.c > index 475ec05..5542925 100644 > --- a/src/egl/drivers/dri2/platform_x11_dri3.c > +++ b/src/egl/drivers/dri2/platform_x11_dri3.c > @@ -160,16 +160,6 @@ dri3_set_swap_interval(_EGLDriver *drv, _EGLDisplay > *disp, _EGLSurface *surf, > return EGL_TRUE; > } > > -static xcb_screen_t * > -get_xcb_screen(xcb_screen_iterator_t iter, int screen) > -{ > - for (; iter.rem; --screen, xcb_screen_next(&iter)) > - if (screen == 0) > - return iter.data; > - > - return NULL; > -} > - > static _EGLSurface * > dri3_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, > _EGLConfig *conf, void *native_surface, > @@ -180,8 +170,6 @@ dri3_create_surface(_EGLDriver *drv, _EGLDisplay *disp, > EGLint type, > struct dri3_egl_surface *dri3_surf; > const __DRIconfig *dri_config; > xcb_drawable_t drawable; > - xcb_screen_iterator_t s; > - xcb_screen_t *screen; > > STATIC_ASSERT(sizeof(uintptr_t) == sizeof(native_surface)); > drawable = (uintptr_t) native_surface; > @@ -198,16 +186,9 @@ dri3_create_surface(_EGLDriver *drv, _EGLDisplay *disp, > EGLint type, > goto cleanup_surf; > > if (type == EGL_PBUFFER_BIT) { > - s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); > - screen = get_xcb_screen(s, dri2_dpy->screen); > - if (!screen) { > - _eglError(EGL_BAD_NATIVE_WINDOW, "dri3_create_surface"); > - goto cleanup_surf; > - } > - > drawable = xcb_generate_id(dri2_dpy->conn); > xcb_create_pixmap(dri2_dpy->conn, conf->BufferSize, > - drawable, screen->root, > + drawable, dri2_dpy->screen->root, > dri3_surf->base.Width, dri3_surf->base.Height); > } > > @@ -473,8 +454,6 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy) > xcb_present_query_version_reply_t *present_query; > xcb_present_query_version_cookie_t present_query_cookie; > xcb_generic_error_t *error; > - xcb_screen_iterator_t s; > - xcb_screen_t *screen; > const xcb_query_extension_reply_t *extension; > > xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_dri3_id); > @@ -517,14 +496,7 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy) > } > free(present_query); > > - s = xcb_setup_roots_iterator(xcb_get_setup(dri2_dpy->conn)); > - screen = get_xcb_screen(s, dri2_dpy->screen); > - if (!screen) { > - _eglError(EGL_BAD_NATIVE_WINDOW, "dri3_x11_connect"); > - return EGL_FALSE; > - } > - > - dri2_dpy->fd = loader_dri3_open(dri2_dpy->conn, screen->root, 0); > + dri2_dpy->fd = loader_dri3_open(dri2_dpy->conn, dri2_dpy->screen->root, > 0); > if (dri2_dpy->fd < 0) { > int conn_error = xcb_connection_has_error(dri2_dpy->conn); > _eglLog(_EGL_WARNING, "DRI3: Screen seems not DRI3 capable"); > -- > 2.10.2 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev