#include "dri_screen.h"
#include "dri_context.h"
#include "dri_drawable.h"
+#include "dri_query_renderer.h"
#include "dri2_buffer.h"
static int convert_fourcc(int format, int *dri_components_p)
}
memset(&whandle, 0, sizeof(whandle));
- whandle.type = DRM_API_HANDLE_TYPE_SHARED;
+ if (screen->can_share_buffer)
+ whandle.type = DRM_API_HANDLE_TYPE_SHARED;
+ else
+ whandle.type = DRM_API_HANDLE_TYPE_KMS;
+
screen->base.screen->resource_get_handle(screen->base.screen,
buffer->resource, &whandle);
templ.height0 = dri_drawable->h;
templ.format = format;
templ.bind = bind;
- whandle.type = DRM_API_HANDLE_TYPE_SHARED;
whandle.handle = buf->name;
whandle.stride = buf->pitch;
-
+ if (screen->can_share_buffer)
+ whandle.type = DRM_API_HANDLE_TYPE_SHARED;
+ else
+ whandle.type = DRM_API_HANDLE_TYPE_KMS;
drawable->textures[statt] =
screen->base.screen->resource_from_handle(screen->base.screen,
&templ, &whandle);
FREE(img);
}
+static int
+dri2_get_capabilities(__DRIscreen *_screen)
+{
+ struct dri_screen *screen = dri_screen(_screen);
+
+ return (screen->can_share_buffer ? __DRI_IMAGE_CAP_GLOBAL_NAMES : 0);
+}
+
/* The extension is modified during runtime if DRI_PRIME is detected */
static __DRIimageExtension dri2ImageExtension = {
- .base = { __DRI_IMAGE, 9 },
+ .base = { __DRI_IMAGE, 10 },
.createImageFromName = dri2_create_image_from_name,
.createImageFromRenderbuffer = dri2_create_image_from_renderbuffer,
.createImageFromFds = NULL,
.createImageFromDmaBufs = NULL,
.blitImage = dri2_blit_image,
+ .getCapabilities = dri2_get_capabilities,
};
/*
&driTexBufferExtension.base,
&dri2FlushExtension.base,
&dri2ImageExtension.base,
+ &dri2RendererQueryExtension.base,
&dri2ConfigQueryExtension.base,
&dri2ThrottleExtension.base,
NULL
throttle_ret = dd_configuration(DRM_CONF_THROTTLE);
dmabuf_ret = dd_configuration(DRM_CONF_SHARE_FD);
#else
- if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd, true)) {
+ if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd, false)) {
pscreen = pipe_loader_create_screen(screen->dev, PIPE_SEARCH_DIR);
throttle_ret = pipe_loader_configuration(screen->dev, DRM_CONF_THROTTLE);
if (!configs)
goto fail;
+ screen->can_share_buffer = true;
screen->auto_fake_front = dri_with_format(sPriv);
screen->broken_invalidate = !sPriv->dri2.useInvalidate;
screen->lookup_egl_image = dri2_lookup_egl_image;
dri_kms_init_screen(__DRIscreen * sPriv)
{
#if GALLIUM_STATIC_TARGETS
+#if defined(GALLIUM_SOFTPIPE)
const __DRIconfig **configs;
struct dri_screen *screen;
struct pipe_screen *pscreen = NULL;
+ uint64_t cap;
screen = CALLOC_STRUCT(dri_screen);
if (!screen)
sPriv->driverPrivate = (void *)screen;
pscreen = kms_swrast_create_screen(screen->fd);
+
+ if (drmGetCap(sPriv->fd, DRM_CAP_PRIME, &cap) == 0 &&
+ (cap & DRM_PRIME_CAP_IMPORT)) {
+ dri2ImageExtension.createImageFromFds = dri2_from_fds;
+ dri2ImageExtension.createImageFromDmaBufs = dri2_from_dma_bufs;
+ }
+
sPriv->extensions = dri_screen_extensions;
/* dri_init_screen_helper checks pscreen for us */
if (!configs)
goto fail;
+ screen->can_share_buffer = false;
screen->auto_fake_front = dri_with_format(sPriv);
screen->broken_invalidate = !sPriv->dri2.useInvalidate;
screen->lookup_egl_image = dri2_lookup_egl_image;
fail:
dri_destroy_screen_helper(screen);
FREE(screen);
+#endif // GALLIUM_SOFTPIPE
#endif // GALLIUM_STATIC_TARGETS
return NULL;
}