mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 19:40:10 +01:00
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:
parent
0a622f61ea
commit
165b8a9fef
13 changed files with 270 additions and 348 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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[];
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue