AC_SUBST(GTK_LIBS)
fi
-AC_ARG_ENABLE(libdrm_intel, AS_HELP_STRING([--enable-libdrm_intel],[enable building with libdrm_intel support]),enable_libdrm_intel=$enableval,enable_libdrm_intel=no)
-AM_CONDITIONAL(ENABLE_LIBDRM_INTEL, [test "$enable_libdrm_intel" = yes])
-
-if test x$enable_libdrm_intel = xyes; then
- PKG_CHECK_MODULES(DRM_INTEL, [libdrm libdrm_intel])
- OLD_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $DRM_INTEL_CFLAGS"
- AC_MSG_CHECKING([if i915_drm.h is in include path])
- AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
- [[
- #include <stdint.h>
- #include <stdlib.h>
- #include "i915_drm.h"
- ]],[[]]),[found_drm_intel_kernel_headers=yes],[found_drm_intel_kernel_headers=no])
-
- if test "$found_drm_intel_kernel_headers" = "yes"; then
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no])
- AC_MSG_CHECKING([if we can find them anyway])
-
- MORE_DRM_CFLAGS="-I`$PKG_CONFIG --variable includedir libdrm`/drm"
- CFLAGS="$CFLAGS $MORE_DRM_CFLAGS"
- AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
- [[
- #include <stdint.h>
- #include <stdlib.h>
- #include "i915_drm.h"
- ]],[[]]),[found_drm_intel_kernel_headers=yes],[found_drm_intel_kernel_headers=no])
-
- if test "$found_drm_intel_kernel_headers" = "yes"; then
- AC_MSG_RESULT([yes])
- DRM_INTEL_CFLAGS="$DRM_INTEL_CFLAGS $MORE_DRM_CFLAGS"
- else
- AC_MSG_RESULT([no])
- AC_MSG_ERROR([Could not find i915_drm.h])
- fi
- fi
-
- AC_SUBST(DRM_INTEL_CFLAGS)
- AC_SUBST(DRM_INTEL_LIBS)
- AC_DEFINE(PLY_ENABLE_LIBDRM_INTEL, 1, [Enable support for libdrm_intel driver])
-fi
-
-AC_ARG_ENABLE(libdrm_radeon, AS_HELP_STRING([--enable-libdrm_radeon],[enable building with libdrm_radeon support]),enable_libdrm_radeon=$enableval,enable_libdrm_radeon=no)
-AM_CONDITIONAL(ENABLE_LIBDRM_RADEON, [test "$enable_libdrm_radeon" = yes])
-
-if test x$enable_libdrm_radeon = xyes; then
- PKG_CHECK_MODULES(DRM_RADEON, [libdrm libdrm_radeon])
- OLD_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $DRM_RADEON_CFLAGS"
- AC_MSG_CHECKING([if radeon_drm.h is in include path])
- AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
- [[
- #include <stdint.h>
- #include <stdlib.h>
- #include "radeon_drm.h"
- ]],[[]]),[found_drm_radeon_kernel_headers=yes],[found_drm_radeon_kernel_headers=no])
-
- if test "$found_drm_radeon_kernel_headers" = "yes"; then
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no])
- AC_MSG_CHECKING([if we can find them anyway])
-
- MORE_DRM_CFLAGS="-I`$PKG_CONFIG --variable includedir libdrm`/drm"
- CFLAGS="$CFLAGS $MORE_DRM_RADEON_CFLAGS"
- AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
- [[
- #include <stdint.h>
- #include <stdlib.h>
- #include "radeon_drm.h"
- ]],[[]]),[found_drm_radeon_kernel_headers=yes],[found_drm_radeon_kernel_headers=no])
-
- if test "$found_drm_radeon_kernel_headers" = "yes"; then
- AC_MSG_RESULT([yes])
- DRM_RADEON_CFLAGS="$DRM_RADEON_CFLAGS $MORE_DRM_CFLAGS"
- else
- AC_MSG_RESULT([no])
- AC_MSG_ERROR([Could not find radeon_drm.h])
- fi
- fi
-
- AC_SUBST(DRM_RADEON_CFLAGS)
- AC_SUBST(DRM_RADEON_LIBS)
- AC_DEFINE(PLY_ENABLE_LIBDRM_RADEON, 1, [Enable support for libdrm_radeon driver])
-fi
-
-AC_ARG_ENABLE(libdrm_nouveau, AS_HELP_STRING([--enable-libdrm_nouveau],[enable building with libdrm_nouveau support]),enable_libdrm_nouveau=$enableval,enable_libdrm_nouveau=no)
-AM_CONDITIONAL(ENABLE_LIBDRM_NOUVEAU, [test "$enable_libdrm_nouveau" = yes])
-
-if test x$enable_libdrm_nouveau = xyes; then
- PKG_CHECK_MODULES(DRM_NOUVEAU, [libdrm libdrm_nouveau])
- OLD_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $DRM_NOUVEAU_CFLAGS"
- AC_MSG_CHECKING([if nouveau_drm.h is in include path])
- AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
- [[
- #include <stdint.h>
- #include <stdlib.h>
- #include "nouveau_drm.h"
- ]],[[]]),[found_drm_nouveau_kernel_headers=yes],[found_drm_nouveau_kernel_headers=no])
-
- if test "$found_drm_nouveau_kernel_headers" = "yes"; then
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no])
- AC_MSG_CHECKING([if we can find them anyway])
-
- MORE_DRM_CFLAGS="-I`$PKG_CONFIG --variable includedir libdrm`/drm"
- CFLAGS="$CFLAGS $MORE_DRM_CFLAGS"
- AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
- [[
- #include <stdint.h>
- #include <stdlib.h>
- #include "nouveau_drm.h"
- ]],[[]]),[found_drm_nouveau_kernel_headers=yes],[found_drm_nouveau_kernel_headers=no])
-
- if test "$found_drm_nouveau_kernel_headers" = "yes"; then
- AC_MSG_RESULT([yes])
- DRM_NOUVEAU_CFLAGS="$DRM_NOUVEAU_CFLAGS $MORE_DRM_CFLAGS"
- else
- AC_MSG_RESULT([no])
- AC_MSG_ERROR([Could not find nouveau_drm.h])
- fi
- fi
-
- AC_SUBST(DRM_NOUVEAU_CFLAGS)
- AC_SUBST(DRM_NOUVEAU_LIBS)
- AC_DEFINE(PLY_ENABLE_LIBDRM_NOUVEAU, 1, [Enable support for libdrm_nouveau driver])
-fi
-
-AC_ARG_ENABLE(libkms, AS_HELP_STRING([--enable-libkms],[enable building with libkms support]),enable_libkms=$enableval,enable_libkms=no)
-AM_CONDITIONAL(ENABLE_LIBKMS, [test "$enable_libkms" = yes])
-
-if test x$enable_libkms = xyes; then
- PKG_CHECK_MODULES(LIBKMS, [libdrm libkms])
- AC_SUBST(LIBKMS_CFLAGS)
- AC_SUBST(LIBKMS_LIBS)
- AC_DEFINE(PLY_ENABLE_LIBKMS, 1, [Enable support for libkms abstraction over drm drivers])
-fi
-
AC_ARG_ENABLE(drm, AS_HELP_STRING([--enable-drm-renderer],[enable building drm kms support]),enable_drm_renderer=$enableval,enable_drm_renderer=yes)
AM_CONDITIONAL(ENABLE_DRM_RENDERER, [test "$enable_drm_renderer" = yes])
PKG_CHECK_MODULES(DRM, [libdrm])
fi
-DRM_CFLAGS="$DRM_CFLAGS $DRM_INTEL_CFLAGS $DRM_RADEON_CFLAGS $DRM_NOUVEAU_CFLAGS $LIBKMS_CFLAG"
-DRM_LIBS="$DRM_LIBS $DRM_INTEL_LIBS $DRM_RADEON_LIBS $DRM_NOUVEAU_LIBS $LIBKMS_LIBS"
-AC_SUBST(DRM_CFLAGS)
-AC_SUBST(DRM_LIBS)
-
-AC_ARG_ENABLE(tracing, AS_HELP_STRING([--enable-tracing],[enable verbose tracing code]),enable_tracing=$enableval,enable_tracing=yes)
-
-if test x$enable_tracing = xyes; then
- AC_DEFINE(PLY_ENABLE_TRACING, 1, [Build in verbose debug tracing spew])
-fi
-
AC_ARG_ENABLE(tests, AS_HELP_STRING([--enable-tests],[build tests]),enable_tests=$enableval,enable_tests=yes)
AM_CONDITIONAL(ENABLE_TESTS, [test "$enable_tests" = yes])
drm_la_SOURCES += $(srcdir)/ply-renderer-generic-driver.h \
$(srcdir)/ply-renderer-generic-driver.c
-if ENABLE_LIBDRM_INTEL
-drm_la_SOURCES += $(srcdir)/ply-renderer-i915-driver.h \
- $(srcdir)/ply-renderer-i915-driver.c
-endif
-
-if ENABLE_LIBDRM_RADEON
-drm_la_SOURCES += $(srcdir)/ply-renderer-radeon-driver.h \
- $(srcdir)/ply-renderer-radeon-driver.c
-endif
-if ENABLE_LIBDRM_NOUVEAU
-drm_la_SOURCES += $(srcdir)/ply-renderer-nouveau-driver.h \
- $(srcdir)/ply-renderer-nouveau-driver.c
-endif
-
-if ENABLE_LIBKMS
-drm_la_LIBADD += $(LIBKMS_LIBS)
-drm_la_CFLAGS += $(LIBKMS_CFLAGS)
-drm_la_SOURCES += $(srcdir)/ply-renderer-libkms-driver.h \
- $(srcdir)/ply-renderer-libkms-driver.c
-endif
endif
#include "ply-renderer-plugin.h"
#include "ply-renderer-driver.h"
#include "ply-renderer-generic-driver.h"
-#ifdef PLY_ENABLE_LIBDRM_INTEL
-#include "ply-renderer-i915-driver.h"
-#endif
-#ifdef PLY_ENABLE_LIBDRM_RADEON
-#include "ply-renderer-radeon-driver.h"
-#endif
-#ifdef PLY_ENABLE_LIBDRM_NOUVEAU
-#include "ply-renderer-nouveau-driver.h"
-#endif
-
-#ifdef PLY_ENABLE_LIBKMS
-#include "ply-renderer-libkms-driver.h"
-#endif
#define BYTES_PER_PIXEL (4)
free (driver_name);
return false;
}
- backend->driver_interface = NULL;
-/* Try intel driver first if we're supporting the legacy GDM transition
- * since it can map the kernel console, which gives us the ability to do
- * a more seamless transition when plymouth quits before X starts
- */
-#if defined(PLY_ENABLE_DEPRECATED_GDM_TRANSITION) && defined(PLY_ENABLE_LIBDRM_INTEL)
- if (backend->driver_interface == NULL && strcmp (driver_name, "i915") == 0)
- {
- backend->driver_interface = ply_renderer_i915_driver_get_interface ();
- backend->driver_supports_mapping_console = true;
- }
-#endif
-
- if (backend->driver_interface == NULL)
- {
- backend->driver_interface = ply_renderer_generic_driver_get_interface (device_fd);
- backend->driver_supports_mapping_console = false;
- }
-
-#ifdef PLY_ENABLE_LIBDRM_INTEL
- if (backend->driver_interface == NULL && strcmp (driver_name, "i915") == 0)
- {
- backend->driver_interface = ply_renderer_i915_driver_get_interface ();
- backend->driver_supports_mapping_console = true;
- }
-#endif
-#ifdef PLY_ENABLE_LIBDRM_RADEON
- if (backend->driver_interface == NULL && strcmp (driver_name, "radeon") == 0)
- {
- backend->driver_interface = ply_renderer_radeon_driver_get_interface ();
- backend->driver_supports_mapping_console = false;
- }
-#endif
-#ifdef PLY_ENABLE_LIBDRM_NOUVEAU
- if (backend->driver_interface == NULL && strcmp (driver_name, "nouveau") == 0)
- {
- backend->driver_interface = ply_renderer_nouveau_driver_get_interface ();
- backend->driver_supports_mapping_console = false;
- }
-#endif
+ backend->driver_interface = ply_renderer_generic_driver_get_interface (device_fd);
+ backend->driver_supports_mapping_console = false;
free (driver_name);
if (backend->driver_interface == NULL)
{
-#ifdef PLY_ENABLE_LIBKMS
- backend->driver_interface = ply_renderer_libkms_driver_get_interface ();
- backend->driver_supports_mapping_console = false;
-#else
close (device_fd);
return false;
-#endif
}
backend->driver = backend->driver_interface->create_driver (device_fd);
+++ /dev/null
-/* ply-renderer-i915-driver.c - interface to i915 drm driver
- *
- * Copyright (C) 2009 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- * Written by: Ray Strode <rstrode@redhat.com>
- */
-#include "config.h"
-
-#include "ply-renderer-i915-driver.h"
-
-#include <arpa/inet.h>
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <string.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <values.h>
-#include <unistd.h>
-
-#include <drm.h>
-#include <i915_drm.h>
-#include <intel_bufmgr.h>
-#include <xf86drm.h>
-#include <xf86drmMode.h>
-
-#include "ply-hashtable.h"
-#include "ply-logger.h"
-#include "ply-renderer-driver.h"
-
-typedef struct _ply_renderer_buffer ply_renderer_buffer_t;
-
-struct _ply_renderer_buffer
-{
- drm_intel_bo *object;
- uint32_t id;
- unsigned long width;
- unsigned long height;
- unsigned long row_stride;
-
- uint32_t added_fb : 1;
-};
-
-struct _ply_renderer_driver
-{
- int device_fd;
- drm_intel_bufmgr *manager;
-
- ply_hashtable_t *buffers;
-};
-
-static ply_renderer_driver_t *
-create_driver (int device_fd)
-{
- ply_renderer_driver_t *driver;
- int page_size;
-
- driver = calloc (1, sizeof (ply_renderer_driver_t));
- driver->device_fd = device_fd;
-
- page_size = (int) sysconf (_SC_PAGE_SIZE);
-
- driver->manager = drm_intel_bufmgr_gem_init (driver->device_fd, page_size);
- if (driver->manager == NULL)
- {
- ply_trace ("intel buffer manager could not be initialized");
- free (driver);
- return NULL;
- }
-
- driver->buffers = ply_hashtable_new (ply_hashtable_direct_hash,
- ply_hashtable_direct_compare);
-
- return driver;
-}
-
-static void
-destroy_driver (ply_renderer_driver_t *driver)
-{
- ply_hashtable_free (driver->buffers);
-
- ply_trace ("uninitializing intel buffer manager");
- drm_intel_bufmgr_destroy (driver->manager);
- free (driver);
-}
-
-static ply_renderer_buffer_t *
-ply_renderer_buffer_new (ply_renderer_driver_t *driver,
- drm_intel_bo *buffer_object,
- uint32_t id,
- unsigned long width,
- unsigned long height,
- unsigned long row_stride)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = calloc (1, sizeof (ply_renderer_buffer_t));
- buffer->object = buffer_object;
- buffer->id = id;
- buffer->width = width;
- buffer->height = height;
- buffer->row_stride = row_stride;
-
- ply_trace ("returning %lux%lu buffer with stride %lu",
- width, height, row_stride);
-
- return buffer;
-}
-
-static drm_intel_bo *
-create_intel_bo_from_handle (ply_renderer_driver_t *driver,
- uint32_t handle)
-{
- struct drm_gem_flink flink_request;
- char *name;
- drm_intel_bo *buffer_object;
-
- /* FIXME: This can't be the right way to do this.
- *
- * 1) It requires skirting around the API and using ioctls
- * 2) It requires taking a local handle, turning it into a
- * a global handle ("name"), just so we can use an api that
- * will open the global name and grab the local handle from it.
- */
-
- memset (&flink_request, 0, sizeof (struct drm_gem_flink));
- flink_request.handle = handle;
-
- if (ioctl (driver->device_fd, DRM_IOCTL_GEM_FLINK, &flink_request) < 0)
- {
- ply_trace ("Could not export global name for handle %u", handle);
- return NULL;
- }
-
- asprintf (&name, "buffer %u", handle);
-
- buffer_object = drm_intel_bo_gem_create_from_name (driver->manager,
- name, flink_request.name);
- free (name);
-
- return buffer_object;
-}
-
-static ply_renderer_buffer_t *
-ply_renderer_buffer_new_from_id (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
- drmModeFB *fb;
- drm_intel_bo *buffer_object;
-
- fb = drmModeGetFB (driver->device_fd, buffer_id);
-
- if (fb == NULL)
- {
- ply_trace ("could not get FB with buffer id %u", buffer_id);
- return NULL;
- }
-
- buffer_object = create_intel_bo_from_handle (driver, fb->handle);
-
- if (buffer_object == NULL)
- {
- ply_trace ("could not create buffer object from handle %lu",
- (unsigned long) fb->handle);
- drmModeFreeFB (fb);
- return NULL;
- }
-
- buffer = ply_renderer_buffer_new (driver, buffer_object, buffer_id,
- fb->width, fb->height, fb->pitch);
- drmModeFreeFB (fb);
-
- return buffer;
-}
-
-static ply_renderer_buffer_t *
-get_buffer_from_id (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- static ply_renderer_buffer_t *buffer;
-
- buffer = ply_hashtable_lookup (driver->buffers,
- (void *) (uintptr_t) buffer_id);
-
- return buffer;
-}
-
-static bool
-fetch_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id,
- unsigned long *width,
- unsigned long *height,
- unsigned long *row_stride)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- if (buffer == NULL)
- {
- ply_trace ("could not fetch buffer %u, creating one", buffer_id);
- buffer = ply_renderer_buffer_new_from_id (driver, buffer_id);
-
- if (buffer == NULL)
- {
- ply_trace ("could not create buffer either %u", buffer_id);
- return false;
- }
-
- ply_hashtable_insert (driver->buffers,
- (void *) (uintptr_t) buffer_id,
- buffer);
- }
-
- if (width != NULL)
- *width = buffer->width;
-
- if (height != NULL)
- *height = buffer->height;
-
- if (row_stride != NULL)
- *row_stride = buffer->row_stride;
-
- ply_trace ("fetched %lux%lu buffer with stride %lu",
- buffer->width, buffer->height, buffer->row_stride);
- return true;
-}
-
-static uint32_t
-create_buffer (ply_renderer_driver_t *driver,
- unsigned long width,
- unsigned long height,
- unsigned long *row_stride)
-{
- drm_intel_bo *buffer_object;
- ply_renderer_buffer_t *buffer;
- uint32_t buffer_id;
-
- *row_stride = ply_round_to_multiple (width * 4, 256);
-
- buffer_object = drm_intel_bo_alloc (driver->manager,
- "frame buffer",
- height * *row_stride, 0);
-
- if (buffer_object == NULL)
- {
- ply_trace ("Could not allocate GEM object for frame buffer: %m");
- return 0;
- }
-
- if (drmModeAddFB (driver->device_fd, width, height,
- 24, 32, *row_stride, buffer_object->handle,
- &buffer_id) != 0)
- {
- ply_trace ("Could not set up GEM object as frame buffer: %m");
- drm_intel_bo_unreference (buffer_object);
- return 0;
- }
-
- buffer = ply_renderer_buffer_new (driver,
- buffer_object, buffer_id,
- width, height, *row_stride);
- buffer->added_fb = true;
- ply_hashtable_insert (driver->buffers,
- (void *) (uintptr_t) buffer_id,
- buffer);
-
- return buffer_id;
-}
-
-static bool
-map_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
- drm_intel_gem_bo_map_gtt (buffer->object);
-
- return true;
-}
-
-static void
-unmap_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
- drm_intel_gem_bo_unmap_gtt (buffer->object);
-}
-
-static char *
-begin_flush (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- return buffer->object->virtual;
-}
-
-static void
-end_flush (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-}
-
-static void
-destroy_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- if (buffer->added_fb)
- drmModeRmFB (driver->device_fd, buffer->id);
-
- drm_intel_bo_unreference (buffer->object);
-
- ply_hashtable_remove (driver->buffers,
- (void *) (uintptr_t) buffer_id);
- free (buffer);
-}
-
-ply_renderer_driver_interface_t *
-ply_renderer_i915_driver_get_interface (void)
-{
- static ply_renderer_driver_interface_t driver_interface =
- {
- .create_driver = create_driver,
- .destroy_driver = destroy_driver,
- .create_buffer = create_buffer,
- .fetch_buffer = fetch_buffer,
- .map_buffer = map_buffer,
- .unmap_buffer = unmap_buffer,
- .begin_flush = begin_flush,
- .end_flush = end_flush,
- .destroy_buffer = destroy_buffer,
- };
-
- return &driver_interface;
-}
-
-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */
+++ /dev/null
-/* ply-renderer-i915-driver.h
- *
- * Copyright (C) 2009 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- * Written By: Ray Strode <rstrode@redhat.com>
- */
-#ifndef PLY_RENDERER_I915_DRIVER_H
-#define PLY_RENDERER_I915_DRIVER_H
-
-#include "ply-renderer-driver.h"
-
-#ifndef PLY_HIDE_FUNCTION_DECLARATIONS
-ply_renderer_driver_interface_t *ply_renderer_i915_driver_get_interface (void);
-#endif
-
-#endif /* PLY_RENDERER_I915_DRIVER_H */
-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */
+++ /dev/null
-/* ply-renderer-libkms-driver.c - interface to libkms abstraction over drm drivers
- *
- * Copyright (C) 2010 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- * Written by: Ray Strode <rstrode@redhat.com>
- */
-#include "config.h"
-
-#include "ply-renderer-libkms-driver.h"
-
-#include <arpa/inet.h>
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <string.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <values.h>
-#include <unistd.h>
-
-#include <drm.h>
-#include <libkms.h>
-#include <xf86drm.h>
-#include <xf86drmMode.h>
-
-#include "ply-array.h"
-#include "ply-hashtable.h"
-#include "ply-logger.h"
-#include "ply-renderer-driver.h"
-
-typedef struct _ply_renderer_buffer ply_renderer_buffer_t;
-
-struct _ply_renderer_buffer
-{
- struct kms_bo *object;
- uint32_t id;
- unsigned long width;
- unsigned long height;
- unsigned long row_stride;
-
- void *map_address;
-
- uint32_t added_fb : 1;
-};
-
-struct _ply_renderer_driver
-{
- int device_fd;
- struct kms_driver *driver;
-
- ply_hashtable_t *buffers;
-};
-
-static ply_renderer_driver_t *
-create_driver (int device_fd)
-{
- ply_renderer_driver_t *driver;
- int result;
-
- driver = calloc (1, sizeof (ply_renderer_driver_t));
- driver->device_fd = device_fd;
-
- result = kms_create (driver->device_fd, &driver->driver);
- if (result != 0)
- {
- ply_trace ("kms buffer driver could not be initialized: %d", result);
- free (driver);
- return NULL;
- }
-
- driver->buffers = ply_hashtable_new (ply_hashtable_direct_hash,
- ply_hashtable_direct_compare);
-
- return driver;
-}
-
-static void
-destroy_driver (ply_renderer_driver_t *driver)
-{
- ply_hashtable_free (driver->buffers);
-
- ply_trace ("uninitializing kms buffer driver");
- kms_destroy (&driver->driver);
- free (driver);
-}
-
-static ply_renderer_buffer_t *
-ply_renderer_buffer_new (ply_renderer_driver_t *driver,
- struct kms_bo *buffer_object,
- uint32_t id,
- unsigned long width,
- unsigned long height,
- unsigned long row_stride)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = calloc (1, sizeof (ply_renderer_buffer_t));
- buffer->object = buffer_object;
- buffer->id = id;
- buffer->width = width;
- buffer->height = height;
- buffer->row_stride = row_stride;
-
- ply_trace ("returning %lux%lu buffer with stride %lu",
- width, height, row_stride);
-
- return buffer;
-}
-
-static ply_renderer_buffer_t *
-get_buffer_from_id (ply_renderer_driver_t *driver,
- uint32_t id)
-{
- static ply_renderer_buffer_t *buffer;
-
- buffer = ply_hashtable_lookup (driver->buffers, (void *) (uintptr_t) id);
-
- return buffer;
-}
-
-static struct kms_bo *
-create_kms_bo_from_handle (ply_renderer_driver_t *driver,
- uint32_t handle)
-{
- struct drm_gem_flink flink_request;
- struct kms_bo *buffer_object;
- ply_array_t *attributes;
- int result;
-
- /* FIXME: This can't be the right way to do this.
- *
- * 1) It requires skirting around the API and using ioctls
- * 2) It requires taking a local handle, turning it into a
- * a global handle ("name"), just so we can use an api that
- * will open the global name and grab the local handle from it.
- */
-
- memset (&flink_request, 0, sizeof (struct drm_gem_flink));
- flink_request.handle = handle;
-
- if (ioctl (driver->device_fd, DRM_IOCTL_GEM_FLINK, &flink_request) < 0)
- {
- ply_trace ("Could not export global name for handle %u", handle);
- return NULL;
- }
-
- attributes = ply_array_new (PLY_ARRAY_ELEMENT_TYPE_UINT32);
- ply_array_add_uint32_element (attributes, KMS_HANDLE);
- ply_array_add_uint32_element (attributes, flink_request.name);
- ply_array_add_uint32_element (attributes, KMS_TERMINATE_PROP_LIST);
- result = kms_bo_create (driver->driver,
- (const unsigned *)
- ply_array_get_uint32_elements (attributes),
- &buffer_object);
- ply_array_free (attributes);
-
- if (result != 0)
- {
- ply_trace ("could not create buffer object from global name %u: %d",
- flink_request.name, result);
- return NULL;
- }
-
- return buffer_object;
-}
-
-static ply_renderer_buffer_t *
-ply_renderer_buffer_new_from_id (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
- drmModeFB *fb;
- struct kms_bo *buffer_object;
-
- fb = drmModeGetFB (driver->device_fd, buffer_id);
-
- if (fb == NULL)
- {
- ply_trace ("could not get FB with buffer id %u", buffer_id);
- return NULL;
- }
-
- buffer_object = create_kms_bo_from_handle (driver, fb->handle);
-
- if (buffer_object == NULL)
- {
- ply_trace ("could not create buffer object from handle %lu",
- (unsigned long) fb->handle);
- drmModeFreeFB (fb);
- return NULL;
- }
-
- buffer = ply_renderer_buffer_new (driver, buffer_object, buffer_id,
- fb->width, fb->height, fb->pitch);
- drmModeFreeFB (fb);
-
- return buffer;
-}
-
-static bool
-fetch_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id,
- unsigned long *width,
- unsigned long *height,
- unsigned long *row_stride)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- if (buffer == NULL)
- {
- ply_trace ("could not fetch buffer %u, creating one", buffer_id);
- buffer = ply_renderer_buffer_new_from_id (driver, buffer_id);
-
- if (buffer == NULL)
- {
- ply_trace ("could not create buffer either %u", buffer_id);
- return false;
- }
-
- ply_hashtable_insert (driver->buffers,
- (void *) (uintptr_t) buffer_id,
- buffer);
- }
-
- if (width != NULL)
- *width = buffer->width;
-
- if (height != NULL)
- *height = buffer->height;
-
- if (row_stride != NULL)
- *row_stride = buffer->row_stride;
-
- ply_trace ("fetched %lux%lu buffer with stride %lu",
- buffer->width, buffer->height, buffer->row_stride);
- return true;
-}
-
-static uint32_t
-create_buffer (ply_renderer_driver_t *driver,
- unsigned long width,
- unsigned long height,
- unsigned long *row_stride)
-{
- struct kms_bo *buffer_object;
- ply_renderer_buffer_t *buffer;
- uint32_t buffer_id;
- int result;
- unsigned int handle;
- ply_array_t *attributes;
-
- *row_stride = ply_round_to_multiple (width * 4, 256);
-
- attributes = ply_array_new (PLY_ARRAY_ELEMENT_TYPE_UINT32);
- ply_array_add_uint32_element (attributes, KMS_BO_TYPE);
- ply_array_add_uint32_element (attributes, KMS_BO_TYPE_SCANOUT_X8R8G8B8);
- ply_array_add_uint32_element (attributes, KMS_WIDTH);
- ply_array_add_uint32_element (attributes, (uint32_t) width);
- ply_array_add_uint32_element (attributes, KMS_HEIGHT);
- ply_array_add_uint32_element (attributes, (uint32_t) height);
- ply_array_add_uint32_element (attributes, KMS_PITCH);
- ply_array_add_uint32_element (attributes, (uint32_t) *row_stride);
- ply_array_add_uint32_element (attributes, KMS_TERMINATE_PROP_LIST);
- result = kms_bo_create (driver->driver,
- (const unsigned *)
- ply_array_get_uint32_elements (attributes),
- &buffer_object);
- ply_array_free (attributes);
-
- if (result != 0)
- {
- ply_trace ("Could not allocate GEM object for frame buffer: %d", result);
- return 0;
- }
-
- result = kms_bo_get_prop (buffer_object, KMS_HANDLE, &handle);
-
- if (result != 0)
- {
- ply_trace ("Could not retrieve handle from GEM object: %d", result);
-
- kms_bo_destroy (&buffer_object);
- return 0;
- }
-
- if (drmModeAddFB (driver->device_fd, width, height,
- 24, 32, *row_stride, handle,
- &buffer_id) != 0)
- {
- ply_trace ("Could not set up GEM object as frame buffer: %m");
- kms_bo_destroy (&buffer_object);
- return 0;
- }
-
- buffer = ply_renderer_buffer_new (driver,
- buffer_object, buffer_id,
- width, height, *row_stride);
- buffer->added_fb = true;
- ply_hashtable_insert (driver->buffers,
- (void *) (uintptr_t) buffer_id,
- buffer);
-
- return buffer_id;
-}
-
-static bool
-map_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
- int result;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- result = kms_bo_map (buffer->object, &buffer->map_address);
-
- if (result != 0)
- {
- ply_trace ("could not map buffer %u: %d", buffer_id, result);
- buffer->map_address = MAP_FAILED;
- return false;
- }
-
- return true;
-}
-
-static void
-unmap_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- kms_bo_unmap (buffer->object);
- buffer->map_address = MAP_FAILED;
-}
-
-static char *
-begin_flush (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- return (char *) buffer->map_address;
-}
-
-static void
-end_flush (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-}
-
-static void
-destroy_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- if (buffer->added_fb)
- drmModeRmFB (driver->device_fd, buffer->id);
-
- kms_bo_destroy (&buffer->object);
-
- ply_hashtable_remove (driver->buffers,
- (void *) (uintptr_t) buffer_id);
- free (buffer);
-}
-
-ply_renderer_driver_interface_t *
-ply_renderer_libkms_driver_get_interface (void)
-{
- static ply_renderer_driver_interface_t driver_interface =
- {
- .create_driver = create_driver,
- .destroy_driver = destroy_driver,
- .create_buffer = create_buffer,
- .fetch_buffer = fetch_buffer,
- .map_buffer = map_buffer,
- .unmap_buffer = unmap_buffer,
- .begin_flush = begin_flush,
- .end_flush = end_flush,
- .destroy_buffer = destroy_buffer,
- };
-
- return &driver_interface;
-}
-
-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */
+++ /dev/null
-/* ply-renderer-kms-driver.h
- *
- * Copyright (C) 2009 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- * Written By: Ray Strode <rstrode@redhat.com>
- */
-#ifndef PLY_RENDERER_LIBKMS_DRIVER_H
-#define PLY_RENDERER_LIBKMS_DRIVER_H
-
-#include "ply-renderer-driver.h"
-
-#ifndef PLY_HIDE_FUNCTION_DECLARATIONS
-ply_renderer_driver_interface_t *ply_renderer_libkms_driver_get_interface (void);
-#endif
-
-#endif /* PLY_RENDERER_LIBKMS_DRIVER_H */
-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */
+++ /dev/null
-/* ply-renderer-nouveau-driver.c - interface to nouveau drm driver
- *
- * Copyright (C) 2009 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- * Written by: Ray Strode <rstrode@redhat.com>
- */
-#include "config.h"
-
-#include "ply-renderer-nouveau-driver.h"
-
-#include <arpa/inet.h>
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <string.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <values.h>
-#include <unistd.h>
-
-#include <drm.h>
-#include <nouveau_drm.h>
-#include <nouveau_drmif.h>
-#include <nouveau_bo.h>
-#include <xf86drm.h>
-#include <xf86drmMode.h>
-
-#include "ply-hashtable.h"
-#include "ply-logger.h"
-#include "ply-renderer-driver.h"
-
-typedef struct _ply_renderer_buffer ply_renderer_buffer_t;
-
-struct _ply_renderer_buffer
-{
- struct nouveau_bo *object;
- uint32_t id;
- unsigned long width;
- unsigned long height;
- unsigned long row_stride;
-
- uint32_t added_fb : 1;
-};
-
-struct _ply_renderer_driver
-{
- int device_fd;
- struct nouveau_device *device;
-
- ply_hashtable_t *buffers;
-};
-
-static ply_renderer_driver_t *
-create_driver (int device_fd)
-{
- ply_renderer_driver_t *driver;
-
- driver = calloc (1, sizeof (ply_renderer_driver_t));
- driver->device_fd = device_fd;
-
- if (nouveau_device_open_existing (&driver->device, true,
- driver->device_fd, 0) < 0)
- {
- ply_trace ("could not open nouveau device");
- free (driver);
- return NULL;
- }
-
- driver->buffers = ply_hashtable_new (ply_hashtable_direct_hash,
- ply_hashtable_direct_compare);
-
- return driver;
-}
-
-static void
-destroy_driver (ply_renderer_driver_t *driver)
-{
- ply_hashtable_free (driver->buffers);
-
- ply_trace ("closing nouveau device");
- nouveau_device_close (&driver->device);
- free (driver);
-}
-
-static ply_renderer_buffer_t *
-ply_renderer_buffer_new (ply_renderer_driver_t *driver,
- struct nouveau_bo *buffer_object,
- uint32_t id,
- unsigned long width,
- unsigned long height,
- unsigned long row_stride)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = calloc (1, sizeof (ply_renderer_buffer_t));
- buffer->object = buffer_object;
- buffer->id = id;
- buffer->width = width;
- buffer->height = height;
- buffer->row_stride = row_stride;
-
- ply_trace ("returning %lux%lu buffer with stride %lu",
- width, height, row_stride);
-
- return buffer;
-}
-
-static ply_renderer_buffer_t *
-ply_renderer_buffer_new_from_id (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
- drmModeFB *fb;
- struct nouveau_bo *buffer_object;
-
- fb = drmModeGetFB (driver->device_fd, buffer_id);
-
- if (fb == NULL)
- {
- ply_trace ("could not get FB with buffer id %u", buffer_id);
- return NULL;
- }
-
- if (nouveau_bo_wrap (driver->device,
- fb->handle, &buffer_object) < 0)
- {
- ply_trace ("could not create buffer object from handle %lu",
- (unsigned long) fb->handle);
- drmModeFreeFB (fb);
- return NULL;
- }
-
- buffer = ply_renderer_buffer_new (driver, buffer_object, buffer_id,
- fb->width, fb->height, fb->pitch);
- drmModeFreeFB (fb);
-
- return buffer;
-}
-
-static ply_renderer_buffer_t *
-get_buffer_from_id (ply_renderer_driver_t *driver,
- uint32_t id)
-{
- static ply_renderer_buffer_t *buffer;
-
- buffer = ply_hashtable_lookup (driver->buffers, (void *) (uintptr_t) id);
-
- return buffer;
-}
-
-static bool
-fetch_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id,
- unsigned long *width,
- unsigned long *height,
- unsigned long *row_stride)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- if (buffer == NULL)
- {
- ply_trace ("could not fetch buffer %u, creating one", buffer_id);
- buffer = ply_renderer_buffer_new_from_id (driver, buffer_id);
-
- if (buffer == NULL)
- {
- ply_trace ("could not create buffer either %u", buffer_id);
- return false;
- }
-
- ply_hashtable_insert (driver->buffers,
- (void *) (uintptr_t) buffer_id,
- buffer);
- }
-
- if (width != NULL)
- *width = buffer->width;
-
- if (height != NULL)
- *height = buffer->height;
-
- if (row_stride != NULL)
- *row_stride = buffer->row_stride;
-
- ply_trace ("fetched %lux%lu buffer with stride %lu",
- buffer->width, buffer->height, buffer->row_stride);
- return true;
-}
-
-
-static uint32_t
-create_buffer (ply_renderer_driver_t *driver,
- unsigned long width,
- unsigned long height,
- unsigned long *row_stride)
-{
- struct nouveau_bo *buffer_object;
- ply_renderer_buffer_t *buffer;
- uint32_t buffer_id;
-
- *row_stride = ply_round_to_multiple (width * 4, 256);
-
- buffer_object = NULL;
- if (nouveau_bo_new (driver->device,
- NOUVEAU_BO_VRAM | NOUVEAU_BO_MAP, 0,
- height * *row_stride, &buffer_object) < 0)
- {
- ply_trace ("Could not allocate GEM object for frame buffer: %m");
- return 0;
- }
-
- /* The map here forces the buffer object to be instantiated
- * immediately (it's normally instantiated lazily when needed
- * by other nouveau_bo api)
- */
- nouveau_bo_map (buffer_object, NOUVEAU_BO_WR);
- if (drmModeAddFB (driver->device_fd, width, height,
- 24, 32, *row_stride, buffer_object->handle,
- &buffer_id) != 0)
- {
- nouveau_bo_unmap (buffer_object);
- ply_trace ("Could not set up GEM object as frame buffer: %m");
- nouveau_bo_ref (NULL, &buffer_object);
- return 0;
- }
- nouveau_bo_unmap (buffer_object);
-
- buffer = ply_renderer_buffer_new (driver,
- buffer_object, buffer_id,
- width, height, *row_stride);
- buffer->added_fb = true;
- ply_hashtable_insert (driver->buffers,
- (void *) (uintptr_t) buffer_id,
- buffer);
-
- return buffer_id;
-}
-
-static bool
-map_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- return nouveau_bo_map (buffer->object, NOUVEAU_BO_WR) == 0;
-}
-
-static void
-unmap_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- nouveau_bo_unmap (buffer->object);
-}
-
-static char *
-begin_flush (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- return buffer->object->map;
-}
-
-static void
-end_flush (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-}
-
-static void
-destroy_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- if (buffer->added_fb)
- drmModeRmFB (driver->device_fd, buffer->id);
-
- nouveau_bo_ref (NULL, &buffer->object);
-
- ply_hashtable_remove (driver->buffers,
- (void *) (uintptr_t) buffer_id);
- free (buffer);
-}
-
-ply_renderer_driver_interface_t *
-ply_renderer_nouveau_driver_get_interface (void)
-{
- static ply_renderer_driver_interface_t driver_interface =
- {
- .create_driver = create_driver,
- .destroy_driver = destroy_driver,
- .create_buffer = create_buffer,
- .fetch_buffer = fetch_buffer,
- .map_buffer = map_buffer,
- .unmap_buffer = unmap_buffer,
- .begin_flush = begin_flush,
- .end_flush = end_flush,
- .destroy_buffer = destroy_buffer,
- };
-
- return &driver_interface;
-}
-
-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */
+++ /dev/null
-/* ply-renderer-nouveau-driver.h
- *
- * Copyright (C) 2009 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- * Written By: Ray Strode <rstrode@redhat.com>
- */
-#ifndef PLY_RENDERER_NOUVEAU_DRIVER_H
-#define PLY_RENDERER_NOUVEAU_DRIVER_H
-
-#include "ply-renderer-driver.h"
-
-#ifndef PLY_HIDE_FUNCTION_DECLARATIONS
-ply_renderer_driver_interface_t *ply_renderer_nouveau_driver_get_interface (void);
-#endif
-
-#endif /* PLY_RENDERER_NOUVEAU_DRIVER_H */
-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */
+++ /dev/null
-/* ply-renderer-radeon-driver.c - interface to radeon drm driver
- *
- * Copyright (C) 2009 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- * Written by: Ray Strode <rstrode@redhat.com>
- */
-#include "config.h"
-
-#include "ply-renderer-radeon-driver.h"
-
-#include <arpa/inet.h>
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <string.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <values.h>
-#include <unistd.h>
-
-#include <drm.h>
-#include <radeon_drm.h>
-#include <radeon_bo.h>
-#include <radeon_bo_gem.h>
-#include <xf86drm.h>
-#include <xf86drmMode.h>
-
-#include "ply-hashtable.h"
-#include "ply-logger.h"
-#include "ply-renderer-driver.h"
-
-typedef struct _ply_renderer_buffer ply_renderer_buffer_t;
-
-struct _ply_renderer_buffer
-{
- struct radeon_bo *object;
- uint32_t id;
- unsigned long width;
- unsigned long height;
- unsigned long row_stride;
-
- uint32_t added_fb : 1;
-};
-
-struct _ply_renderer_driver
-{
- int device_fd;
- struct radeon_bo_manager *manager;
-
- ply_hashtable_t *buffers;
-};
-
-static ply_renderer_driver_t *
-create_driver (int device_fd)
-{
- ply_renderer_driver_t *driver;
-
- driver = calloc (1, sizeof (ply_renderer_driver_t));
- driver->device_fd = device_fd;
-
- driver->manager = radeon_bo_manager_gem_ctor (driver->device_fd);
- if (driver->manager == NULL)
- {
- ply_trace ("radeon buffer manager could not be initialized");
- free (driver);
- return NULL;
- }
-
- driver->buffers = ply_hashtable_new (ply_hashtable_direct_hash,
- ply_hashtable_direct_compare);
-
- return driver;
-}
-
-static void
-destroy_driver (ply_renderer_driver_t *driver)
-{
- ply_hashtable_free (driver->buffers);
-
- ply_trace ("uninitializing radeon buffer manager");
- radeon_bo_manager_gem_dtor (driver->manager);
- free (driver);
-}
-
-static ply_renderer_buffer_t *
-ply_renderer_buffer_new (ply_renderer_driver_t *driver,
- struct radeon_bo *buffer_object,
- uint32_t id,
- unsigned long width,
- unsigned long height,
- unsigned long row_stride)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = calloc (1, sizeof (ply_renderer_buffer_t));
- buffer->object = buffer_object;
- buffer->id = id;
- buffer->width = width;
- buffer->height = height;
- buffer->row_stride = row_stride;
-
- ply_trace ("returning %lux%lu buffer with stride %lu",
- width, height, row_stride);
-
- return buffer;
-}
-
-static ply_renderer_buffer_t *
-get_buffer_from_id (ply_renderer_driver_t *driver,
- uint32_t id)
-{
- static ply_renderer_buffer_t *buffer;
-
- buffer = ply_hashtable_lookup (driver->buffers, (void *) (uintptr_t) id);
-
- return buffer;
-}
-
-static struct radeon_bo *
-create_radeon_bo_from_handle (ply_renderer_driver_t *driver,
- uint32_t handle)
-{
- struct drm_gem_flink flink_request;
- struct radeon_bo *buffer_object;
-
- /* FIXME: This can't be the right way to do this.
- *
- * 1) It requires skirting around the API and using ioctls
- * 2) It requires taking a local handle, turning it into a
- * a global handle ("name"), just so we can use an api that
- * will open the global name and grab the local handle from it.
- */
-
- memset (&flink_request, 0, sizeof (struct drm_gem_flink));
- flink_request.handle = handle;
-
- if (ioctl (driver->device_fd, DRM_IOCTL_GEM_FLINK, &flink_request) < 0)
- {
- ply_trace ("Could not export global name for handle %u", handle);
- return NULL;
- }
-
- buffer_object = radeon_bo_open (driver->manager, flink_request.name,
- 0, 0, RADEON_GEM_DOMAIN_GTT, 0);
-
- return buffer_object;
-}
-
-static ply_renderer_buffer_t *
-ply_renderer_buffer_new_from_id (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
- drmModeFB *fb;
- struct radeon_bo *buffer_object;
-
- fb = drmModeGetFB (driver->device_fd, buffer_id);
-
- if (fb == NULL)
- {
- ply_trace ("could not get FB with buffer id %u", buffer_id);
- return NULL;
- }
-
- buffer_object = create_radeon_bo_from_handle (driver, fb->handle);
-
- if (buffer_object == NULL)
- {
- ply_trace ("could not create buffer object from handle %lu",
- (unsigned long) fb->handle);
- drmModeFreeFB (fb);
- return NULL;
- }
-
- buffer = ply_renderer_buffer_new (driver, buffer_object, buffer_id,
- fb->width, fb->height, fb->pitch);
- drmModeFreeFB (fb);
-
- return buffer;
-}
-
-
-static bool
-fetch_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id,
- unsigned long *width,
- unsigned long *height,
- unsigned long *row_stride)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- if (buffer == NULL)
- {
- ply_trace ("could not fetch buffer %u, creating one", buffer_id);
- buffer = ply_renderer_buffer_new_from_id (driver, buffer_id);
-
- if (buffer == NULL)
- {
- ply_trace ("could not create buffer either %u", buffer_id);
- return false;
- }
-
- ply_hashtable_insert (driver->buffers,
- (void *) (uintptr_t) buffer_id,
- buffer);
- }
-
- if (width != NULL)
- *width = buffer->width;
-
- if (height != NULL)
- *height = buffer->height;
-
- if (row_stride != NULL)
- *row_stride = buffer->row_stride;
-
- ply_trace ("fetched %lux%lu buffer with stride %lu",
- buffer->width, buffer->height, buffer->row_stride);
- return true;
-}
-
-static uint32_t
-create_buffer (ply_renderer_driver_t *driver,
- unsigned long width,
- unsigned long height,
- unsigned long *row_stride)
-{
- struct radeon_bo *buffer_object;
- ply_renderer_buffer_t *buffer;
- uint32_t buffer_id;
-
- *row_stride = ply_round_to_multiple (width * 4, 256);
-
- buffer_object = radeon_bo_open (driver->manager, 0,
- height * *row_stride,
- 0, RADEON_GEM_DOMAIN_GTT, 0);
-
- if (buffer_object == NULL)
- {
- ply_trace ("Could not allocate GEM object for frame buffer: %m");
- return 0;
- }
-
- if (drmModeAddFB (driver->device_fd, width, height,
- 24, 32, *row_stride, buffer_object->handle,
- &buffer_id) != 0)
- {
- ply_trace ("Could not set up GEM object as frame buffer: %m");
- radeon_bo_unref (buffer_object);
- return 0;
- }
-
- buffer = ply_renderer_buffer_new (driver,
- buffer_object, buffer_id,
- width, height, *row_stride);
- buffer->added_fb = true;
- ply_hashtable_insert (driver->buffers,
- (void *) (uintptr_t) buffer_id,
- buffer);
-
- return buffer_id;
-}
-
-static bool
-map_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- return radeon_bo_map (buffer->object, true) == 0;
-}
-
-static void
-unmap_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- radeon_bo_unmap (buffer->object);
-}
-
-static char *
-begin_flush (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- return buffer->object->ptr;
-}
-
-static void
-end_flush (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-}
-
-static void
-destroy_buffer (ply_renderer_driver_t *driver,
- uint32_t buffer_id)
-{
- ply_renderer_buffer_t *buffer;
-
- buffer = get_buffer_from_id (driver, buffer_id);
-
- assert (buffer != NULL);
-
- if (buffer->added_fb)
- drmModeRmFB (driver->device_fd, buffer->id);
-
- radeon_bo_unref (buffer->object);
-
- ply_hashtable_remove (driver->buffers,
- (void *) (uintptr_t) buffer_id);
- free (buffer);
-}
-
-ply_renderer_driver_interface_t *
-ply_renderer_radeon_driver_get_interface (void)
-{
- static ply_renderer_driver_interface_t driver_interface =
- {
- .create_driver = create_driver,
- .destroy_driver = destroy_driver,
- .create_buffer = create_buffer,
- .fetch_buffer = fetch_buffer,
- .map_buffer = map_buffer,
- .unmap_buffer = unmap_buffer,
- .begin_flush = begin_flush,
- .end_flush = end_flush,
- .destroy_buffer = destroy_buffer,
- };
-
- return &driver_interface;
-}
-
-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */
+++ /dev/null
-/* ply-renderer-radeon-driver.h
- *
- * Copyright (C) 2009 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- * Written By: Ray Strode <rstrode@redhat.com>
- */
-#ifndef PLY_RENDERER_RADEON_DRIVER_H
-#define PLY_RENDERER_RADEON_DRIVER_H
-
-#include "ply-renderer-driver.h"
-
-#ifndef PLY_HIDE_FUNCTION_DECLARATIONS
-ply_renderer_driver_interface_t *ply_renderer_radeon_driver_get_interface (void);
-#endif
-
-#endif /* PLY_RENDERER_RADEON_DRIVER_H */
-/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */