diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 45937214c53..7ff95957653 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -1376,20 +1376,9 @@ dri2_create_drawable(struct dri2_egl_display *dri2_dpy, const __DRIconfig *config, struct dri2_egl_surface *dri2_surf, void *loaderPrivate) { - if (dri2_dpy->kopper) { - dri2_surf->dri_drawable = kopperCreateNewDrawable( - dri2_dpy->dri_screen_render_gpu, config, loaderPrivate, - &(__DRIkopperDrawableInfo){ -#if defined(HAVE_X11_PLATFORM) && defined(HAVE_DRI3) - .multiplanes_available = dri2_dpy->multibuffers_available, -#endif - .is_pixmap = dri2_surf->base.Type == EGL_PBUFFER_BIT || - dri2_surf->base.Type == EGL_PIXMAP_BIT, - }); - } else { - dri2_surf->dri_drawable = driCreateNewDrawable( - dri2_dpy->dri_screen_render_gpu, config, loaderPrivate); - } + bool is_pixmap = dri2_surf->base.Type == EGL_PBUFFER_BIT || + dri2_surf->base.Type == EGL_PIXMAP_BIT; + dri2_surf->dri_drawable = dri_create_drawable(dri2_dpy->dri_screen_render_gpu, config, is_pixmap, loaderPrivate); if (dri2_surf->dri_drawable == NULL) return _eglError(EGL_BAD_ALLOC, "createNewDrawable"); diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index 5ea00ddc46a..6bea1466a2e 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -1989,21 +1989,13 @@ dri_set_blob_cache_funcs(__DRIscreen *sPriv, __DRIblobCacheSet set, * Backend function init_screen. */ -static struct dri_drawable * -dri2_create_drawable(struct dri_screen *screen, const struct gl_config *visual, - bool isPixmap, void *loaderPrivate) +void +dri2_init_drawable(struct dri_drawable *drawable, bool isPixmap, int alphaBits) { - struct dri_drawable *drawable = dri_create_drawable(screen, visual, isPixmap, - loaderPrivate); - if (!drawable) - return NULL; - drawable->allocate_textures = dri2_allocate_textures; drawable->flush_frontbuffer = dri2_flush_frontbuffer; drawable->update_tex_buffer = dri2_update_tex_buffer; drawable->flush_swapbuffers = dri2_flush_swapbuffers; - - return drawable; } /** @@ -2019,8 +2011,6 @@ dri2_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) screen->can_share_buffer = true; screen->auto_fake_front = dri_with_format(screen); - screen->create_drawable = dri2_create_drawable; - #ifdef HAVE_LIBDRM if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd, false)) pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred); @@ -2040,7 +2030,6 @@ dri_swrast_kms_init_screen(struct dri_screen *screen, bool driver_name_is_inferr struct pipe_screen *pscreen = NULL; screen->can_share_buffer = false; screen->auto_fake_front = dri_with_format(screen); - screen->create_drawable = dri2_create_drawable; #if defined(HAVE_DRISW_KMS) && defined(HAVE_SWRAST) if (pipe_loader_sw_probe_kms(&screen->dev, screen->fd)) diff --git a/src/gallium/frontends/dri/dri_drawable.c b/src/gallium/frontends/dri/dri_drawable.c index 0be51061743..68d31e6a803 100644 --- a/src/gallium/frontends/dri/dri_drawable.c +++ b/src/gallium/frontends/dri/dri_drawable.c @@ -148,18 +148,17 @@ dri_st_framebuffer_flush_swapbuffers(struct st_context *st, /** * This is called when we need to set up GL rendering to a new X window. */ -struct dri_drawable * -dri_create_drawable(struct dri_screen *screen, const struct gl_config *visual, +__DRIdrawable * +dri_create_drawable(__DRIscreen *psp, const __DRIconfig *config, bool isPixmap, void *loaderPrivate) { + struct dri_screen *screen = dri_screen(psp); + const struct gl_config *visual = &config->modes; struct dri_drawable *drawable = NULL; - if (isPixmap) - goto fail; /* not implemented */ - drawable = CALLOC_STRUCT(dri_drawable); - if (drawable == NULL) - goto fail; + if (!drawable) + return NULL; drawable->loaderPrivate = loaderPrivate; drawable->refcount = 1; @@ -181,10 +180,20 @@ dri_create_drawable(struct dri_screen *screen, const struct gl_config *visual, drawable->base.ID = p_atomic_inc_return(&drifb_ID); drawable->base.fscreen = &screen->base; - return drawable; -fail: - FREE(drawable); - return NULL; + switch (screen->type) { + case DRI_SCREEN_DRI3: + case DRI_SCREEN_KMS_SWRAST: + dri2_init_drawable(drawable, isPixmap, visual->alphaBits); + break; + case DRI_SCREEN_SWRAST: + drisw_init_drawable(drawable, isPixmap, visual->alphaBits); + break; + case DRI_SCREEN_KOPPER: + kopper_init_drawable(drawable, isPixmap, visual->alphaBits); + break; + } + + return opaque_dri_drawable(drawable); } static void diff --git a/src/gallium/frontends/dri/dri_drawable.h b/src/gallium/frontends/dri/dri_drawable.h index 06dcd92d76a..7c41daf4221 100644 --- a/src/gallium/frontends/dri/dri_drawable.h +++ b/src/gallium/frontends/dri/dri_drawable.h @@ -138,10 +138,6 @@ dri_get_drawable(struct dri_drawable *drawable) /*********************************************************************** * dri_drawable.c */ -struct dri_drawable * -dri_create_drawable(struct dri_screen *screen, const struct gl_config *visual, - bool isPixmap, void *loaderPrivate); - void dri_put_drawable(struct dri_drawable *drawable); @@ -172,6 +168,12 @@ drisw_update_tex_buffer(struct dri_drawable *drawable, struct dri_context *ctx, struct pipe_resource *res); +void +kopper_init_drawable(struct dri_drawable *drawable, bool isPixmap, int alphaBits); +void +drisw_init_drawable(struct dri_drawable *drawable, bool isPixmap, int alphaBits); +void +dri2_init_drawable(struct dri_drawable *drawable, bool isPixmap, int alphaBits); #endif /* vim: set sw=3 ts=8 sts=3 expandtab: */ diff --git a/src/gallium/frontends/dri/dri_screen.h b/src/gallium/frontends/dri/dri_screen.h index 9b6b7d8217b..32114095c29 100644 --- a/src/gallium/frontends/dri/dri_screen.h +++ b/src/gallium/frontends/dri/dri_screen.h @@ -130,11 +130,6 @@ struct dri_screen struct pipe_screen *unwrapped_screen; bool has_dmabuf; bool is_sw; - - struct dri_drawable *(*create_drawable)(struct dri_screen *screen, - const struct gl_config *glVis, - bool pixmapBuffer, - void *loaderPrivate); }; /** cast wrapper */ diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c index 28eeb8d5d73..253d2834f88 100644 --- a/src/gallium/frontends/dri/dri_util.c +++ b/src/gallium/frontends/dri/dri_util.c @@ -714,21 +714,6 @@ int driUnbindContext(__DRIcontext *pcp) /*@}*/ -__DRIdrawable * -driCreateNewDrawable(__DRIscreen *psp, - const __DRIconfig *config, - void *data) -{ - assert(data != NULL); - - struct dri_screen *screen = dri_screen(psp); - struct dri_drawable *drawable = - screen->create_drawable(screen, &config->modes, GL_FALSE, data); - drawable->buffer_age = 0; - - return opaque_dri_drawable(drawable); -} - void driDestroyDrawable(__DRIdrawable *pdp) { diff --git a/src/gallium/frontends/dri/dri_util.h b/src/gallium/frontends/dri/dri_util.h index 25fb412632c..09ee4b6ba6e 100644 --- a/src/gallium/frontends/dri/dri_util.h +++ b/src/gallium/frontends/dri/dri_util.h @@ -123,7 +123,8 @@ driImageFormatToSizedInternalGLFormat(uint32_t image_format); PUBLIC unsigned int driGetAPIMask(__DRIscreen *screen); PUBLIC __DRIdrawable * -driCreateNewDrawable(__DRIscreen *psp, const __DRIconfig *config, void *data); +dri_create_drawable(__DRIscreen *psp, const __DRIconfig *config, + bool isPixmap, void *loaderPrivate); extern const __DRIimageDriverExtension driImageDriverExtension; PUBLIC void driDestroyScreen(__DRIscreen *psp); PUBLIC int diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index 04eff24c61b..d00120b60b3 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -603,23 +603,15 @@ static const struct drisw_loader_funcs drisw_shm_lf = { .put_image_shm = drisw_put_image_shm }; -static struct dri_drawable * -drisw_create_drawable(struct dri_screen *screen, const struct gl_config * visual, - bool isPixmap, void *loaderPrivate) +void +drisw_init_drawable(struct dri_drawable *drawable, bool isPixmap, int alphaBits) { - struct dri_drawable *drawable = dri_create_drawable(screen, visual, isPixmap, - loaderPrivate); - if (!drawable) - return NULL; - drawable->allocate_textures = drisw_allocate_textures; drawable->update_drawable_info = drisw_update_drawable_info; drawable->flush_frontbuffer = drisw_flush_frontbuffer; drawable->update_tex_buffer = drisw_update_tex_buffer; drawable->swap_buffers = drisw_swap_buffers; drawable->swap_buffers_with_damage = drisw_swap_buffers_with_damage; - - return drawable; } struct pipe_screen * @@ -635,7 +627,6 @@ drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) if (loader->putImageShm) lf = &drisw_shm_lf; } - screen->create_drawable = drisw_create_drawable; bool success = false; #ifdef HAVE_DRISW_KMS diff --git a/src/gallium/frontends/dri/kopper.c b/src/gallium/frontends/dri/kopper.c index e02f8956f0a..a33d6e3f528 100644 --- a/src/gallium/frontends/dri/kopper.c +++ b/src/gallium/frontends/dri/kopper.c @@ -69,7 +69,6 @@ kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) } screen->can_share_buffer = true; - screen->create_drawable = kopper_create_drawable; bool success; #ifdef HAVE_LIBDRM @@ -505,17 +504,11 @@ kopper_swap_buffers(struct dri_drawable *drawable); static void kopper_swap_buffers_with_damage(struct dri_drawable *drawable, int nrects, const int *rects); -static struct dri_drawable * -kopper_create_drawable(struct dri_screen *screen, const struct gl_config *visual, - bool isPixmap, void *loaderPrivate) +void +kopper_init_drawable(struct dri_drawable *drawable, bool isPixmap, int alphaBits) { - /* always pass !pixmap because it isn't "handled" or relevant */ - struct dri_drawable *drawable = dri_create_drawable(screen, visual, false, - loaderPrivate); - if (!drawable) - return NULL; + struct dri_screen *screen = drawable->screen; - // and fill in the vtable drawable->allocate_textures = kopper_allocate_textures; drawable->update_drawable_info = kopper_update_drawable_info; drawable->flush_frontbuffer = kopper_flush_frontbuffer; @@ -524,13 +517,11 @@ kopper_create_drawable(struct dri_screen *screen, const struct gl_config *visual drawable->swap_buffers = kopper_swap_buffers; drawable->swap_buffers_with_damage = kopper_swap_buffers_with_damage; - drawable->info.has_alpha = visual->alphaBits > 0; + drawable->info.has_alpha = alphaBits > 0; if (screen->kopper_loader->SetSurfaceCreateInfo) screen->kopper_loader->SetSurfaceCreateInfo(drawable->loaderPrivate, &drawable->info); drawable->is_window = !isPixmap && drawable->info.bos.sType != 0; - - return drawable; } int64_t @@ -606,20 +597,6 @@ kopper_swap_buffers(struct dri_drawable *drawable) kopper_swap_buffers_with_damage(drawable, 0, NULL); } -__DRIdrawable * -kopperCreateNewDrawable(__DRIscreen *psp, - const __DRIconfig *config, - void *data, - __DRIkopperDrawableInfo *info) -{ - assert(data != NULL); - - struct dri_screen *screen = dri_screen(psp); - struct dri_drawable *drawable = kopper_create_drawable(screen, &config->modes, info->is_pixmap, data); - - return opaque_dri_drawable(drawable); -} - void kopperSetSwapInterval(__DRIdrawable *dPriv, int interval) { diff --git a/src/gallium/frontends/dri/kopper_stubs.c b/src/gallium/frontends/dri/kopper_stubs.c index 3182add37ce..0d119c7cfb3 100644 --- a/src/gallium/frontends/dri/kopper_stubs.c +++ b/src/gallium/frontends/dri/kopper_stubs.c @@ -14,15 +14,6 @@ kopperSwapBuffersWithDamage(__DRIdrawable *dPriv, uint32_t flush_flags, int nrec return 0; } -__DRIdrawable * -kopperCreateNewDrawable(__DRIscreen *psp, - const __DRIconfig *config, - void *data, - __DRIkopperDrawableInfo *info) -{ - return NULL; -} - void kopperSetSwapInterval(__DRIdrawable *dPriv, int interval) { @@ -41,3 +32,11 @@ kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) { return NULL; } + +struct dri_drawable; +void +kopper_init_drawable(struct dri_drawable *drawable, bool isPixmap, int alphaBits); +void +kopper_init_drawable(struct dri_drawable *drawable, bool isPixmap, int alphaBits) +{ +} diff --git a/src/gallium/frontends/dri/loader_dri3_helper.c b/src/gallium/frontends/dri/loader_dri3_helper.c index cb6271c1c01..49cff99174e 100644 --- a/src/gallium/frontends/dri/loader_dri3_helper.c +++ b/src/gallium/frontends/dri/loader_dri3_helper.c @@ -423,7 +423,8 @@ loader_dri3_drawable_init(xcb_connection_t *conn, dri3_update_max_num_back(draw); /* Create a new drawable */ - draw->dri_drawable = driCreateNewDrawable(dri_screen_render_gpu, dri_config, draw); + draw->dri_drawable = dri_create_drawable(dri_screen_render_gpu, dri_config, + type == LOADER_DRI3_DRAWABLE_PIXMAP, draw); if (!draw->dri_drawable) return 1; diff --git a/src/gallium/targets/dri/dri.sym.in b/src/gallium/targets/dri/dri.sym.in index 0e0317ef713..3bc01424171 100644 --- a/src/gallium/targets/dri/dri.sym.in +++ b/src/gallium/targets/dri/dri.sym.in @@ -64,6 +64,7 @@ dri_get_screen_param; dri3*; loader_dri3*; + dri_create_drawable; @nouveau_drm_screen_create@ @radeon_drm_winsys_create@ @amdgpu_winsys_create@ diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 20cfff77e5c..e21c9302483 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -300,7 +300,7 @@ dri2CreateDrawable(struct glx_screen *base, XID xDrawable, DRI2CreateDrawable(psc->base.dpy, xDrawable); /* Create a new drawable */ pdraw->driDrawable = - driCreateNewDrawable(psc->driScreen, config->driConfig, pdraw); + dri_create_drawable(psc->driScreen, config->driConfig, false, pdraw); if (!pdraw->driDrawable) { DRI2DestroyDrawable(psc->base.dpy, xDrawable); diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index e42dc19256f..1aadb4bcb19 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -683,19 +683,9 @@ driswCreateDrawable(struct glx_screen *base, XID xDrawable, pdp->swapInterval = dri_get_initial_swap_interval(psc->driScreen); /* Create a new drawable */ - if (psc->kopper) { - pdp->driDrawable = - kopperCreateNewDrawable(psc->driScreen, config->driConfig, pdp, - &(__DRIkopperDrawableInfo){ - .multiplanes_available = base->display->has_multibuffer, - .is_pixmap = !(type & GLX_WINDOW_BIT), - }); - + pdp->driDrawable = dri_create_drawable(psc->driScreen, config->driConfig, !(type & GLX_WINDOW_BIT), pdp); + if (psc->kopper) kopperSetSwapInterval(pdp->driDrawable, pdp->swapInterval); - } - else - pdp->driDrawable = - driCreateNewDrawable(psc->driScreen, config->driConfig, pdp); if (!pdp->driDrawable) { XDestroyDrawable(pdp, psc->base.dpy, xDrawable);