frontend/dri: inline __DRIscreen in dri_screen, make __DRIscreen opaque

This cleanup removes the dri_util structure __DRIscreen(Rec) that is
difficult to follow, and switches all code to using dri_screen directly.

It also inlines kopper_screen in dri_screen because I don't see any
other way to do this cleanup.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19741>
This commit is contained in:
Marek Olšák 2022-11-15 01:49:27 -05:00 committed by Marge Bot
parent 0a622f61ea
commit 165b8a9fef
13 changed files with 270 additions and 348 deletions

View file

@ -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;

View file

@ -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();

View file

@ -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,

View file

@ -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);

View file

@ -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

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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);
}

View file

@ -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[];

View file

@ -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 */

View file

@ -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);

View file

@ -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);
}

View file

@ -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];