summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Courbot <acourbot@nvidia.com>2016-01-08 17:56:19 +0000
committerJavier Jardón <jjardon@gnome.org>2016-01-08 18:04:15 +0000
commit19e45e13092448fae4636a9123482ff460acd3cd (patch)
treea0d9de2afe427fcece984d3c04db09e4f46501b4
parent514aa681857d58bb995870b82b628bb8b5704d76 (diff)
downloadxserver-19e45e13092448fae4636a9123482ff460acd3cd.tar.gz
[HACK] use render nodes and tegra tiling format
-rw-r--r--glamor/glamor_egl.c5
-rw-r--r--hw/xfree86/drivers/modesetting/drmmode_display.c56
-rw-r--r--hw/xfree86/drivers/modesetting/drmmode_display.h1
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 {