diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index 41b8426bbe0..6f15604c5cb 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -128,7 +128,7 @@ dri2_drawable_get_buffers(struct dri_drawable *drawable, const enum st_attachment_type *atts, unsigned *count) { - const __DRIdri2LoaderExtension *loader = drawable->sPriv->dri2.loader; + const __DRIdri2LoaderExtension *loader = drawable->screen->dri2.loader; boolean with_format; __DRIbuffer *buffers; int num_buffers; @@ -137,7 +137,7 @@ dri2_drawable_get_buffers(struct dri_drawable *drawable, assert(loader); assert(*count <= __DRI_BUFFER_COUNT); - with_format = dri_with_format(drawable->sPriv); + with_format = dri_with_format(drawable->screen); num_attachments = 0; @@ -244,7 +244,6 @@ dri_image_drawable_get_buffers(struct dri_drawable *drawable, const enum st_attachment_type *statts, unsigned statts_count) { - __DRIscreen *sPriv = drawable->sPriv; unsigned int image_format = __DRI_IMAGE_FORMAT_NONE; enum pipe_format pf; uint32_t buffer_mask = 0; @@ -324,7 +323,8 @@ dri_image_drawable_get_buffers(struct dri_drawable *drawable, * st_api_make_current * st_manager_validate_framebuffers (part of st_validate_state) */ - return sPriv->image.loader->getBuffers(opaque_dri_drawable(drawable), + return drawable->screen->image.loader->getBuffers( + opaque_dri_drawable(drawable), image_format, (uint32_t *)&drawable->base.stamp, drawable->loaderPrivate, buffer_mask, @@ -332,11 +332,10 @@ dri_image_drawable_get_buffers(struct dri_drawable *drawable, } static __DRIbuffer * -dri2_allocate_buffer(__DRIscreen *sPriv, +dri2_allocate_buffer(struct dri_screen *screen, unsigned attachment, unsigned format, int width, int height) { - struct dri_screen *screen = dri_screen(sPriv); struct dri2_buffer *buffer; struct pipe_resource templ; enum pipe_format pf; @@ -428,7 +427,7 @@ dri2_allocate_buffer(__DRIscreen *sPriv, } static void -dri2_release_buffer(__DRIscreen *sPriv, __DRIbuffer *bPriv) +dri2_release_buffer(__DRIbuffer *bPriv) { struct dri2_buffer *buffer = dri2_buffer(bPriv); @@ -475,12 +474,11 @@ dri2_allocate_textures(struct dri_context *ctx, const enum st_attachment_type *statts, unsigned statts_count) { - __DRIscreen *sPriv = drawable->sPriv; - struct dri_screen *screen = dri_screen(sPriv); + struct dri_screen *screen = drawable->screen; struct pipe_resource templ; boolean alloc_depthstencil = FALSE; unsigned i, j, bind; - const __DRIimageLoaderExtension *image = sPriv->image.loader; + const __DRIimageLoaderExtension *image = screen->image.loader; /* Image specific variables */ struct __DRIimageList images; /* Dri2 specific variables */ @@ -778,10 +776,10 @@ dri2_flush_frontbuffer(struct dri_context *ctx, struct dri_drawable *drawable, enum st_attachment_type statt) { - const __DRIimageLoaderExtension *image = drawable->sPriv->image.loader; - const __DRIdri2LoaderExtension *loader = drawable->sPriv->dri2.loader; + const __DRIimageLoaderExtension *image = drawable->screen->image.loader; + const __DRIdri2LoaderExtension *loader = drawable->screen->dri2.loader; const __DRImutableRenderBufferLoaderExtension *shared_buffer_loader = - drawable->sPriv->mutableRenderBuffer.loader; + drawable->screen->mutableRenderBuffer.loader; struct pipe_context *pipe = ctx->st->pipe; struct pipe_fence_handle *fence = NULL; int fence_fd = -1; @@ -847,7 +845,7 @@ static void dri2_flush_swapbuffers(struct dri_context *ctx, struct dri_drawable *drawable) { - const __DRIimageLoaderExtension *image = drawable->sPriv->image.loader; + const __DRIimageLoaderExtension *image = drawable->screen->image.loader; if (image && image->base.version >= 3 && image->flushSwapBuffers) { image->flushSwapBuffers(opaque_dri_drawable(drawable), @@ -1024,7 +1022,7 @@ dri2_create_image_from_winsys(__DRIscreen *_screen, img->use = 0; img->in_fence_fd = -1; img->loader_private = loaderPrivate; - img->sPriv = _screen; + img->screen = screen; return img; } @@ -1238,7 +1236,7 @@ dri2_create_image_common(__DRIscreen *_screen, img->in_fence_fd = -1; img->loader_private = loaderPrivate; - img->sPriv = _screen; + img->screen = screen; return img; } @@ -1506,7 +1504,7 @@ dri2_dup_image(__DRIimage *image, void *loaderPrivate) img->in_fence_fd = (image->in_fence_fd > 0) ? os_dupfd_cloexec(image->in_fence_fd) : -1; img->loader_private = loaderPrivate; - img->sPriv = image->sPriv; + img->screen = image->screen; return img; } @@ -2218,7 +2216,7 @@ dri2_init_screen_extensions(struct dri_screen *screen, sizeof(dri_screen_extensions_base)); memcpy(&screen->screen_extensions, dri_screen_extensions_base, sizeof(dri_screen_extensions_base)); - screen->sPriv->extensions = screen->screen_extensions; + screen->extensions = screen->screen_extensions; /* Point nExt at the end of the extension list */ nExt = &screen->screen_extensions[ARRAY_SIZE(dri_screen_extensions_base)]; @@ -2238,7 +2236,7 @@ dri2_init_screen_extensions(struct dri_screen *screen, if (pscreen->get_param(pscreen, PIPE_CAP_DMABUF)) { uint64_t cap; - if (drmGetCap(screen->sPriv->fd, DRM_CAP_PRIME, &cap) == 0 && + if (drmGetCap(screen->fd, DRM_CAP_PRIME, &cap) == 0 && (cap & DRM_PRIME_CAP_IMPORT)) { screen->image_extension.createImageFromFds = dri2_from_fds; screen->image_extension.createImageFromFds2 = dri2_from_fds2; @@ -2283,22 +2281,13 @@ dri2_init_screen_extensions(struct dri_screen *screen, * Returns the struct gl_config supported by this driver. */ static const __DRIconfig ** -dri2_init_screen(__DRIscreen * sPriv) +dri2_init_screen(struct dri_screen *screen) { const __DRIconfig **configs; - struct dri_screen *screen; struct pipe_screen *pscreen = NULL; - screen = CALLOC_STRUCT(dri_screen); - if (!screen) - return NULL; - - screen->sPriv = sPriv; - screen->fd = sPriv->fd; (void) mtx_init(&screen->opencl_func_mutex, mtx_plain); - sPriv->driverPrivate = (void *)screen; - if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd)) { pscreen = pipe_loader_create_screen(screen->dev); dri_init_options(screen); @@ -2319,10 +2308,10 @@ dri2_init_screen(__DRIscreen * sPriv) goto destroy_screen; screen->can_share_buffer = true; - screen->auto_fake_front = dri_with_format(sPriv); + screen->auto_fake_front = dri_with_format(screen); screen->lookup_egl_image = dri2_lookup_egl_image; - const __DRIimageLookupExtension *loader = sPriv->dri2.image; + const __DRIimageLookupExtension *loader = screen->dri2.image; if (loader && loader->base.version >= 2 && loader->validateEGLImage && @@ -2340,7 +2329,6 @@ release_pipe: if (screen->dev) pipe_loader_release(&screen->dev, 1); - FREE(screen); return NULL; } @@ -2350,22 +2338,12 @@ release_pipe: * Returns the struct gl_config supported by this driver. */ static const __DRIconfig ** -dri_swrast_kms_init_screen(__DRIscreen * sPriv) +dri_swrast_kms_init_screen(struct dri_screen *screen) { #if defined(GALLIUM_SOFTPIPE) const __DRIconfig **configs; - struct dri_screen *screen; struct pipe_screen *pscreen = NULL; - screen = CALLOC_STRUCT(dri_screen); - if (!screen) - return NULL; - - screen->sPriv = sPriv; - screen->fd = sPriv->fd; - - sPriv->driverPrivate = (void *)screen; - #ifdef HAVE_DRISW_KMS if (pipe_loader_sw_probe_kms(&screen->dev, screen->fd)) { pscreen = pipe_loader_create_screen(screen->dev); @@ -2383,10 +2361,10 @@ dri_swrast_kms_init_screen(__DRIscreen * sPriv) goto destroy_screen; screen->can_share_buffer = false; - screen->auto_fake_front = dri_with_format(sPriv); + screen->auto_fake_front = dri_with_format(screen); screen->lookup_egl_image = dri2_lookup_egl_image; - const __DRIimageLookupExtension *loader = sPriv->dri2.image; + const __DRIimageLookupExtension *loader = screen->dri2.image; if (loader && loader->base.version >= 2 && loader->validateEGLImage && @@ -2404,16 +2382,15 @@ release_pipe: if (screen->dev) pipe_loader_release(&screen->dev, 1); - FREE(screen); #endif // GALLIUM_SOFTPIPE return NULL; } static struct dri_drawable * -dri2_create_buffer(__DRIscreen *sPriv, const struct gl_config *visual, +dri2_create_buffer(struct dri_screen *screen, const struct gl_config *visual, boolean isPixmap, void *loaderPrivate) { - struct dri_drawable *drawable = dri_create_buffer(sPriv, visual, isPixmap, + struct dri_drawable *drawable = dri_create_buffer(screen, visual, isPixmap, loaderPrivate); if (!drawable) return NULL; diff --git a/src/gallium/frontends/dri/dri_context.c b/src/gallium/frontends/dri/dri_context.c index 2fd1e346d2c..48919c1f5d8 100644 --- a/src/gallium/frontends/dri/dri_context.c +++ b/src/gallium/frontends/dri/dri_context.c @@ -60,7 +60,7 @@ dri_create_context(struct dri_screen *screen, __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR | __DRIVER_CONTEXT_ATTRIB_NO_ERROR; const __DRIbackgroundCallableExtension *backgroundCallable = - screen->sPriv->dri2.backgroundCallable; + screen->dri2.backgroundCallable; const struct driOptionCache *optionCache = &screen->dev->option_cache; if (screen->has_reset_status_query) { @@ -350,7 +350,7 @@ dri_make_current(struct dri_context *ctx, } struct dri_context * -dri_get_current(__DRIscreen *sPriv) +dri_get_current(void) { struct st_context_iface *st = st_api_get_current(); diff --git a/src/gallium/frontends/dri/dri_context.h b/src/gallium/frontends/dri/dri_context.h index f4b7da5d16a..3063f4c7fa2 100644 --- a/src/gallium/frontends/dri/dri_context.h +++ b/src/gallium/frontends/dri/dri_context.h @@ -104,7 +104,7 @@ dri_make_current(struct dri_context *ctx, struct dri_drawable *read); struct dri_context * -dri_get_current(__DRIscreen * driScreenPriv); +dri_get_current(void); struct dri_context * dri_create_context(struct dri_screen *screen, diff --git a/src/gallium/frontends/dri/dri_drawable.c b/src/gallium/frontends/dri/dri_drawable.c index 646bdf46223..01a6da8c11d 100644 --- a/src/gallium/frontends/dri/dri_drawable.c +++ b/src/gallium/frontends/dri/dri_drawable.c @@ -50,7 +50,7 @@ dri_st_framebuffer_validate(struct st_context_iface *stctx, struct dri_context *ctx = (struct dri_context *)stctx->st_manager_private; struct dri_drawable *drawable = (struct dri_drawable *) stfbi->st_manager_private; - struct dri_screen *screen = dri_screen(drawable->sPriv); + struct dri_screen *screen = drawable->screen; unsigned statt_mask, new_mask; bool new_stamp; int i; @@ -143,10 +143,9 @@ dri_st_framebuffer_flush_swapbuffers(struct st_context_iface *stctx, * This is called when we need to set up GL rendering to a new X window. */ struct dri_drawable * -dri_create_buffer(__DRIscreen *sPriv, const struct gl_config *visual, +dri_create_buffer(struct dri_screen *screen, const struct gl_config *visual, bool isPixmap, void *loaderPrivate) { - struct dri_screen *screen = sPriv->driverPrivate; struct dri_drawable *drawable = NULL; if (isPixmap) @@ -157,7 +156,6 @@ dri_create_buffer(__DRIscreen *sPriv, const struct gl_config *visual, goto fail; drawable->loaderPrivate = loaderPrivate; - drawable->sPriv = sPriv; drawable->ctx = NULL; drawable->refcount = 1; drawable->lastStamp = 0; @@ -174,7 +172,6 @@ dri_create_buffer(__DRIscreen *sPriv, const struct gl_config *visual, drawable->base.st_manager_private = (void *) drawable; drawable->screen = screen; - drawable->sPriv = sPriv; p_atomic_set(&drawable->base.stamp, 1); drawable->base.ID = p_atomic_inc_return(&drifb_ID); diff --git a/src/gallium/frontends/dri/dri_drawable.h b/src/gallium/frontends/dri/dri_drawable.h index c2cf5c7e01a..a184ce77bf7 100644 --- a/src/gallium/frontends/dri/dri_drawable.h +++ b/src/gallium/frontends/dri/dri_drawable.h @@ -43,7 +43,6 @@ struct dri_drawable struct st_visual stvis; struct dri_screen *screen; - __DRIscreen *sPriv; __DRIbuffer old[__DRI_BUFFER_COUNT]; unsigned old_num; @@ -134,7 +133,7 @@ dri_get_drawable(struct dri_drawable *drawable) * dri_drawable.c */ struct dri_drawable * -dri_create_buffer(__DRIscreen *sPriv, const struct gl_config *visual, +dri_create_buffer(struct dri_screen *screen, const struct gl_config *visual, bool isPixmap, void *loaderPrivate); void diff --git a/src/gallium/frontends/dri/dri_helpers.c b/src/gallium/frontends/dri/dri_helpers.c index 20c0f734548..ec78607efdf 100644 --- a/src/gallium/frontends/dri/dri_helpers.c +++ b/src/gallium/frontends/dri/dri_helpers.c @@ -261,14 +261,14 @@ const __DRI2fenceExtension dri2FenceExtension = { __DRIimage * dri2_lookup_egl_image(struct dri_screen *screen, void *handle) { - const __DRIimageLookupExtension *loader = screen->sPriv->dri2.image; + const __DRIimageLookupExtension *loader = screen->dri2.image; __DRIimage *img; if (!loader->lookupEGLImage) return NULL; - img = loader->lookupEGLImage(screen->sPriv, - handle, screen->sPriv->loaderPrivate); + img = loader->lookupEGLImage(opaque_dri_screen(screen), + handle, screen->loaderPrivate); return img; } @@ -276,17 +276,17 @@ dri2_lookup_egl_image(struct dri_screen *screen, void *handle) boolean dri2_validate_egl_image(struct dri_screen *screen, void *handle) { - const __DRIimageLookupExtension *loader = screen->sPriv->dri2.image; + const __DRIimageLookupExtension *loader = screen->dri2.image; - return loader->validateEGLImage(handle, screen->sPriv->loaderPrivate); + return loader->validateEGLImage(handle, screen->loaderPrivate); } __DRIimage * dri2_lookup_egl_image_validated(struct dri_screen *screen, void *handle) { - const __DRIimageLookupExtension *loader = screen->sPriv->dri2.image; + const __DRIimageLookupExtension *loader = screen->dri2.image; - return loader->lookupEGLImageValidated(handle, screen->sPriv->loaderPrivate); + return loader->lookupEGLImageValidated(handle, screen->loaderPrivate); } __DRIimage * @@ -341,7 +341,7 @@ dri2_create_image_from_renderbuffer2(__DRIcontext *context, img->dri_format = driGLFormatToImageFormat(rb->Format); img->internal_format = rb->InternalFormat; img->loader_private = loaderPrivate; - img->sPriv = dri_ctx->screen->sPriv; + img->screen = dri_ctx->screen; img->in_fence_fd = -1; pipe_resource_reference(&img->texture, tex); @@ -370,8 +370,8 @@ dri2_create_image_from_renderbuffer(__DRIcontext *context, void dri2_destroy_image(__DRIimage *img) { - const __DRIimageLoaderExtension *imgLoader = img->sPriv->image.loader; - const __DRIdri2LoaderExtension *dri2Loader = img->sPriv->dri2.loader; + const __DRIimageLoaderExtension *imgLoader = img->screen->image.loader; + const __DRIdri2LoaderExtension *dri2Loader = img->screen->dri2.loader; if (imgLoader && imgLoader->base.version >= 4 && imgLoader->destroyLoaderImageState) { @@ -453,7 +453,7 @@ dri2_create_from_texture(__DRIcontext *context, int target, unsigned texture, img->internal_format = obj->Image[face][level]->InternalFormat; img->loader_private = loaderPrivate; - img->sPriv = dri_ctx->screen->sPriv; + img->screen = dri_ctx->screen; pipe_resource_reference(&img->texture, tex); diff --git a/src/gallium/frontends/dri/dri_query_renderer.c b/src/gallium/frontends/dri/dri_query_renderer.c index b63192fddcf..9d6ee4356db 100644 --- a/src/gallium/frontends/dri/dri_query_renderer.c +++ b/src/gallium/frontends/dri/dri_query_renderer.c @@ -24,7 +24,7 @@ * Zero if a recognized value of \c param is supplied, -1 otherwise. */ static int -driQueryRendererIntegerCommon(__DRIscreen *psp, int param, unsigned int *value) +driQueryRendererIntegerCommon(struct dri_screen *screen, int param, unsigned int *value) { switch (param) { case __DRI2_RENDERER_VERSION: { @@ -50,24 +50,24 @@ driQueryRendererIntegerCommon(__DRIscreen *psp, int param, unsigned int *value) return 0; } case __DRI2_RENDERER_PREFERRED_PROFILE: - value[0] = (psp->max_gl_core_version != 0) + value[0] = (screen->max_gl_core_version != 0) ? (1U << __DRI_API_OPENGL_CORE) : (1U << __DRI_API_OPENGL); return 0; case __DRI2_RENDERER_OPENGL_CORE_PROFILE_VERSION: - value[0] = psp->max_gl_core_version / 10; - value[1] = psp->max_gl_core_version % 10; + value[0] = screen->max_gl_core_version / 10; + value[1] = screen->max_gl_core_version % 10; return 0; case __DRI2_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION: - value[0] = psp->max_gl_compat_version / 10; - value[1] = psp->max_gl_compat_version % 10; + value[0] = screen->max_gl_compat_version / 10; + value[1] = screen->max_gl_compat_version % 10; return 0; case __DRI2_RENDERER_OPENGL_ES_PROFILE_VERSION: - value[0] = psp->max_gl_es1_version / 10; - value[1] = psp->max_gl_es1_version % 10; + value[0] = screen->max_gl_es1_version / 10; + value[1] = screen->max_gl_es1_version % 10; return 0; case __DRI2_RENDERER_OPENGL_ES2_PROFILE_VERSION: - value[0] = psp->max_gl_es2_version / 10; - value[1] = psp->max_gl_es2_version % 10; + value[0] = screen->max_gl_es2_version / 10; + value[1] = screen->max_gl_es2_version % 10; return 0; case __DRI2_RENDERER_HAS_NO_ERROR_CONTEXT: value[0] = GL_TRUE; @@ -158,7 +158,7 @@ dri2_query_renderer_integer(__DRIscreen *_screen, int param, return -1; return 0; default: - return driQueryRendererIntegerCommon(_screen, param, value); + return driQueryRendererIntegerCommon(screen, param, value); } } diff --git a/src/gallium/frontends/dri/dri_screen.c b/src/gallium/frontends/dri/dri_screen.c index 0ecf3c250e7..14eb386099c 100644 --- a/src/gallium/frontends/dri/dri_screen.c +++ b/src/gallium/frontends/dri/dri_screen.c @@ -68,16 +68,16 @@ dri_init_options(struct dri_screen *screen) static unsigned dri_loader_get_cap(struct dri_screen *screen, enum dri_loader_cap cap) { - const __DRIdri2LoaderExtension *dri2_loader = screen->sPriv->dri2.loader; - const __DRIimageLoaderExtension *image_loader = screen->sPriv->image.loader; + const __DRIdri2LoaderExtension *dri2_loader = screen->dri2.loader; + const __DRIimageLoaderExtension *image_loader = screen->image.loader; if (dri2_loader && dri2_loader->base.version >= 4 && dri2_loader->getCapability) - return dri2_loader->getCapability(screen->sPriv->loaderPrivate, cap); + return dri2_loader->getCapability(screen->loaderPrivate, cap); if (image_loader && image_loader->base.version >= 2 && image_loader->getCapability) - return image_loader->getCapability(screen->sPriv->loaderPrivate, cap); + return image_loader->getCapability(screen->loaderPrivate, cap); return 0; } @@ -779,10 +779,8 @@ dri_destroy_screen_helper(struct dri_screen * screen) } void -dri_destroy_screen(__DRIscreen * sPriv) +dri_destroy_screen(struct dri_screen *screen) { - struct dri_screen *screen = dri_screen(sPriv); - dri_destroy_screen_helper(screen); pipe_loader_release(&screen->dev, 1); @@ -791,10 +789,11 @@ dri_destroy_screen(__DRIscreen * sPriv) free(screen->options.force_gl_renderer); free(screen->options.mesa_extension_override); + driDestroyOptionCache(&screen->optionCache); + driDestroyOptionInfo(&screen->optionInfo); + /* The caller in dri_util preserves the fd ownership */ free(screen); - sPriv->driverPrivate = NULL; - sPriv->extensions = NULL; } static void @@ -814,7 +813,7 @@ dri_set_background_context(struct st_context_iface *st, { struct dri_context *ctx = (struct dri_context *)st->st_manager_private; const __DRIbackgroundCallableExtension *backgroundCallable = - ctx->screen->sPriv->dri2.backgroundCallable; + ctx->screen->dri2.backgroundCallable; if (backgroundCallable) backgroundCallable->setBackgroundContext(ctx->loaderPrivate); @@ -844,10 +843,10 @@ dri_init_screen_helper(struct dri_screen *screen, st_api_query_versions(&screen->base, &screen->options, - &screen->sPriv->max_gl_core_version, - &screen->sPriv->max_gl_compat_version, - &screen->sPriv->max_gl_es1_version, - &screen->sPriv->max_gl_es2_version); + &screen->max_gl_core_version, + &screen->max_gl_compat_version, + &screen->max_gl_es1_version, + &screen->max_gl_es2_version); return dri_fill_in_modes(screen); } diff --git a/src/gallium/frontends/dri/dri_screen.h b/src/gallium/frontends/dri/dri_screen.h index 6d86340ed43..fedd0c5d6db 100644 --- a/src/gallium/frontends/dri/dri_screen.h +++ b/src/gallium/frontends/dri/dri_screen.h @@ -53,7 +53,46 @@ struct dri_screen struct st_manager base; /* dri */ - __DRIscreen *sPriv; + /* Backend-specific entrypoints (dri, swrast, kopper) */ + const struct __DRIDriverVtableExtensionRec *driver; + + /* Current screen's number */ + int myNum; + + void *loaderPrivate; + + int max_gl_core_version; + int max_gl_compat_version; + int max_gl_es1_version; + int max_gl_es2_version; + + const __DRIextension **extensions; + + const __DRIswrastLoaderExtension *swrast_loader; + const __DRIkopperLoaderExtension *kopper_loader; + + struct { + /* Flag to indicate that this is a DRI2 screen. Many of the above + * fields will not be valid or initializaed in that case. */ + const __DRIdri2LoaderExtension *loader; + const __DRIimageLookupExtension *image; + const __DRIuseInvalidateExtension *useInvalidate; + const __DRIbackgroundCallableExtension *backgroundCallable; + } dri2; + + struct { + const __DRIimageLoaderExtension *loader; + } image; + + struct { + const __DRImutableRenderBufferLoaderExtension *loader; + } mutableRenderBuffer; + + driOptionCache optionInfo; + driOptionCache optionCache; + + unsigned int api_mask; + boolean throttle; struct st_config_options options; @@ -95,19 +134,31 @@ struct dri_screen opencl_dri_event_release_t opencl_dri_event_release; opencl_dri_event_wait_t opencl_dri_event_wait; opencl_dri_event_get_fence_t opencl_dri_event_get_fence; + + /* kopper */ + struct pipe_screen *unwrapped_screen; + bool has_dmabuf; + bool has_modifiers; + bool is_sw; }; /** cast wrapper */ static inline struct dri_screen * dri_screen(__DRIscreen * sPriv) { - return (struct dri_screen *)sPriv->driverPrivate; + return (struct dri_screen *)sPriv; +} + +static inline __DRIscreen * +opaque_dri_screen(struct dri_screen *screen) +{ + return (__DRIscreen *)screen; } static inline const __DRIkopperLoaderExtension * dri_screen_get_kopper(struct dri_screen *screen) { - return screen->sPriv->kopper_loader; + return screen->kopper_loader; } struct __DRIimageRec { @@ -137,14 +188,13 @@ struct __DRIimageRec { enum __DRIChromaSiting horizontal_siting; enum __DRIChromaSiting vertical_siting; - /* DRI loader screen */ - __DRIscreen *sPriv; + struct dri_screen *screen; }; static inline boolean -dri_with_format(__DRIscreen * sPriv) +dri_with_format(struct dri_screen *screen) { - const __DRIdri2LoaderExtension *loader = sPriv->dri2.loader; + const __DRIdri2LoaderExtension *loader = screen->dri2.loader; return loader && (loader->base.version >= 3) @@ -167,7 +217,7 @@ void dri_destroy_screen_helper(struct dri_screen * screen); void -dri_destroy_screen(__DRIscreen * sPriv); +dri_destroy_screen(struct dri_screen *screen); extern const struct __DriverAPIRec dri_swrast_kms_driver_api; extern const __DRIextension *dri_swrast_kms_driver_extensions[]; diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c index 4fecc4f9f3e..9962827f2b2 100644 --- a/src/gallium/frontends/dri/dri_util.c +++ b/src/gallium/frontends/dri/dri_util.c @@ -45,6 +45,7 @@ #include "dri_screen.h" #include "dri_drawable.h" #include "util/u_endian.h" +#include "util/u_memory.h" #include "util/driconf.h" #include "main/framebuffer.h" #include "main/version.h" @@ -69,28 +70,28 @@ driOptionDescription __dri2ConfigOptions[] = { /*@{*/ static void -setupLoaderExtensions(__DRIscreen *psp, +setupLoaderExtensions(struct dri_screen *screen, const __DRIextension **extensions) { int i; for (i = 0; extensions[i]; i++) { if (strcmp(extensions[i]->name, __DRI_DRI2_LOADER) == 0) - psp->dri2.loader = (__DRIdri2LoaderExtension *) extensions[i]; + screen->dri2.loader = (__DRIdri2LoaderExtension *) extensions[i]; if (strcmp(extensions[i]->name, __DRI_IMAGE_LOOKUP) == 0) - psp->dri2.image = (__DRIimageLookupExtension *) extensions[i]; + screen->dri2.image = (__DRIimageLookupExtension *) extensions[i]; if (strcmp(extensions[i]->name, __DRI_USE_INVALIDATE) == 0) - psp->dri2.useInvalidate = (__DRIuseInvalidateExtension *) extensions[i]; + screen->dri2.useInvalidate = (__DRIuseInvalidateExtension *) extensions[i]; if (strcmp(extensions[i]->name, __DRI_BACKGROUND_CALLABLE) == 0) - psp->dri2.backgroundCallable = (__DRIbackgroundCallableExtension *) extensions[i]; + screen->dri2.backgroundCallable = (__DRIbackgroundCallableExtension *) extensions[i]; if (strcmp(extensions[i]->name, __DRI_SWRAST_LOADER) == 0) - psp->swrast_loader = (__DRIswrastLoaderExtension *) extensions[i]; + screen->swrast_loader = (__DRIswrastLoaderExtension *) extensions[i]; if (strcmp(extensions[i]->name, __DRI_IMAGE_LOADER) == 0) - psp->image.loader = (__DRIimageLoaderExtension *) extensions[i]; + screen->image.loader = (__DRIimageLoaderExtension *) extensions[i]; if (strcmp(extensions[i]->name, __DRI_MUTABLE_RENDER_BUFFER_LOADER) == 0) - psp->mutableRenderBuffer.loader = (__DRImutableRenderBufferLoaderExtension *) extensions[i]; + screen->mutableRenderBuffer.loader = (__DRImutableRenderBufferLoaderExtension *) extensions[i]; if (strcmp(extensions[i]->name, __DRI_KOPPER_LOADER) == 0) - psp->kopper_loader = (__DRIkopperLoaderExtension *) extensions[i]; + screen->kopper_loader = (__DRIkopperLoaderExtension *) extensions[i]; } } @@ -108,42 +109,42 @@ driCreateNewScreen2(int scrn, int fd, const __DRIconfig ***driver_configs, void *data) { static const __DRIextension *emptyExtensionList[] = { NULL }; - __DRIscreen *psp; + struct dri_screen *screen; - psp = calloc(1, sizeof(*psp)); - if (!psp) - return NULL; + screen = CALLOC_STRUCT(dri_screen); + if (!screen) + return NULL; assert(driver_extensions); for (int i = 0; driver_extensions[i]; i++) { if (strcmp(driver_extensions[i]->name, __DRI_DRIVER_VTABLE) == 0) { - psp->driver = + screen->driver = (__DRIDriverVtableExtension *)driver_extensions[i]; } } - setupLoaderExtensions(psp, extensions); + setupLoaderExtensions(screen, extensions); // dri2 drivers require working invalidate - if (fd != -1 && !psp->dri2.useInvalidate) { - free(psp); + if (fd != -1 && !screen->dri2.useInvalidate) { + free(screen); return NULL; } - psp->loaderPrivate = data; + screen->loaderPrivate = data; - psp->extensions = emptyExtensionList; - psp->fd = fd; - psp->myNum = scrn; + screen->extensions = emptyExtensionList; + screen->fd = fd; + screen->myNum = scrn; /* Option parsing before ->InitScreen(), as some options apply there. */ - driParseOptionInfo(&psp->optionInfo, + driParseOptionInfo(&screen->optionInfo, __dri2ConfigOptions, ARRAY_SIZE(__dri2ConfigOptions)); - driParseConfigFiles(&psp->optionCache, &psp->optionInfo, psp->myNum, + driParseConfigFiles(&screen->optionCache, &screen->optionInfo, screen->myNum, "dri2", NULL, NULL, NULL, 0, NULL, 0); - *driver_configs = psp->driver->InitScreen(psp); + *driver_configs = screen->driver->InitScreen(screen); if (*driver_configs == NULL) { - free(psp); + free(screen); return NULL; } @@ -153,28 +154,28 @@ driCreateNewScreen2(int scrn, int fd, api = API_OPENGLES2; if (_mesa_override_gl_version_contextless(&consts, &api, &version)) - psp->max_gl_es2_version = version; + screen->max_gl_es2_version = version; api = API_OPENGL_COMPAT; if (_mesa_override_gl_version_contextless(&consts, &api, &version)) { - psp->max_gl_core_version = version; + screen->max_gl_core_version = version; if (api == API_OPENGL_COMPAT) - psp->max_gl_compat_version = version; + screen->max_gl_compat_version = version; } - psp->api_mask = 0; - if (psp->max_gl_compat_version > 0) - psp->api_mask |= (1 << __DRI_API_OPENGL); - if (psp->max_gl_core_version > 0) - psp->api_mask |= (1 << __DRI_API_OPENGL_CORE); - if (psp->max_gl_es1_version > 0) - psp->api_mask |= (1 << __DRI_API_GLES); - if (psp->max_gl_es2_version > 0) - psp->api_mask |= (1 << __DRI_API_GLES2); - if (psp->max_gl_es2_version >= 30) - psp->api_mask |= (1 << __DRI_API_GLES3); + screen->api_mask = 0; + if (screen->max_gl_compat_version > 0) + screen->api_mask |= (1 << __DRI_API_OPENGL); + if (screen->max_gl_core_version > 0) + screen->api_mask |= (1 << __DRI_API_OPENGL_CORE); + if (screen->max_gl_es1_version > 0) + screen->api_mask |= (1 << __DRI_API_GLES); + if (screen->max_gl_es2_version > 0) + screen->api_mask |= (1 << __DRI_API_GLES2); + if (screen->max_gl_es2_version >= 30) + screen->api_mask |= (1 << __DRI_API_GLES3); - return psp; + return opaque_dri_screen(screen); } static __DRIscreen * @@ -231,18 +232,13 @@ static void driDestroyScreen(__DRIscreen *psp) * stream open to the X-server anymore. */ - dri_destroy_screen(psp); - - driDestroyOptionCache(&psp->optionCache); - driDestroyOptionInfo(&psp->optionInfo); - - free(psp); + dri_destroy_screen(dri_screen(psp)); } } static const __DRIextension **driGetExtensions(__DRIscreen *psp) { - return psp->extensions; + return dri_screen(psp)->extensions; } /*@}*/ @@ -400,7 +396,7 @@ driIndexConfigAttrib(const __DRIconfig *config, int index, } static bool -validate_context_version(__DRIscreen *screen, +validate_context_version(struct dri_screen *screen, int mesa_api, unsigned major_version, unsigned minor_version, @@ -444,7 +440,7 @@ validate_context_version(__DRIscreen *screen, /*@{*/ static __DRIcontext * -driCreateContextAttribs(__DRIscreen *screen, int api, +driCreateContextAttribs(__DRIscreen *psp, int api, const __DRIconfig *config, __DRIcontext *shared, unsigned num_attribs, @@ -452,6 +448,7 @@ driCreateContextAttribs(__DRIscreen *screen, int api, unsigned *error, void *data) { + struct dri_screen *screen = dri_screen(psp); const struct gl_config *modes = (config != NULL) ? &config->modes : NULL; gl_api mesa_api; struct __DriverContextConfig ctx_config; @@ -626,7 +623,7 @@ driCreateContextAttribs(__DRIscreen *screen, int api, error)) return NULL; - struct dri_context *ctx = dri_create_context(dri_screen(screen), mesa_api, + struct dri_context *ctx = dri_create_context(screen, mesa_api, modes, &ctx_config, error, dri_context(shared), data); @@ -740,12 +737,13 @@ static int driUnbindContext(__DRIcontext *pcp) /*@}*/ static __DRIdrawable * -driCreateNewDrawable(__DRIscreen *screen, +driCreateNewDrawable(__DRIscreen *psp, const __DRIconfig *config, void *data) { assert(data != NULL); + struct dri_screen *screen = dri_screen(psp); struct dri_drawable *drawable = screen->driver->CreateBuffer(screen, &config->modes, GL_FALSE, data); @@ -759,24 +757,30 @@ driDestroyDrawable(__DRIdrawable *pdp) } static __DRIbuffer * -dri2AllocateBuffer(__DRIscreen *screen, +dri2AllocateBuffer(__DRIscreen *psp, unsigned int attachment, unsigned int format, int width, int height) { - return screen->driver->AllocateBuffer(screen, attachment, format, - width, height); + struct dri_screen *screen = dri_screen(psp); + + return screen->driver->AllocateBuffer(screen, attachment, format, + width, height); } static void -dri2ReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer) +dri2ReleaseBuffer(__DRIscreen *psp, __DRIbuffer *buffer) { - screen->driver->ReleaseBuffer(screen, buffer); + struct dri_screen *screen = dri_screen(psp); + + screen->driver->ReleaseBuffer(buffer); } static int -dri2ConfigQueryb(__DRIscreen *screen, const char *var, unsigned char *val) +dri2ConfigQueryb(__DRIscreen *psp, const char *var, unsigned char *val) { + struct dri_screen *screen = dri_screen(psp); + if (!driCheckOption(&screen->optionCache, var, DRI_BOOL)) return -1; @@ -786,8 +790,10 @@ dri2ConfigQueryb(__DRIscreen *screen, const char *var, unsigned char *val) } static int -dri2ConfigQueryi(__DRIscreen *screen, const char *var, int *val) +dri2ConfigQueryi(__DRIscreen *psp, const char *var, int *val) { + struct dri_screen *screen = dri_screen(psp); + if (!driCheckOption(&screen->optionCache, var, DRI_INT) && !driCheckOption(&screen->optionCache, var, DRI_ENUM)) return -1; @@ -798,8 +804,10 @@ dri2ConfigQueryi(__DRIscreen *screen, const char *var, int *val) } static int -dri2ConfigQueryf(__DRIscreen *screen, const char *var, float *val) +dri2ConfigQueryf(__DRIscreen *psp, const char *var, float *val) { + struct dri_screen *screen = dri_screen(psp); + if (!driCheckOption(&screen->optionCache, var, DRI_FLOAT)) return -1; @@ -809,8 +817,10 @@ dri2ConfigQueryf(__DRIscreen *screen, const char *var, float *val) } static int -dri2ConfigQuerys(__DRIscreen *screen, const char *var, char **val) +dri2ConfigQuerys(__DRIscreen *psp, const char *var, char **val) { + struct dri_screen *screen = dri_screen(psp); + if (!driCheckOption(&screen->optionCache, var, DRI_STRING)) return -1; @@ -822,7 +832,7 @@ dri2ConfigQuerys(__DRIscreen *screen, const char *var, char **val) static unsigned int driGetAPIMask(__DRIscreen *screen) { - return screen->api_mask; + return dri_screen(screen)->api_mask; } /** @@ -836,9 +846,9 @@ driSwapBuffers(__DRIdrawable *pdp) { struct dri_drawable *drawable = dri_drawable(pdp); - assert(drawable->sPriv->swrast_loader); + assert(drawable->screen->swrast_loader); - drawable->sPriv->driver->SwapBuffers(drawable); + drawable->screen->driver->SwapBuffers(drawable); } /** Core interface */ diff --git a/src/gallium/frontends/dri/dri_util.h b/src/gallium/frontends/dri/dri_util.h index e98cec5450d..583a7aa6319 100644 --- a/src/gallium/frontends/dri/dri_util.h +++ b/src/gallium/frontends/dri/dri_util.h @@ -64,24 +64,26 @@ #define __DRI_DRIVER_VTABLE "DRI_DriverVtable" +struct dri_screen; + typedef struct __DRIDriverVtableExtensionRec { __DRIextension base; - const __DRIconfig **(*InitScreen) (__DRIscreen * priv); + const __DRIconfig **(*InitScreen)(struct dri_screen *screen); - struct dri_drawable *(*CreateBuffer)(__DRIscreen *driScrnPriv, + struct dri_drawable *(*CreateBuffer)(struct dri_screen *screen, const struct gl_config *glVis, GLboolean pixmapBuffer, void *loaderPrivate); void (*SwapBuffers)(struct dri_drawable *drawable); - __DRIbuffer *(*AllocateBuffer) (__DRIscreen *screenPrivate, - unsigned int attachment, - unsigned int format, - int width, int height); + __DRIbuffer *(*AllocateBuffer)(struct dri_screen *screen, + unsigned int attachment, + unsigned int format, + int width, int height); - void (*ReleaseBuffer) (__DRIscreen *screenPrivate, __DRIbuffer *buffer); + void (*ReleaseBuffer)(__DRIbuffer *buffer); } __DRIDriverVtableExtension; struct __DRIconfigRec { @@ -140,73 +142,6 @@ struct __DriverContextConfig { #define __DRIVER_CONTEXT_ATTRIB_NO_ERROR (1 << 3) #define __DRIVER_CONTEXT_ATTRIB_PROTECTED (1 << 4) -/** - * Per-screen private driver information. - */ -struct __DRIscreenRec { - /** - * Driver-specific entrypoints provided by the driver's - * __DRIDriverVtableExtensionRec. - */ - const struct __DRIDriverVtableExtensionRec *driver; - - /** - * Current screen's number - */ - int myNum; - - /** - * File descriptor returned when the kernel device driver is opened. - * - * Used to: - * - authenticate client to kernel - * - map the frame buffer, SAREA, etc. - * - close the kernel device driver - */ - int fd; - - /** - * Device-dependent private information (not stored in the SAREA). - * - * This pointer is never touched by the DRI layer. - */ - void *driverPrivate; - - void *loaderPrivate; - - int max_gl_core_version; - int max_gl_compat_version; - int max_gl_es1_version; - int max_gl_es2_version; - - const __DRIextension **extensions; - - const __DRIswrastLoaderExtension *swrast_loader; - const __DRIkopperLoaderExtension *kopper_loader; - - struct { - /* Flag to indicate that this is a DRI2 screen. Many of the above - * fields will not be valid or initializaed in that case. */ - const __DRIdri2LoaderExtension *loader; - const __DRIimageLookupExtension *image; - const __DRIuseInvalidateExtension *useInvalidate; - const __DRIbackgroundCallableExtension *backgroundCallable; - } dri2; - - struct { - const __DRIimageLoaderExtension *loader; - } image; - - struct { - const __DRImutableRenderBufferLoaderExtension *loader; - } mutableRenderBuffer; - - driOptionCache optionInfo; - driOptionCache optionCache; - - unsigned int api_mask; -}; - extern uint32_t driGLFormatToImageFormat(mesa_format format); diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index e7fa125d0a9..9c16608fbc3 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -46,8 +46,7 @@ DEBUG_GET_ONCE_BOOL_OPTION(swrast_no_present, "SWRAST_NO_PRESENT", FALSE); static inline void get_drawable_info(struct dri_drawable *drawable, int *x, int *y, int *w, int *h) { - __DRIscreen *sPriv = drawable->sPriv; - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; loader->getDrawableInfo(opaque_dri_drawable(drawable), x, y, w, h, @@ -57,8 +56,7 @@ get_drawable_info(struct dri_drawable *drawable, int *x, int *y, int *w, int *h) static inline void put_image(struct dri_drawable *drawable, void *data, unsigned width, unsigned height) { - __DRIscreen *sPriv = drawable->sPriv; - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; loader->putImage(opaque_dri_drawable(drawable), __DRI_SWRAST_IMAGE_OP_SWAP, 0, 0, width, height, @@ -69,8 +67,7 @@ static inline void put_image2(struct dri_drawable *drawable, void *data, int x, int y, unsigned width, unsigned height, unsigned stride) { - __DRIscreen *sPriv = drawable->sPriv; - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; loader->putImage2(opaque_dri_drawable(drawable), __DRI_SWRAST_IMAGE_OP_SWAP, x, y, width, height, stride, @@ -82,8 +79,7 @@ put_image_shm(struct dri_drawable *drawable, int shmid, char *shmaddr, unsigned offset, unsigned offset_x, int x, int y, unsigned width, unsigned height, unsigned stride) { - __DRIscreen *sPriv = drawable->sPriv; - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; /* if we have the newer interface, don't have to add the offset_x here. */ if (loader->base.version > 4 && loader->putImageShm2) @@ -99,8 +95,7 @@ put_image_shm(struct dri_drawable *drawable, int shmid, char *shmaddr, static inline void get_image(struct dri_drawable *drawable, int x, int y, int width, int height, void *data) { - __DRIscreen *sPriv = drawable->sPriv; - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; loader->getImage(opaque_dri_drawable(drawable), x, y, width, height, @@ -110,8 +105,7 @@ get_image(struct dri_drawable *drawable, int x, int y, int width, int height, vo static inline void get_image2(struct dri_drawable *drawable, int x, int y, int width, int height, int stride, void *data) { - __DRIscreen *sPriv = drawable->sPriv; - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; /* getImage2 support is only in version 3 or newer */ if (loader->base.version < 3) @@ -126,8 +120,7 @@ static inline bool get_image_shm(struct dri_drawable *drawable, int x, int y, int width, int height, struct pipe_resource *res) { - __DRIscreen *sPriv = drawable->sPriv; - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; struct winsys_handle whandle; whandle.type = WINSYS_HANDLE_TYPE_SHMID; @@ -193,7 +186,7 @@ static inline void drisw_present_texture(struct pipe_context *pipe, struct dri_drawable *drawable, struct pipe_resource *ptex, struct pipe_box *sub_box) { - struct dri_screen *screen = dri_screen(drawable->sPriv); + struct dri_screen *screen = drawable->screen; if (screen->swrast_no_present) return; @@ -226,8 +219,8 @@ drisw_copy_to_front(struct pipe_context *pipe, static void drisw_swap_buffers(struct dri_drawable *drawable) { - struct dri_context *ctx = dri_get_current(drawable->sPriv); - struct dri_screen *screen = dri_screen(drawable->sPriv); + struct dri_context *ctx = dri_get_current(); + struct dri_screen *screen = drawable->screen; struct pipe_resource *ptex; if (!ctx) @@ -272,8 +265,8 @@ static void drisw_copy_sub_buffer(struct dri_drawable *drawable, int x, int y, int w, int h) { - struct dri_context *ctx = dri_get_current(drawable->sPriv); - struct dri_screen *screen = dri_screen(drawable->sPriv); + struct dri_context *ctx = dri_get_current(); + struct dri_screen *screen = drawable->screen; struct pipe_resource *ptex; struct pipe_box box; if (!ctx) @@ -354,8 +347,8 @@ drisw_allocate_textures(struct dri_context *stctx, const enum st_attachment_type *statts, unsigned count) { - struct dri_screen *screen = dri_screen(drawable->sPriv); - const __DRIswrastLoaderExtension *loader = drawable->sPriv->swrast_loader; + struct dri_screen *screen = drawable->screen; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; struct pipe_resource templ; unsigned width, height; boolean resized; @@ -531,25 +524,15 @@ static const struct drisw_loader_funcs drisw_shm_lf = { }; static const __DRIconfig ** -drisw_init_screen(__DRIscreen * sPriv) +drisw_init_screen(struct dri_screen *screen) { - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = screen->swrast_loader; const __DRIconfig **configs; - struct dri_screen *screen; struct pipe_screen *pscreen = NULL; const struct drisw_loader_funcs *lf = &drisw_lf; - screen = CALLOC_STRUCT(dri_screen); - if (!screen) - return NULL; - - screen->sPriv = sPriv; - screen->fd = sPriv->fd; - screen->swrast_no_present = debug_get_option_swrast_no_present(); - sPriv->driverPrivate = (void *)screen; - if (loader->base.version >= 4) { if (loader->putImageShm) lf = &drisw_shm_lf; @@ -575,14 +558,14 @@ drisw_init_screen(__DRIscreen * sPriv) goto fail; if (pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY)) { - sPriv->extensions = drisw_robust_screen_extensions; + screen->extensions = drisw_robust_screen_extensions; screen->has_reset_status_query = true; } else - sPriv->extensions = drisw_screen_extensions; + screen->extensions = drisw_screen_extensions; screen->lookup_egl_image = dri2_lookup_egl_image; - const __DRIimageLookupExtension *image = sPriv->dri2.image; + const __DRIimageLookupExtension *image = screen->dri2.image; if (image && image->base.version >= 2 && image->validateEGLImage && @@ -601,10 +584,10 @@ fail: } static struct dri_drawable * -drisw_create_buffer(__DRIscreen * sPriv, const struct gl_config * visual, +drisw_create_buffer(struct dri_screen *screen, const struct gl_config * visual, boolean isPixmap, void *loaderPrivate) { - struct dri_drawable *drawable = dri_create_buffer(sPriv, visual, isPixmap, + struct dri_drawable *drawable = dri_create_buffer(screen, visual, isPixmap, loaderPrivate); if (!drawable) return NULL; @@ -635,7 +618,7 @@ static void driswCopySubBuffer(__DRIdrawable *pdp, int x, int y, { struct dri_drawable *drawable = dri_drawable(pdp); - assert(drawable->sPriv->swrast_loader); + assert(drawable->screen->swrast_loader); drisw_copy_sub_buffer(drawable, x, y, w, h); } diff --git a/src/gallium/frontends/dri/kopper.c b/src/gallium/frontends/dri/kopper.c index 6c877d8a47d..fed4151b782 100644 --- a/src/gallium/frontends/dri/kopper.c +++ b/src/gallium/frontends/dri/kopper.c @@ -59,14 +59,6 @@ struct kopper_drawable { bool is_window; }; -struct kopper_screen { - struct dri_screen base; - struct pipe_screen *screen; //unwrapped - bool has_dmabuf; - bool has_modifiers; - bool is_sw; -}; - extern const __DRIimageExtension driVkImageExtension; extern const __DRIimageExtension driVkImageExtensionSw; @@ -129,30 +121,20 @@ static const __DRIextension *drivk_sw_screen_extensions[] = { }; static const __DRIconfig ** -kopper_init_screen(__DRIscreen * sPriv) +kopper_init_screen(struct dri_screen *screen) { const __DRIconfig **configs; - struct dri_screen *screen; - struct kopper_screen *kscreen; struct pipe_screen *pscreen = NULL; - if (!sPriv->kopper_loader) { + if (!screen->kopper_loader) { fprintf(stderr, "mesa: Kopper interface not found!\n" " Ensure the versions of %s built with this version of Zink are\n" " in your library path!\n", KOPPER_LIB_NAMES); return NULL; } - kscreen = CALLOC_STRUCT(kopper_screen); - if (!kscreen) - return NULL; - screen = &kscreen->base; - screen->sPriv = sPriv; - screen->fd = sPriv->fd; screen->can_share_buffer = true; - sPriv->driverPrivate = (void *)kscreen; - bool success; if (screen->fd != -1) success = pipe_loader_drm_probe_fd(&screen->dev, screen->fd); @@ -166,7 +148,7 @@ kopper_init_screen(__DRIscreen * sPriv) if (!pscreen) goto fail; - kscreen->screen = trace_screen_unwrap(pscreen); + screen->unwrapped_screen = trace_screen_unwrap(pscreen); configs = dri_init_screen_helper(screen, pscreen); if (!configs) @@ -175,15 +157,15 @@ kopper_init_screen(__DRIscreen * sPriv) assert(pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY)); screen->has_reset_status_query = true; screen->lookup_egl_image = dri2_lookup_egl_image; - kscreen->has_dmabuf = pscreen->get_param(pscreen, PIPE_CAP_DMABUF); - kscreen->has_modifiers = pscreen->query_dmabuf_modifiers != NULL; - kscreen->is_sw = zink_kopper_is_cpu(pscreen); - if (kscreen->has_dmabuf) - sPriv->extensions = drivk_screen_extensions; + screen->has_dmabuf = pscreen->get_param(pscreen, PIPE_CAP_DMABUF); + screen->has_modifiers = pscreen->query_dmabuf_modifiers != NULL; + screen->is_sw = zink_kopper_is_cpu(pscreen); + if (screen->has_dmabuf) + screen->extensions = drivk_screen_extensions; else - sPriv->extensions = drivk_sw_screen_extensions; + screen->extensions = drivk_sw_screen_extensions; - const __DRIimageLookupExtension *image = sPriv->dri2.image; + const __DRIimageLookupExtension *image = screen->dri2.image; if (image && image->base.version >= 2 && image->validateEGLImage && @@ -292,7 +274,7 @@ static __DRIimage * dri3_create_image_from_buffers(xcb_connection_t *c, xcb_dri3_buffers_from_pixmap_reply_t *bp_reply, unsigned int format, - __DRIscreen *dri_screen, + struct dri_screen *screen, const __DRIimageExtension *image, void *loaderPrivate) { @@ -314,7 +296,7 @@ dri3_create_image_from_buffers(xcb_connection_t *c, offsets[i] = offsets_in[i]; } - ret = image->createImageFromDmaBufs2(dri_screen, + ret = image->createImageFromDmaBufs2(opaque_dri_screen(screen), bp_reply->width, bp_reply->height, image_format_to_fourcc(format), @@ -335,7 +317,7 @@ static __DRIimage * dri3_create_image(xcb_connection_t *c, xcb_dri3_buffer_from_pixmap_reply_t *bp_reply, unsigned int format, - __DRIscreen *dri_screen, + struct dri_screen *screen, const __DRIimageExtension *image, void *loaderPrivate) { @@ -355,7 +337,7 @@ dri3_create_image(xcb_connection_t *c, * we've gotten the planar wrapper, pull the single plane out of it and * discard the wrapper. */ - image_planar = image->createImageFromFds(dri_screen, + image_planar = image->createImageFromFds(opaque_dri_screen(screen), bp_reply->width, bp_reply->height, image_format_to_fourcc(format), @@ -410,7 +392,6 @@ kopper_get_pixmap_buffer(struct kopper_drawable *cdraw, int width; int height; int format = get_dri_format(pf); - __DRIscreen *cur_screen; struct kopper_loader_info *info = &cdraw->info; assert(info->bos.sType == VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR); VkXcbSurfaceCreateInfoKHR *xcb = (VkXcbSurfaceCreateInfoKHR *)&info->bos; @@ -423,11 +404,10 @@ kopper_get_pixmap_buffer(struct kopper_drawable *cdraw, /* FIXME: probably broken for OBS studio? * see dri3_get_pixmap_buffer() */ - cur_screen = cdraw->base.sPriv; + struct dri_screen *screen = cdraw->base.screen; #ifdef HAVE_DRI3_MODIFIERS - struct kopper_screen *kscreen = (struct kopper_screen*)cur_screen->driverPrivate; - if (kscreen->has_modifiers) { + if (screen->has_modifiers) { xcb_dri3_buffers_from_pixmap_cookie_t bps_cookie; xcb_dri3_buffers_from_pixmap_reply_t *bps_reply; xcb_generic_error_t *error; @@ -440,7 +420,7 @@ kopper_get_pixmap_buffer(struct kopper_drawable *cdraw, } cdraw->image = dri3_create_image_from_buffers(conn, bps_reply, format, - cur_screen, &driVkImageExtension, + screen, &driVkImageExtension, cdraw); width = bps_reply->width; height = bps_reply->height; @@ -460,7 +440,7 @@ kopper_get_pixmap_buffer(struct kopper_drawable *cdraw, } cdraw->image = dri3_create_image(conn, bp_reply, format, - cur_screen, &driVkImageExtension, + screen, &driVkImageExtension, cdraw); width = bp_reply->width; height = bp_reply->height; @@ -480,17 +460,14 @@ kopper_allocate_textures(struct dri_context *ctx, const enum st_attachment_type *statts, unsigned statts_count) { - struct dri_screen *screen = dri_screen(drawable->sPriv); + struct dri_screen *screen = drawable->screen; struct pipe_resource templ; unsigned width, height; boolean resized; unsigned i; struct __DRIimageList images; - const __DRIimageLoaderExtension *image = drawable->sPriv->image.loader; + const __DRIimageLoaderExtension *image = screen->image.loader; struct kopper_drawable *cdraw = (struct kopper_drawable *)drawable; -#ifdef VK_USE_PLATFORM_XCB_KHR - struct kopper_screen *kscreen = (struct kopper_screen*)drawable->sPriv->driverPrivate; -#endif bool is_window = cdraw->is_window; bool is_pixmap = !is_window && cdraw->info.bos.sType == VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; @@ -629,7 +606,7 @@ XXX do this once swapinterval is hooked up screen->base.screen->resource_create_drawable(screen->base.screen, &templ, data); } #ifdef VK_USE_PLATFORM_XCB_KHR - else if (is_pixmap && statts[i] == ST_ATTACHMENT_FRONT_LEFT && !kscreen->is_sw) { + else if (is_pixmap && statts[i] == ST_ATTACHMENT_FRONT_LEFT && !screen->is_sw) { drawable->textures[statts[i]] = kopper_get_pixmap_buffer(cdraw, format); handle_in_fence(ctx, cdraw->image); } @@ -657,8 +634,7 @@ XXX do this once swapinterval is hooked up static inline void get_drawable_info(struct dri_drawable *drawable, int *x, int *y, int *w, int *h) { - __DRIscreen *sPriv = drawable->sPriv; - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; if (loader) loader->getDrawableInfo(opaque_dri_drawable(drawable), @@ -669,19 +645,18 @@ get_drawable_info(struct dri_drawable *drawable, int *x, int *y, int *w, int *h) static void kopper_update_drawable_info(struct dri_drawable *drawable) { - __DRIscreen *sPriv = drawable->sPriv; + struct dri_screen *screen = drawable->screen; struct kopper_drawable *cdraw = (struct kopper_drawable *)drawable; bool is_window = cdraw->info.bos.sType != 0; int x, y; - struct kopper_screen *kscreen = (struct kopper_screen*)sPriv->driverPrivate; - struct pipe_screen *screen = kscreen->screen; + struct pipe_screen *pscreen = screen->unwrapped_screen; struct pipe_resource *ptex = drawable->textures[ST_ATTACHMENT_BACK_LEFT] ? drawable->textures[ST_ATTACHMENT_BACK_LEFT] : drawable->textures[ST_ATTACHMENT_FRONT_LEFT]; - bool do_kopper_update = is_window && ptex && kscreen->base.fd == -1; + bool do_kopper_update = is_window && ptex && screen->fd == -1; if (cdraw->info.bos.sType == VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR && do_kopper_update) - zink_kopper_update(screen, ptex, &drawable->w, &drawable->h); + zink_kopper_update(pscreen, ptex, &drawable->w, &drawable->h); else get_drawable_info(drawable, &x, &y, &drawable->w, &drawable->h); } @@ -690,7 +665,7 @@ static inline void kopper_present_texture(struct pipe_context *pipe, struct dri_drawable *drawable, struct pipe_resource *ptex, struct pipe_box *sub_box) { - struct dri_screen *screen = dri_screen(drawable->sPriv); + struct dri_screen *screen = drawable->screen; screen->base.screen->flush_frontbuffer(screen->base.screen, pipe, ptex, 0, 0, drawable, sub_box); } @@ -765,8 +740,7 @@ kopper_flush_frontbuffer(struct dri_context *ctx, static inline void get_image(struct dri_drawable *drawable, int x, int y, int width, int height, void *data) { - __DRIscreen *sPriv = drawable->sPriv; - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; loader->getImage(opaque_dri_drawable(drawable), x, y, width, height, @@ -777,8 +751,7 @@ static inline bool get_image_shm(struct dri_drawable *drawable, int x, int y, int width, int height, struct pipe_resource *res) { - __DRIscreen *sPriv = drawable->sPriv; - const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader; + const __DRIswrastLoaderExtension *loader = drawable->screen->swrast_loader; struct winsys_handle whandle; whandle.type = WINSYS_HANDLE_TYPE_SHMID; @@ -801,8 +774,7 @@ kopper_update_tex_buffer(struct dri_drawable *drawable, struct dri_context *ctx, struct pipe_resource *res) { - __DRIscreen *sPriv = drawable->sPriv; - struct kopper_screen *kscreen = (struct kopper_screen*)sPriv->driverPrivate; + struct dri_screen *screen = drawable->screen; struct kopper_drawable *cdraw = (struct kopper_drawable *)drawable; struct st_context *st_ctx = (struct st_context *)ctx->st; struct pipe_context *pipe = st_ctx->pipe; @@ -810,7 +782,7 @@ kopper_update_tex_buffer(struct dri_drawable *drawable, char *map; int x, y, w, h; int ximage_stride, line; - if (kscreen->has_dmabuf || cdraw->is_window || cdraw->info.bos.sType != VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR) + if (screen->has_dmabuf || cdraw->is_window || cdraw->info.bos.sType != VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR) return; int cpp = util_format_get_blocksize(res->format); @@ -882,11 +854,11 @@ out: } static struct dri_drawable * -kopper_create_buffer(__DRIscreen *sPriv, const struct gl_config *visual, +kopper_create_buffer(struct dri_screen *screen, const struct gl_config *visual, boolean isPixmap, void *loaderPrivate) { /* always pass !pixmap because it isn't "handled" or relevant */ - struct dri_drawable *base_drawable = dri_create_buffer(sPriv, visual, false, + struct dri_drawable *base_drawable = dri_create_buffer(screen, visual, false, loaderPrivate); if (!base_drawable) return NULL; @@ -896,9 +868,9 @@ kopper_create_buffer(__DRIscreen *sPriv, const struct gl_config *visual, return NULL; drawable->info.has_alpha = visual->alphaBits > 0; - if (sPriv->kopper_loader->SetSurfaceCreateInfo) - sPriv->kopper_loader->SetSurfaceCreateInfo(drawable->base.loaderPrivate, - &drawable->info); + if (screen->kopper_loader->SetSurfaceCreateInfo) + screen->kopper_loader->SetSurfaceCreateInfo(drawable->base.loaderPrivate, + &drawable->info); drawable->is_window = !isPixmap && drawable->info.bos.sType != 0; return &drawable->base; @@ -908,7 +880,7 @@ static int64_t kopperSwapBuffers(__DRIdrawable *dPriv) { struct dri_drawable *drawable = dri_drawable(dPriv); - struct dri_context *ctx = dri_get_current(drawable->sPriv); + struct dri_context *ctx = dri_get_current(); struct kopper_drawable *kdraw = (struct kopper_drawable *)drawable; struct pipe_resource *ptex; @@ -952,13 +924,14 @@ kopper_swap_buffers(struct dri_drawable *drawable) } static __DRIdrawable * -kopperCreateNewDrawable(__DRIscreen *screen, +kopperCreateNewDrawable(__DRIscreen *psp, const __DRIconfig *config, void *data, int is_pixmap) { assert(data != NULL); + struct dri_screen *screen = dri_screen(psp); struct dri_drawable *drawable = screen->driver->CreateBuffer(screen, &config->modes, is_pixmap, data); @@ -970,9 +943,8 @@ kopperSetSwapInterval(__DRIdrawable *dPriv, int interval) { struct dri_drawable *drawable = dri_drawable(dPriv); struct kopper_drawable *cdraw = (struct kopper_drawable *)drawable; - struct dri_screen *screen = dri_screen(drawable->sPriv); - struct kopper_screen *kscreen = (struct kopper_screen *)screen; - struct pipe_screen *pscreen = kscreen->screen; + struct dri_screen *screen = drawable->screen; + struct pipe_screen *pscreen = screen->unwrapped_screen; struct pipe_resource *ptex = drawable->textures[ST_ATTACHMENT_BACK_LEFT] ? drawable->textures[ST_ATTACHMENT_BACK_LEFT] : drawable->textures[ST_ATTACHMENT_FRONT_LEFT]; @@ -990,7 +962,7 @@ static int kopperQueryBufferAge(__DRIdrawable *dPriv) { struct dri_drawable *drawable = dri_drawable(dPriv); - struct dri_context *ctx = dri_get_current(drawable->sPriv); + struct dri_context *ctx = dri_get_current(); struct pipe_resource *ptex = drawable->textures[ST_ATTACHMENT_BACK_LEFT] ? drawable->textures[ST_ATTACHMENT_BACK_LEFT] : drawable->textures[ST_ATTACHMENT_FRONT_LEFT];