diff options
author | Alexandre Courbot <acourbot@nvidia.com> | 2016-01-08 17:56:19 +0000 |
---|---|---|
committer | Javier Jardón <jjardon@gnome.org> | 2016-01-08 18:04:15 +0000 |
commit | 19e45e13092448fae4636a9123482ff460acd3cd (patch) | |
tree | a0d9de2afe427fcece984d3c04db09e4f46501b4 | |
parent | 514aa681857d58bb995870b82b628bb8b5704d76 (diff) | |
download | xserver-19e45e13092448fae4636a9123482ff460acd3cd.tar.gz |
[HACK] use render nodes and tegra tiling format
-rw-r--r-- | glamor/glamor_egl.c | 5 | ||||
-rw-r--r-- | hw/xfree86/drivers/modesetting/drmmode_display.c | 56 | ||||
-rw-r--r-- | hw/xfree86/drivers/modesetting/drmmode_display.h | 1 |
3 files changed, 58 insertions, 4 deletions
diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c index 6160032f0..51c2d7250 100644 --- a/glamor/glamor_egl.c +++ b/glamor/glamor_egl.c @@ -742,6 +742,11 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd) xf86GlamorEGLPrivateIndex = xf86AllocateScrnInfoPrivateIndex(); scrn->privates[xf86GlamorEGLPrivateIndex].ptr = glamor_egl; + + + fd = open("/dev/dri/renderD128", O_RDWR); + xf86Msg(X_INFO, "Opening render node: %d\n", fd); + glamor_egl->fd = fd; #ifdef GLAMOR_HAS_GBM glamor_egl->gbm = gbm_create_device(glamor_egl->fd); diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c index a8de5f9e7..dd210ed28 100644 --- a/hw/xfree86/drivers/modesetting/drmmode_display.c +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c @@ -50,6 +50,8 @@ #include "driver.h" +#include <tegra_drm.h> + static int drmmode_bo_destroy(drmmode_ptr drmmode, drmmode_bo *bo) { @@ -125,15 +127,61 @@ drmmode_bo_map(drmmode_ptr drmmode, drmmode_bo *bo) } static Bool +drmmode_tegra_import(drmmode_ptr drmmode, drmmode_bo *bo) +{ + struct drm_tegra_gem_set_tiling args; + int err; + + memset(&args, 0, sizeof(args)); + args.handle = bo->drm_handle; + args.mode = DRM_TEGRA_GEM_TILING_MODE_BLOCK; + args.value = 4; + + err = ioctl(drmmode->fd, DRM_IOCTL_TEGRA_GEM_SET_TILING, &args); + if (err < 0) { + xf86Msg(X_ERROR, "failed to set tiling parameters\n"); + return FALSE; + } + + return TRUE; +} + +static Bool drmmode_create_bo(drmmode_ptr drmmode, drmmode_bo *bo, unsigned width, unsigned height, unsigned bpp) { #ifdef GLAMOR_HAS_GBM + uint32_t handle; + int fd; + int ret; + if (drmmode->glamor) { bo->gbm = gbm_bo_create(drmmode->gbm, width, height, GBM_FORMAT_ARGB8888, GBM_BO_USE_RENDERING | GBM_BO_USE_SCANOUT); - return bo->gbm != NULL; + + if (bo->gbm == NULL) + return FALSE; + + handle = gbm_bo_get_handle(bo->gbm).u32; + + ret = drmPrimeHandleToFD(gbm_device_get_fd(drmmode->gbm), handle, 0, &fd); + if (ret) { + xf86Msg(X_ERROR, "failed to export bo\n"); + return FALSE; + } + + ret = drmPrimeFDToHandle(drmmode->fd, fd, &handle); + if (ret) { + xf86Msg(X_ERROR, "failed to import bo\n"); + close(fd); + return FALSE; + } + + close(fd); + bo->drm_handle = handle; + + return drmmode_tegra_import(drmmode, bo); } #endif @@ -290,7 +338,7 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, pScrn->virtualX, height, pScrn->depth, pScrn->bitsPerPixel, drmmode_bo_get_pitch(&drmmode->front_bo), - drmmode_bo_get_handle(&drmmode->front_bo), + drmmode->front_bo.drm_handle, &drmmode->fb_id); if (ret < 0) { ErrorF("failed to add fb %d\n", ret); @@ -554,7 +602,7 @@ drmmode_shadow_allocate(xf86CrtcPtr crtc, int width, int height) ret = drmModeAddFB(drmmode->fd, width, height, crtc->scrn->depth, crtc->scrn->bitsPerPixel, drmmode_bo_get_pitch(&drmmode_crtc->rotate_bo), - drmmode_bo_get_handle(&drmmode_crtc->rotate_bo), + drmmode_crtc->rotate_bo.drm_handle, &drmmode_crtc->rotate_fb_id); if (ret) { @@ -1361,7 +1409,7 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) ret = drmModeAddFB(drmmode->fd, width, height, scrn->depth, scrn->bitsPerPixel, pitch, - drmmode_bo_get_handle(&drmmode->front_bo), + drmmode->front_bo.drm_handle, &drmmode->fb_id); if (ret) goto fail; diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.h b/hw/xfree86/drivers/modesetting/drmmode_display.h index 3a8959ac3..999954ffc 100644 --- a/hw/xfree86/drivers/modesetting/drmmode_display.h +++ b/hw/xfree86/drivers/modesetting/drmmode_display.h @@ -41,6 +41,7 @@ typedef struct { #ifdef GLAMOR_HAS_GBM struct gbm_bo *gbm; #endif + uint32_t drm_handle; } drmmode_bo; typedef struct { |