diff options
author | Giovanni Campagna <[email protected]> | 2014-07-23 19:37:31 +0100 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2014-07-30 16:33:09 +0100 |
commit | 3b176c441b7ddc5f7d2f891da3f76cf3c1814ce1 (patch) | |
tree | a99421810f0150b9759363fb56910a160d10ad97 /src/gallium/state_trackers/dri | |
parent | 8430af5ebe1ee8119e14ae8fe00ec98fda40c57f (diff) |
gallium: Add a dumb drm/kms winsys backed swrast provider
Add a new winsys and target that can be used with a dri2 state tracker
and loader instead of drisw. This allows to use gbm as a dri2/image
loader and avoid the extra copy from the backbuffer to the shadow
frontbuffer.
The new driver is called "kms_swrast", and is loaded by gbm as a
fallback, because it is only useful with the gbm platform (as no buffer
sharing is possible)
To force select the driver set the environment variable
GBM_ALWAYS_SOFTWARE
[Emil Velikov]
- Rebase on top of gallium megadriver.
- s/text/test/ in configure.ac (Spotted by Andreas Pokorny).
- Add scons support for winsys/sw/kms-dri and fix the build.
- Provide separate DriverAPI, due to different InitScreen hook.
Signed-off-by: Emil Velikov <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers/dri')
-rw-r--r-- | src/gallium/state_trackers/dri/dri2.c | 63 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_screen.h | 3 |
2 files changed, 66 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index fcca4875229..f70b723a07b 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -1297,6 +1297,48 @@ fail: return NULL; } +/** + * This is the driver specific part of the createNewScreen entry point. + * + * Returns the struct gl_config supported by this driver. + */ +static const __DRIconfig ** +dri_kms_init_screen(__DRIscreen * sPriv) +{ +#if GALLIUM_STATIC_TARGETS + 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; + + pscreen = kms_swrast_create_screen(screen->fd); + sPriv->extensions = dri_screen_extensions; + + /* dri_init_screen_helper checks pscreen for us */ + configs = dri_init_screen_helper(screen, pscreen, "swrast"); + if (!configs) + goto fail; + + screen->auto_fake_front = dri_with_format(sPriv); + screen->broken_invalidate = !sPriv->dri2.useInvalidate; + screen->lookup_egl_image = dri2_lookup_egl_image; + + return configs; +fail: + dri_destroy_screen_helper(screen); + FREE(screen); +#endif // GALLIUM_STATIC_TARGETS + return NULL; +} + static boolean dri2_create_buffer(__DRIscreen * sPriv, __DRIdrawable * dPriv, @@ -1335,6 +1377,27 @@ const struct __DriverAPIRec galliumdrm_driver_api = { .ReleaseBuffer = dri2_release_buffer, }; +/** + * DRI driver virtual function table. + * + * KMS/DRM version of the DriverAPI above sporting a different InitScreen + * hook. The latter is used to explicitly initialise the kms_swrast driver + * rather than selecting the approapriate driver as suggested by the loader. + */ +const struct __DriverAPIRec dri_kms_driver_api = { + .InitScreen = dri_kms_init_screen, + .DestroyScreen = dri_destroy_screen, + .CreateContext = dri_create_context, + .DestroyContext = dri_destroy_context, + .CreateBuffer = dri2_create_buffer, + .DestroyBuffer = dri_destroy_buffer, + .MakeCurrent = dri_make_current, + .UnbindContext = dri_unbind_context, + + .AllocateBuffer = dri2_allocate_buffer, + .ReleaseBuffer = dri2_release_buffer, +}; + /* This is the table of extensions that the loader will dlsym() for. */ const __DRIextension *galliumdrm_driver_extensions[] = { &driCoreExtension.base, diff --git a/src/gallium/state_trackers/dri/dri_screen.h b/src/gallium/state_trackers/dri/dri_screen.h index f421b68aed7..993ad2abe09 100644 --- a/src/gallium/state_trackers/dri/dri_screen.h +++ b/src/gallium/state_trackers/dri/dri_screen.h @@ -146,6 +146,9 @@ dri_destroy_screen_helper(struct dri_screen * screen); void dri_destroy_screen(__DRIscreen * sPriv); +extern struct pipe_screen *kms_swrast_create_screen(int fd); +extern const struct __DriverAPIRec dri_kms_driver_api; + extern const struct __DriverAPIRec galliumdrm_driver_api; extern const __DRIextension *galliumdrm_driver_extensions[]; extern const struct __DriverAPIRec galliumsw_driver_api; |