This diff updates libdrm to the latest upstream release. Might do
with some testing, especially on radeondrm. You'll need the kernel
header changes that I just committed to be able to build this.
Index: Makefile.inc
===================================================================
RCS file: /home/cvs/xenocara/lib/libdrm/Makefile.inc,v
retrieving revision 1.7
diff -u -p -r1.7 Makefile.inc
--- Makefile.inc 8 Jul 2013 09:10:05 -0000 1.7
+++ Makefile.inc 15 Nov 2013 14:00:11 -0000
@@ -1,6 +1,6 @@
# $OpenBSD: Makefile.inc,v 1.7 2013/07/08 09:10:05 jsg Exp $
-PACKAGE_VERSION= 2.4.46
+PACKAGE_VERSION= 2.4.47
NOPROFILE=
Index: xf86drm.c
===================================================================
RCS file: /home/cvs/xenocara/lib/libdrm/xf86drm.c,v
retrieving revision 1.9
diff -u -p -r1.9 xf86drm.c
--- xf86drm.c 20 Jun 2013 09:55:30 -0000 1.9
+++ xf86drm.c 15 Nov 2013 13:59:50 -0000
@@ -830,6 +830,13 @@ int drmGetCap(int fd, uint64_t capabilit
return 0;
}
+int drmSetClientCap(int fd, uint64_t capability, uint64_t value)
+{
+ struct drm_set_client_cap cap = { capability, value };
+
+ return drmIoctl(fd, DRM_IOCTL_SET_CLIENT_CAP, &cap);
+}
+
/**
* Free the bus ID information.
*
Index: xf86drm.h
===================================================================
RCS file: /home/cvs/xenocara/lib/libdrm/xf86drm.h,v
retrieving revision 1.7
diff -u -p -r1.7 xf86drm.h
--- xf86drm.h 25 Mar 2013 02:32:20 -0000 1.7
+++ xf86drm.h 15 Nov 2013 13:59:50 -0000
@@ -609,6 +609,8 @@ extern int drmUpdateDrawableIn
unsigned int num, void *data);
extern int drmCtlInstHandler(int fd, int irq);
extern int drmCtlUninstHandler(int fd);
+extern int drmSetClientCap(int fd, uint64_t capability,
+ uint64_t value);
/* General user-level programmer's API: authenticated client and/or X */
extern int drmMap(int fd,
Index: xf86drmMode.h
===================================================================
RCS file: /home/cvs/xenocara/lib/libdrm/xf86drmMode.h,v
retrieving revision 1.5
diff -u -p -r1.5 xf86drmMode.h
--- xf86drmMode.h 8 Jul 2013 09:10:05 -0000 1.5
+++ xf86drmMode.h 15 Nov 2013 13:59:50 -0000
@@ -81,20 +81,30 @@ extern "C" {
/* Video mode flags */
/* bit compatible with the xorg definitions. */
-#define DRM_MODE_FLAG_PHSYNC (1<<0)
-#define DRM_MODE_FLAG_NHSYNC (1<<1)
-#define DRM_MODE_FLAG_PVSYNC (1<<2)
-#define DRM_MODE_FLAG_NVSYNC (1<<3)
-#define DRM_MODE_FLAG_INTERLACE (1<<4)
-#define DRM_MODE_FLAG_DBLSCAN (1<<5)
-#define DRM_MODE_FLAG_CSYNC (1<<6)
-#define DRM_MODE_FLAG_PCSYNC (1<<7)
-#define DRM_MODE_FLAG_NCSYNC (1<<8)
-#define DRM_MODE_FLAG_HSKEW (1<<9) /* hskew provided */
-#define DRM_MODE_FLAG_BCAST (1<<10)
-#define DRM_MODE_FLAG_PIXMUX (1<<11)
-#define DRM_MODE_FLAG_DBLCLK (1<<12)
-#define DRM_MODE_FLAG_CLKDIV2 (1<<13)
+#define DRM_MODE_FLAG_PHSYNC (1<<0)
+#define DRM_MODE_FLAG_NHSYNC (1<<1)
+#define DRM_MODE_FLAG_PVSYNC (1<<2)
+#define DRM_MODE_FLAG_NVSYNC (1<<3)
+#define DRM_MODE_FLAG_INTERLACE (1<<4)
+#define DRM_MODE_FLAG_DBLSCAN (1<<5)
+#define DRM_MODE_FLAG_CSYNC (1<<6)
+#define DRM_MODE_FLAG_PCSYNC (1<<7)
+#define DRM_MODE_FLAG_NCSYNC (1<<8)
+#define DRM_MODE_FLAG_HSKEW (1<<9) /* hskew provided */
+#define DRM_MODE_FLAG_BCAST (1<<10)
+#define DRM_MODE_FLAG_PIXMUX (1<<11)
+#define DRM_MODE_FLAG_DBLCLK (1<<12)
+#define DRM_MODE_FLAG_CLKDIV2 (1<<13)
+#define DRM_MODE_FLAG_3D_MASK (0x1f<<14)
+#define DRM_MODE_FLAG_3D_NONE (0<<14)
+#define DRM_MODE_FLAG_3D_FRAME_PACKING (1<<14)
+#define DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE (2<<14)
+#define DRM_MODE_FLAG_3D_LINE_ALTERNATIVE (3<<14)
+#define DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL (4<<14)
+#define DRM_MODE_FLAG_3D_L_DEPTH (5<<14)
+#define DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH (6<<14)
+#define DRM_MODE_FLAG_3D_TOP_AND_BOTTOM (7<<14)
+#define DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF (8<<14)
/* DPMS flags */
/* bit compatible with the xorg definitions. */
@@ -218,11 +228,11 @@ typedef struct _drmModeProperty {
uint32_t flags;
char name[DRM_PROP_NAME_LEN];
int count_values;
- uint64_t *values; // store the blob lengths
+ uint64_t *values; /* store the blob lengths */
int count_enums;
struct drm_mode_property_enum *enums;
int count_blobs;
- uint32_t *blob_ids; // store the blob IDs
+ uint32_t *blob_ids; /* store the blob IDs */
} drmModePropertyRes, *drmModePropertyPtr;
typedef struct _drmModeCrtc {
Index: intel/intel_bufmgr_gem.c
===================================================================
RCS file: /home/cvs/xenocara/lib/libdrm/intel/intel_bufmgr_gem.c,v
retrieving revision 1.16
diff -u -p -r1.16 intel_bufmgr_gem.c
--- intel/intel_bufmgr_gem.c 8 Jul 2013 09:10:05 -0000 1.16
+++ intel/intel_bufmgr_gem.c 15 Nov 2013 13:59:49 -0000
@@ -1326,6 +1326,7 @@ int drm_intel_gem_bo_map_gtt(drm_intel_b
int drm_intel_gem_bo_map_unsynchronized(drm_intel_bo *bo)
{
drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
+ drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
int ret;
/* If the CPU cache isn't coherent with the GTT, then use a
@@ -1339,7 +1340,13 @@ int drm_intel_gem_bo_map_unsynchronized(
return drm_intel_gem_bo_map_gtt(bo);
pthread_mutex_lock(&bufmgr_gem->lock);
+
ret = map_gtt(bo);
+ if (ret == 0) {
+ drm_intel_gem_bo_mark_mmaps_incoherent(bo);
+ VG(VALGRIND_MAKE_MEM_DEFINED(bo_gem->gtt_virtual, bo->size));
+ }
+
pthread_mutex_unlock(&bufmgr_gem->lock);
return ret;
@@ -2459,7 +2466,17 @@ drm_intel_bo_gem_create_from_prime(drm_i
if (!bo_gem)
return NULL;
- bo_gem->bo.size = size;
+ /* Determine size of bo. The fd-to-handle ioctl really should
+ * return the size, but it doesn't. If we have kernel 3.12 or
+ * later, we can lseek on the prime fd to get the size. Older
+ * kernels will just fail, in which case we fall back to the
+ * provided (estimated or guess size). */
+ ret = lseek(prime_fd, 0, SEEK_END);
+ if (ret != -1)
+ bo_gem->bo.size = ret;
+ else
+ bo_gem->bo.size = size;
+
bo_gem->bo.handle = handle;
bo_gem->bo.bufmgr = bufmgr;
Index: intel/libdrm_intel.pc.in
===================================================================
RCS file: /home/cvs/xenocara/lib/libdrm/intel/libdrm_intel.pc.in,v
retrieving revision 1.1
diff -u -p -r1.1 libdrm_intel.pc.in
--- intel/libdrm_intel.pc.in 27 Jun 2009 10:02:53 -0000 1.1
+++ intel/libdrm_intel.pc.in 15 Nov 2013 13:59:49 -0000
@@ -3,8 +3,8 @@ exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
-Name: libdrm
-Description: Userspace interface to kernel DRM services
+Name: libdrm_intel
+Description: Userspace interface to intel kernel DRM services
Version: @PACKAGE_VERSION@
Libs: -L${libdir} -ldrm -ldrm_intel
Cflags: -I${includedir} -I/usr/include/dev/pci/drm
Index: radeon/r600_pci_ids.h
===================================================================
RCS file: /home/cvs/xenocara/lib/libdrm/radeon/r600_pci_ids.h,v
retrieving revision 1.4
diff -u -p -r1.4 r600_pci_ids.h
--- radeon/r600_pci_ids.h 8 Jul 2013 09:10:05 -0000 1.4
+++ radeon/r600_pci_ids.h 15 Nov 2013 13:59:49 -0000
@@ -424,3 +424,25 @@ CHIPSET(0x983C, KABINI_983C, KABINI)
CHIPSET(0x983D, KABINI_983D, KABINI)
CHIPSET(0x983E, KABINI_983E, KABINI)
CHIPSET(0x983F, KABINI_983F, KABINI)
+
+CHIPSET(0x1304, KAVERI_1304, KAVERI)
+CHIPSET(0x1305, KAVERI_1305, KAVERI)
+CHIPSET(0x1306, KAVERI_1306, KAVERI)
+CHIPSET(0x1307, KAVERI_1307, KAVERI)
+CHIPSET(0x1309, KAVERI_1309, KAVERI)
+CHIPSET(0x130A, KAVERI_130A, KAVERI)
+CHIPSET(0x130B, KAVERI_130B, KAVERI)
+CHIPSET(0x130C, KAVERI_130C, KAVERI)
+CHIPSET(0x130D, KAVERI_130D, KAVERI)
+CHIPSET(0x130E, KAVERI_130E, KAVERI)
+CHIPSET(0x130F, KAVERI_130F, KAVERI)
+CHIPSET(0x1310, KAVERI_1310, KAVERI)
+CHIPSET(0x1311, KAVERI_1311, KAVERI)
+CHIPSET(0x1312, KAVERI_1312, KAVERI)
+CHIPSET(0x1313, KAVERI_1313, KAVERI)
+CHIPSET(0x1315, KAVERI_1315, KAVERI)
+CHIPSET(0x1316, KAVERI_1316, KAVERI)
+CHIPSET(0x1317, KAVERI_1317, KAVERI)
+CHIPSET(0x131B, KAVERI_131B, KAVERI)
+CHIPSET(0x131C, KAVERI_131C, KAVERI)
+CHIPSET(0x131D, KAVERI_131D, KAVERI)
Index: radeon/radeon_cs_gem.c
===================================================================
RCS file: /home/cvs/xenocara/lib/libdrm/radeon/radeon_cs_gem.c,v
retrieving revision 1.2
diff -u -p -r1.2 radeon_cs_gem.c
--- radeon/radeon_cs_gem.c 25 Mar 2013 02:32:20 -0000 1.2
+++ radeon/radeon_cs_gem.c 15 Nov 2013 13:59:49 -0000
@@ -425,6 +425,9 @@ static int cs_gem_emit(struct radeon_cs_
unsigned i;
int r;
+ while (cs->cdw & 7)
+ radeon_cs_write_dword((struct radeon_cs *)cs, 0x80000000);
+
#if CS_BOF_DUMP
cs_gem_dump_bof(cs);
#endif
Index: radeon/radeon_surface.c
===================================================================
RCS file: /home/cvs/xenocara/lib/libdrm/radeon/radeon_surface.c,v
retrieving revision 1.4
diff -u -p -r1.4 radeon_surface.c
--- radeon/radeon_surface.c 8 Jul 2013 09:10:05 -0000 1.4
+++ radeon/radeon_surface.c 15 Nov 2013 13:59:50 -0000
@@ -1382,10 +1382,16 @@ static int si_surface_sanity(struct rade
break;
case RADEON_SURF_MODE_1D:
if (surf->flags & RADEON_SURF_SBUFFER) {
- *stencil_tile_mode = SI_TILE_MODE_DEPTH_STENCIL_1D;
+ if (surf_man->family >= CHIP_BONAIRE)
+ *stencil_tile_mode = CIK_TILE_MODE_DEPTH_STENCIL_1D;
+ else
+ *stencil_tile_mode = SI_TILE_MODE_DEPTH_STENCIL_1D;
}
if (surf->flags & RADEON_SURF_ZBUFFER) {
- *tile_mode = SI_TILE_MODE_DEPTH_STENCIL_1D;
+ if (surf_man->family >= CHIP_BONAIRE)
+ *tile_mode = CIK_TILE_MODE_DEPTH_STENCIL_1D;
+ else
+ *tile_mode = SI_TILE_MODE_DEPTH_STENCIL_1D;
} else if (surf->flags & RADEON_SURF_SCANOUT) {
*tile_mode = SI_TILE_MODE_COLOR_1D_SCANOUT;
} else {
@@ -1406,7 +1412,11 @@ static void si_surf_minify(struct radeon
uint32_t xalign, uint32_t yalign, uint32_t zalign,
uint32_t slice_align, unsigned offset)
{
- surflevel->npix_x = mip_minify(surf->npix_x, level);
+ if (level == 0) {
+ surflevel->npix_x = surf->npix_x;
+ } else {
+ surflevel->npix_x = mip_minify(next_power_of_two(surf->npix_x), level);
+ }
surflevel->npix_y = mip_minify(surf->npix_y, level);
surflevel->npix_z = mip_minify(surf->npix_z, level);
@@ -1428,7 +1438,7 @@ static void si_surf_minify(struct radeon
if (level == 0 && surf->last_level == 0)
/* Non-mipmap pitch padded to slice alignment */
xalign = MAX2(xalign, slice_align / surf->bpe);
- else
+ else if (surflevel->mode == RADEON_SURF_MODE_LINEAR_ALIGNED)
/* Small rows evenly distributed across slice */
xalign = MAX2(xalign, slice_align / surf->bpe / surflevel->nblk_y);
@@ -1450,7 +1460,11 @@ static void si_surf_minify_2d(struct rad
{
unsigned mtile_pr, mtile_ps;
- surflevel->npix_x = mip_minify(surf->npix_x, level);
+ if (level == 0) {
+ surflevel->npix_x = surf->npix_x;
+ } else {
+ surflevel->npix_x = mip_minify(next_power_of_two(surf->npix_x), level);
+ }
surflevel->npix_y = mip_minify(surf->npix_y, level);
surflevel->npix_z = mip_minify(surf->npix_z, level);
@@ -1643,7 +1657,10 @@ static int si_surface_init_2d(struct rad
tile_mode = SI_TILE_MODE_COLOR_1D_SCANOUT;
break;
case SI_TILE_MODE_DEPTH_STENCIL_2D:
- tile_mode = SI_TILE_MODE_DEPTH_STENCIL_1D;
+ if (surf_man->family >= CHIP_BONAIRE)
+ tile_mode = CIK_TILE_MODE_DEPTH_STENCIL_1D;
+ else
+ tile_mode = SI_TILE_MODE_DEPTH_STENCIL_1D;
break;
default:
return -EINVAL;