From 321c029396348f743537824bde13f4b161002222 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Feb 05 2009 00:52:26 +0000 Subject: - update with more libdrm/radeon upstream fixes --- diff --git a/libdrm-radeon-update.patch b/libdrm-radeon-update.patch deleted file mode 100644 index 74d3cf3..0000000 --- a/libdrm-radeon-update.patch +++ /dev/null @@ -1,309 +0,0 @@ -diff --git a/libdrm/radeon/radeon_bo.h b/libdrm/radeon/radeon_bo.h -index 44dc090..3cabdfc 100644 ---- a/libdrm/radeon/radeon_bo.h -+++ b/libdrm/radeon/radeon_bo.h -@@ -52,6 +52,7 @@ struct radeon_bo { - #endif - void *ptr; - struct radeon_bo_manager *bom; -+ uint32_t space_accounted; - }; - - /* bo functions */ -@@ -66,6 +67,7 @@ struct radeon_bo_funcs { - struct radeon_bo *(*bo_unref)(struct radeon_bo *bo); - int (*bo_map)(struct radeon_bo *bo, int write); - int (*bo_unmap)(struct radeon_bo *bo); -+ int (*bo_wait)(struct radeon_bo *bo); - }; - - struct radeon_bo_manager { -@@ -151,6 +153,14 @@ static inline int _radeon_bo_unmap(struct radeon_bo *bo, - return bo->bom->funcs->bo_unmap(bo); - } - -+static inline int _radeon_bo_wait(struct radeon_bo *bo, -+ const char *file, -+ const char *func, -+ int line) -+{ -+ return bo->bom->funcs->bo_wait(bo); -+} -+ - #define radeon_bo_open(bom, h, s, a, d, f)\ - _radeon_bo_open(bom, h, s, a, d, f, __FILE__, __FUNCTION__, __LINE__) - #define radeon_bo_ref(bo)\ -@@ -163,5 +173,7 @@ static inline int _radeon_bo_unmap(struct radeon_bo *bo, - _radeon_bo_unmap(bo, __FILE__, __FUNCTION__, __LINE__) - #define radeon_bo_debug(bo, opcode)\ - _radeon_bo_debug(bo, opcode, __FILE__, __FUNCTION__, __LINE__) -+#define radeon_bo_wait(bo) \ -+ _radeon_bo_wait(bo, __FILE__, __func__, __LINE__) - - #endif -diff --git a/libdrm/radeon/radeon_bo_gem.c b/libdrm/radeon/radeon_bo_gem.c -index fdf852a..932afeb 100644 ---- a/libdrm/radeon/radeon_bo_gem.c -+++ b/libdrm/radeon/radeon_bo_gem.c -@@ -35,6 +35,7 @@ - #include - #include - #include -+#include - #include "xf86drm.h" - #include "drm.h" - #include "radeon_drm.h" -@@ -176,12 +177,26 @@ static int bo_unmap(struct radeon_bo *bo) - return 0; - } - -+static int bo_wait(struct radeon_bo *bo) -+{ -+ struct drm_radeon_gem_wait_rendering args; -+ int ret; -+ -+ args.handle = bo->handle; -+ do { -+ ret = drmCommandWriteRead(bo->bom->fd, DRM_RADEON_GEM_WAIT_RENDERING, -+ &args, sizeof(args)); -+ } while (ret == -EAGAIN); -+ return ret; -+} -+ - static struct radeon_bo_funcs bo_gem_funcs = { - bo_open, - bo_ref, - bo_unref, - bo_map, -- bo_unmap -+ bo_unmap, -+ bo_wait - }; - - struct radeon_bo_manager *radeon_bo_manager_gem_ctor(int fd) -diff --git a/libdrm/radeon/radeon_cs.h b/libdrm/radeon/radeon_cs.h -index 8b1a999..8b5a2a9 100644 ---- a/libdrm/radeon/radeon_cs.h -+++ b/libdrm/radeon/radeon_cs.h -@@ -33,6 +33,8 @@ - #define RADEON_CS_H - - #include -+#include "drm.h" -+#include "radeon_drm.h" - #include "radeon_bo.h" - - struct radeon_cs_reloc { -@@ -42,6 +44,18 @@ struct radeon_cs_reloc { - uint32_t flags; - }; - -+ -+#define RADEON_CS_SPACE_OK 0 -+#define RADEON_CS_SPACE_OP_TO_BIG 1 -+#define RADEON_CS_SPACE_FLUSH 2 -+ -+struct radeon_cs_space_check { -+ struct radeon_bo *bo; -+ uint32_t read_domains; -+ uint32_t write_domain; -+ uint32_t new_accounted; -+}; -+ - struct radeon_cs_manager; - - struct radeon_cs { -@@ -58,6 +72,7 @@ struct radeon_cs { - const char *section_file; - const char *section_func; - int section_line; -+ - }; - - /* cs functions */ -@@ -84,11 +99,16 @@ struct radeon_cs_funcs { - int (*cs_erase)(struct radeon_cs *cs); - int (*cs_need_flush)(struct radeon_cs *cs); - void (*cs_print)(struct radeon_cs *cs, FILE *file); -+ int (*cs_space_check)(struct radeon_cs *cs, struct radeon_cs_space_check *bos, -+ int num_bo); - }; - - struct radeon_cs_manager { - struct radeon_cs_funcs *funcs; - int fd; -+ uint32_t vram_limit, gart_limit; -+ uint32_t vram_write_used, gart_write_used; -+ uint32_t read_used; - }; - - static inline struct radeon_cs *radeon_cs_create(struct radeon_cs_manager *csm, -@@ -157,4 +177,19 @@ static inline void radeon_cs_print(struct radeon_cs *cs, FILE *file) - cs->csm->funcs->cs_print(cs, file); - } - -+static inline int radeon_cs_space_check(struct radeon_cs *cs, -+ struct radeon_cs_space_check *bos, -+ int num_bo) -+{ -+ return cs->csm->funcs->cs_space_check(cs, bos, num_bo); -+} -+ -+static inline void radeon_cs_set_limit(struct radeon_cs *cs, uint32_t domain, uint32_t limit) -+{ -+ -+ if (domain == RADEON_GEM_DOMAIN_VRAM) -+ cs->csm->vram_limit = limit; -+ else -+ cs->csm->gart_limit = limit; -+} - #endif -diff --git a/libdrm/radeon/radeon_cs_gem.c b/libdrm/radeon/radeon_cs_gem.c -index bfc5aca..c9cf345 100644 ---- a/libdrm/radeon/radeon_cs_gem.c -+++ b/libdrm/radeon/radeon_cs_gem.c -@@ -229,6 +229,16 @@ static int cs_gem_end(struct radeon_cs *cs, - return 0; - } - -+ -+static void dump_cmdbuf(struct radeon_cs *cs) -+{ -+ int i; -+ for (i = 0; i < cs->cdw; i++){ -+ fprintf(stderr,"%x: %08x\n", i, cs->packets[i]); -+ } -+ -+} -+ - static int cs_gem_emit(struct radeon_cs *cs) - { - struct cs_gem *csg = (struct cs_gem*)cs; -@@ -236,6 +246,7 @@ static int cs_gem_emit(struct radeon_cs *cs) - unsigned i; - int r; - -+ dump_cmdbuf(cs); - csg->chunks[0].length_dw = cs->cdw; - - chunk_array[0] = (uint64_t)(intptr_t)&csg->chunks[0]; -@@ -387,6 +398,97 @@ static void cs_gem_print(struct radeon_cs *cs, FILE *file) - } - } - -+static int cs_gem_check_space(struct radeon_cs *cs, struct radeon_cs_space_check *bos, int num_bo) -+{ -+ struct radeon_cs_manager *csm = cs->csm; -+ int this_op_read = 0, this_op_gart_write = 0, this_op_vram_write = 0; -+ uint32_t read_domains, write_domain; -+ int i; -+ struct radeon_bo *bo; -+ -+ /* check the totals for this operation */ -+ -+ if (num_bo == 0) -+ return 0; -+ -+ /* prepare */ -+ for (i = 0; i < num_bo; i++) { -+ bo = bos[i].bo; -+ -+ bos[i].new_accounted = 0; -+ read_domains = bos[i].read_domains; -+ write_domain = bos[i].write_domain; -+ -+ /* already accounted this bo */ -+ if (write_domain && (write_domain == bo->space_accounted)) -+ continue; -+ -+ if (read_domains && ((read_domains << 16) == bo->space_accounted)) -+ continue; -+ -+ if (bo->space_accounted == 0) { -+ if (write_domain == RADEON_GEM_DOMAIN_VRAM) -+ this_op_vram_write += bo->size; -+ else if (write_domain == RADEON_GEM_DOMAIN_GTT) -+ this_op_gart_write += bo->size; -+ else -+ this_op_read += bo->size; -+ bos[i].new_accounted = (read_domains << 16) | write_domain; -+ } else { -+ uint16_t old_read, old_write; -+ -+ old_read = bo->space_accounted >> 16; -+ old_write = bo->space_accounted & 0xffff; -+ -+ if (write_domain && (old_read & write_domain)) { -+ bos[i].new_accounted = write_domain; -+ /* moving from read to a write domain */ -+ if (write_domain == RADEON_GEM_DOMAIN_VRAM) { -+ this_op_read -= bo->size; -+ this_op_vram_write += bo->size; -+ } else if (write_domain == RADEON_GEM_DOMAIN_VRAM) { -+ this_op_read -= bo->size; -+ this_op_gart_write += bo->size; -+ } -+ } else if (read_domains & old_write) { -+ bos[i].new_accounted = bo->space_accounted & 0xffff; -+ } else { -+ /* rewrite the domains */ -+ if (write_domain != old_write) -+ fprintf(stderr,"WRITE DOMAIN RELOC FAILURE 0x%x %d %d\n", bo->handle, write_domain, old_write); -+ if (read_domains != old_read) -+ fprintf(stderr,"READ DOMAIN RELOC FAILURE 0x%x %d %d\n", bo->handle, read_domains, old_read); -+ return RADEON_CS_SPACE_FLUSH; -+ } -+ } -+ } -+ -+ if (this_op_read < 0) -+ this_op_read = 0; -+ -+ /* check sizes - operation first */ -+ if ((this_op_read + this_op_gart_write > csm->gart_limit) || -+ (this_op_vram_write > csm->vram_limit)) { -+ return RADEON_CS_SPACE_OP_TO_BIG; -+ } -+ -+ if (((csm->vram_write_used + this_op_vram_write) > csm->vram_limit) || -+ ((csm->read_used + csm->gart_write_used + this_op_gart_write + this_op_read) > csm->gart_limit)) { -+ return RADEON_CS_SPACE_FLUSH; -+ } -+ -+ csm->gart_write_used += this_op_gart_write; -+ csm->vram_write_used += this_op_vram_write; -+ csm->read_used += this_op_read; -+ /* commit */ -+ for (i = 0; i < num_bo; i++) { -+ bo = bos[i].bo; -+ bo->space_accounted = bos[i].new_accounted; -+ } -+ -+ return RADEON_CS_SPACE_OK; -+} -+ - static struct radeon_cs_funcs radeon_cs_gem_funcs = { - cs_gem_create, - cs_gem_write_dword, -@@ -397,7 +499,8 @@ static struct radeon_cs_funcs radeon_cs_gem_funcs = { - cs_gem_destroy, - cs_gem_erase, - cs_gem_need_flush, -- cs_gem_print -+ cs_gem_print, -+ cs_gem_check_space, - }; - - struct radeon_cs_manager *radeon_cs_manager_gem_ctor(int fd) -diff --git a/shared-core/radeon_drm.h b/shared-core/radeon_drm.h -index fd26eee..b989649 100644 ---- a/shared-core/radeon_drm.h -+++ b/shared-core/radeon_drm.h -@@ -711,6 +711,7 @@ typedef struct drm_radeon_indirect { - #define RADEON_PARAM_FB_LOCATION 14 /* FB location */ - #define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */ - #define RADEON_PARAM_KERNEL_MM 16 -+#define RADEON_PARAM_DEVICE_ID 17 - - typedef struct drm_radeon_getparam { - int param; diff --git a/libdrm-radeon.patch b/libdrm-radeon.patch index b077b84..73c372b 100644 --- a/libdrm-radeon.patch +++ b/libdrm-radeon.patch @@ -21,9 +21,193 @@ diff -up libdrm-2.4.3/libdrm/Makefile.am.dave libdrm-2.4.3/libdrm/Makefile.am libdrm_la_LTLIBRARIES = libdrm.la libdrm_ladir = $(libdir) -diff -up /dev/null libdrm-2.4.3/libdrm/radeon/Makefile.am ---- /dev/null 2008-12-18 14:22:13.823022429 +1000 -+++ libdrm-2.4.3/libdrm/radeon/Makefile.am 2008-12-22 12:05:48.000000000 +1000 +diff -up libdrm-2.4.3/shared-core/radeon_drm.h.dave libdrm-2.4.3/shared-core/radeon_drm.h +--- libdrm-2.4.3/shared-core/radeon_drm.h.dave 2008-12-19 14:33:38.000000000 +1000 ++++ libdrm-2.4.3/shared-core/radeon_drm.h 2008-12-22 12:05:48.000000000 +1000 +@@ -453,8 +453,18 @@ typedef struct { + int pfCurrentPage; /* which buffer is being displayed? */ + int crtc2_base; /* CRTC2 frame offset */ + int tiling_enabled; /* set by drm, read by 2d + 3d clients */ ++ ++ unsigned int last_fence; ++ ++ uint32_t front_handle; ++ uint32_t back_handle; ++ uint32_t depth_handle; ++ uint32_t front_pitch; ++ uint32_t back_pitch; ++ uint32_t depth_pitch; + } drm_radeon_sarea_t; + ++ + /* WARNING: If you change any of these defines, make sure to change the + * defines in the Xserver file (xf86drmRadeon.h) + * +@@ -493,6 +503,18 @@ typedef struct { + #define DRM_RADEON_SURF_ALLOC 0x1a + #define DRM_RADEON_SURF_FREE 0x1b + ++#define DRM_RADEON_GEM_INFO 0x1c ++#define DRM_RADEON_GEM_CREATE 0x1d ++#define DRM_RADEON_GEM_MMAP 0x1e ++#define DRM_RADEON_GEM_PIN 0x1f ++#define DRM_RADEON_GEM_UNPIN 0x20 ++#define DRM_RADEON_GEM_PREAD 0x21 ++#define DRM_RADEON_GEM_PWRITE 0x22 ++#define DRM_RADEON_GEM_SET_DOMAIN 0x23 ++#define DRM_RADEON_GEM_WAIT_RENDERING 0x24 ++ ++#define DRM_RADEON_CS 0x26 ++ + #define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t) + #define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START) + #define DRM_IOCTL_RADEON_CP_STOP DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_STOP, drm_radeon_cp_stop_t) +@@ -521,6 +543,17 @@ typedef struct { + #define DRM_IOCTL_RADEON_SURF_ALLOC DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_ALLOC, drm_radeon_surface_alloc_t) + #define DRM_IOCTL_RADEON_SURF_FREE DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_FREE, drm_radeon_surface_free_t) + ++#define DRM_IOCTL_RADEON_GEM_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_INFO, struct drm_radeon_gem_info) ++#define DRM_IOCTL_RADEON_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_CREATE, struct drm_radeon_gem_create) ++#define DRM_IOCTL_RADEON_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_MMAP, struct drm_radeon_gem_mmap) ++#define DRM_IOCTL_RADEON_GEM_PIN DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PIN, struct drm_radeon_gem_pin) ++#define DRM_IOCTL_RADEON_GEM_UNPIN DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_UNPIN, struct drm_radeon_gem_unpin) ++#define DRM_IOCTL_RADEON_GEM_PREAD DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PREAD, struct drm_radeon_gem_pread) ++#define DRM_IOCTL_RADEON_GEM_PWRITE DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PWRITE, struct drm_radeon_gem_pwrite) ++#define DRM_IOCTL_RADEON_GEM_SET_DOMAIN DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_DOMAIN, struct drm_radeon_gem_set_domain) ++#define DRM_IOCTL_RADEON_GEM_WAIT_RENDERING DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_GEM_WAIT_RENDERING, struct drm_radeon_gem_wait_rendering) ++#define DRM_IOCTL_RADEON_CS DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_CS, struct drm_radeon_cs) ++ + typedef struct drm_radeon_init { + enum { + RADEON_INIT_CP = 0x01, +@@ -677,6 +710,7 @@ typedef struct drm_radeon_indirect { + #define RADEON_PARAM_VBLANK_CRTC 13 /* VBLANK CRTC */ + #define RADEON_PARAM_FB_LOCATION 14 /* FB location */ + #define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */ ++#define RADEON_PARAM_KERNEL_MM 16 + + typedef struct drm_radeon_getparam { + int param; +@@ -732,6 +766,7 @@ typedef struct drm_radeon_setparam { + #define RADEON_SETPARAM_NEW_MEMMAP 4 /* Use new memory map */ + #define RADEON_SETPARAM_PCIGART_TABLE_SIZE 5 /* PCI GART Table Size */ + #define RADEON_SETPARAM_VBLANK_CRTC 6 /* VBLANK CRTC */ ++#define RADEON_SETPARAM_MM_INIT 7 /* Initialise the mm */ + /* 1.14: Clients can allocate/free a surface + */ + typedef struct drm_radeon_surface_alloc { +@@ -747,4 +782,106 @@ typedef struct drm_radeon_surface_free { + #define DRM_RADEON_VBLANK_CRTC1 1 + #define DRM_RADEON_VBLANK_CRTC2 2 + ++#define RADEON_GEM_DOMAIN_CPU 0x1 // Cached CPU domain ++#define RADEON_GEM_DOMAIN_GTT 0x2 // GTT or cache flushed ++#define RADEON_GEM_DOMAIN_VRAM 0x4 // VRAM domain ++ ++/* return to userspace start/size of gtt and vram apertures */ ++struct drm_radeon_gem_info { ++ uint64_t gart_start; ++ uint64_t gart_size; ++ uint64_t vram_start; ++ uint64_t vram_size; ++ uint64_t vram_visible; ++}; ++ ++struct drm_radeon_gem_create { ++ uint64_t size; ++ uint64_t alignment; ++ uint32_t handle; ++ uint32_t initial_domain; // to allow VRAM to be created ++ uint32_t no_backing_store; // for VRAM objects - select whether they need backing store ++ // pretty much front/back/depth don't need it - other things do ++}; ++ ++struct drm_radeon_gem_mmap { ++ uint32_t handle; ++ uint32_t pad; ++ uint64_t offset; ++ uint64_t size; ++ uint64_t addr_ptr; ++}; ++ ++struct drm_radeon_gem_set_domain { ++ uint32_t handle; ++ uint32_t read_domains; ++ uint32_t write_domain; ++}; ++ ++struct drm_radeon_gem_wait_rendering { ++ uint32_t handle; ++}; ++ ++struct drm_radeon_gem_pin { ++ uint32_t handle; ++ uint32_t pin_domain; ++ uint64_t alignment; ++ uint64_t offset; ++}; ++ ++struct drm_radeon_gem_unpin { ++ uint32_t handle; ++ uint32_t pad; ++}; ++ ++struct drm_radeon_gem_busy { ++ uint32_t handle; ++ uint32_t busy; ++}; ++ ++struct drm_radeon_gem_pread { ++ /** Handle for the object being read. */ ++ uint32_t handle; ++ uint32_t pad; ++ /** Offset into the object to read from */ ++ uint64_t offset; ++ /** Length of data to read */ ++ uint64_t size; ++ /** Pointer to write the data into. */ ++ uint64_t data_ptr; /* void *, but pointers are not 32/64 compatible */ ++}; ++ ++struct drm_radeon_gem_pwrite { ++ /** Handle for the object being written to. */ ++ uint32_t handle; ++ uint32_t pad; ++ /** Offset into the object to write to */ ++ uint64_t offset; ++ /** Length of data to write */ ++ uint64_t size; ++ /** Pointer to read the data from. */ ++ uint64_t data_ptr; /* void *, but pointers are not 32/64 compatible */ ++}; ++ ++ ++/* New interface which obsolete all previous interface. ++ */ ++ ++#define RADEON_CHUNK_ID_RELOCS 0x01 ++#define RADEON_CHUNK_ID_IB 0x02 ++ ++struct drm_radeon_cs_chunk { ++ uint32_t chunk_id; ++ uint32_t length_dw; ++ uint64_t chunk_data; ++}; ++ ++struct drm_radeon_cs { ++ uint32_t num_chunks; ++ uint32_t cs_id; ++ uint64_t chunks; /* this points to uint64_t * which point to ++ cs chunks */ ++}; ++ ++ + #endif +diff --git a/libdrm/radeon/Makefile.am b/libdrm/radeon/Makefile.am +new file mode 100644 +index 0000000..32ca559 +--- /dev/null ++++ b/libdrm/radeon/Makefile.am @@ -0,0 +1,48 @@ +# Copyright © 2008 Jérôme Glisse +# @@ -56,27 +240,214 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/Makefile.am + $(PTHREADSTUBS_CFLAGS) \ + -I$(top_srcdir)/shared-core + -+libdrm_radeon_la_LTLIBRARIES = libdrm_radeon.la -+libdrm_radeon_ladir = $(libdir) -+libdrm_radeon_la_LDFLAGS = -version-number 1:0:0 -no-undefined -+libdrm_radeon_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@ ++libdrm_radeon_la_LTLIBRARIES = libdrm_radeon.la ++libdrm_radeon_ladir = $(libdir) ++libdrm_radeon_la_LDFLAGS = -version-number 1:0:0 -no-undefined ++libdrm_radeon_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@ ++ ++libdrm_radeon_la_SOURCES = \ ++ radeon_bo_gem.c \ ++ radeon_cs_gem.c \ ++ radeon_track.c ++ ++libdrm_radeonincludedir = ${includedir}/drm ++libdrm_radeoninclude_HEADERS = \ ++ radeon_bo.h \ ++ radeon_cs.h \ ++ radeon_bo_gem.h \ ++ radeon_cs_gem.h \ ++ radeon_track.h +diff --git a/libdrm/radeon/radeon_bo.h b/libdrm/radeon/radeon_bo.h +new file mode 100644 +index 0000000..3cabdfc +--- /dev/null ++++ b/libdrm/radeon/radeon_bo.h +@@ -0,0 +1,179 @@ ++/* ++ * Copyright © 2008 Jérôme Glisse ++ * All Rights Reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sub license, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS ++ * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE ++ * USE OR OTHER DEALINGS IN THE SOFTWARE. ++ * ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial portions ++ * of the Software. ++ */ ++/* ++ * Authors: ++ * Jérôme Glisse ++ */ ++#ifndef RADEON_BO_H ++#define RADEON_BO_H ++ ++#include ++#include ++#include "radeon_track.h" ++ ++/* bo object */ ++#define RADEON_BO_FLAGS_MACRO_TILE 1 ++#define RADEON_BO_FLAGS_MICRO_TILE 2 ++ ++struct radeon_bo_manager; ++ ++struct radeon_bo { ++ uint32_t alignment; ++ uint32_t handle; ++ uint32_t size; ++ uint32_t domains; ++ uint32_t flags; ++ unsigned cref; ++#ifdef RADEON_BO_TRACK ++ struct radeon_track *track; ++#endif ++ void *ptr; ++ struct radeon_bo_manager *bom; ++ uint32_t space_accounted; ++}; ++ ++/* bo functions */ ++struct radeon_bo_funcs { ++ struct radeon_bo *(*bo_open)(struct radeon_bo_manager *bom, ++ uint32_t handle, ++ uint32_t size, ++ uint32_t alignment, ++ uint32_t domains, ++ uint32_t flags); ++ void (*bo_ref)(struct radeon_bo *bo); ++ struct radeon_bo *(*bo_unref)(struct radeon_bo *bo); ++ int (*bo_map)(struct radeon_bo *bo, int write); ++ int (*bo_unmap)(struct radeon_bo *bo); ++ int (*bo_wait)(struct radeon_bo *bo); ++}; ++ ++struct radeon_bo_manager { ++ struct radeon_bo_funcs *funcs; ++ int fd; ++ struct radeon_tracker tracker; ++}; ++ ++static inline void _radeon_bo_debug(struct radeon_bo *bo, ++ const char *op, ++ const char *file, ++ const char *func, ++ int line) ++{ ++ fprintf(stderr, "%s %p 0x%08X 0x%08X 0x%08X [%s %s %d]\n", ++ op, bo, bo->handle, bo->size, bo->cref, file, func, line); ++} ++ ++static inline struct radeon_bo *_radeon_bo_open(struct radeon_bo_manager *bom, ++ uint32_t handle, ++ uint32_t size, ++ uint32_t alignment, ++ uint32_t domains, ++ uint32_t flags, ++ const char *file, ++ const char *func, ++ int line) ++{ ++ struct radeon_bo *bo; ++ ++ bo = bom->funcs->bo_open(bom, handle, size, alignment, domains, flags); ++#ifdef RADEON_BO_TRACK ++ if (bo) { ++ bo->track = radeon_tracker_add_track(&bom->tracker, bo->handle); ++ radeon_track_add_event(bo->track, file, func, "open", line); ++ } ++#endif ++ return bo; ++} ++ ++static inline void _radeon_bo_ref(struct radeon_bo *bo, ++ const char *file, ++ const char *func, ++ int line) ++{ ++ bo->cref++; ++#ifdef RADEON_BO_TRACK ++ radeon_track_add_event(bo->track, file, func, "ref", line); ++#endif ++ bo->bom->funcs->bo_ref(bo); ++} ++ ++static inline struct radeon_bo *_radeon_bo_unref(struct radeon_bo *bo, ++ const char *file, ++ const char *func, ++ int line) ++{ ++ bo->cref--; ++#ifdef RADEON_BO_TRACK ++ radeon_track_add_event(bo->track, file, func, "unref", line); ++ if (bo->cref <= 0) { ++ radeon_tracker_remove_track(&bo->bom->tracker, bo->track); ++ bo->track = NULL; ++ } ++#endif ++ return bo->bom->funcs->bo_unref(bo); ++} ++ ++static inline int _radeon_bo_map(struct radeon_bo *bo, ++ int write, ++ const char *file, ++ const char *func, ++ int line) ++{ ++ return bo->bom->funcs->bo_map(bo, write); ++} ++ ++static inline int _radeon_bo_unmap(struct radeon_bo *bo, ++ const char *file, ++ const char *func, ++ int line) ++{ ++ return bo->bom->funcs->bo_unmap(bo); ++} ++ ++static inline int _radeon_bo_wait(struct radeon_bo *bo, ++ const char *file, ++ const char *func, ++ int line) ++{ ++ return bo->bom->funcs->bo_wait(bo); ++} + -+libdrm_radeon_la_SOURCES = \ -+ radeon_bo_gem.c \ -+ radeon_cs_gem.c \ -+ radeon_track.c ++#define radeon_bo_open(bom, h, s, a, d, f)\ ++ _radeon_bo_open(bom, h, s, a, d, f, __FILE__, __FUNCTION__, __LINE__) ++#define radeon_bo_ref(bo)\ ++ _radeon_bo_ref(bo, __FILE__, __FUNCTION__, __LINE__) ++#define radeon_bo_unref(bo)\ ++ _radeon_bo_unref(bo, __FILE__, __FUNCTION__, __LINE__) ++#define radeon_bo_map(bo, w)\ ++ _radeon_bo_map(bo, w, __FILE__, __FUNCTION__, __LINE__) ++#define radeon_bo_unmap(bo)\ ++ _radeon_bo_unmap(bo, __FILE__, __FUNCTION__, __LINE__) ++#define radeon_bo_debug(bo, opcode)\ ++ _radeon_bo_debug(bo, opcode, __FILE__, __FUNCTION__, __LINE__) ++#define radeon_bo_wait(bo) \ ++ _radeon_bo_wait(bo, __FILE__, __func__, __LINE__) + -+libdrm_radeonincludedir = ${includedir}/drm -+libdrm_radeoninclude_HEADERS = \ -+ radeon_bo.h \ -+ radeon_cs.h \ -+ radeon_bo_gem.h \ -+ radeon_cs_gem.h \ -+ radeon_track.h -diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_bo_gem.c ---- /dev/null 2008-12-18 14:22:13.823022429 +1000 -+++ libdrm-2.4.3/libdrm/radeon/radeon_bo_gem.c 2008-12-22 12:05:48.000000000 +1000 -@@ -0,0 +1,208 @@ ++#endif +diff --git a/libdrm/radeon/radeon_bo_gem.c b/libdrm/radeon/radeon_bo_gem.c +new file mode 100644 +index 0000000..932afeb +--- /dev/null ++++ b/libdrm/radeon/radeon_bo_gem.c +@@ -0,0 +1,223 @@ +/* + * Copyright © 2008 Dave Airlie + * Copyright © 2008 Jérôme Glisse @@ -114,6 +485,7 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_bo_gem.c +#include +#include +#include ++#include +#include "xf86drm.h" +#include "drm.h" +#include "radeon_drm.h" @@ -255,12 +627,26 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_bo_gem.c + return 0; +} + ++static int bo_wait(struct radeon_bo *bo) ++{ ++ struct drm_radeon_gem_wait_rendering args; ++ int ret; ++ ++ args.handle = bo->handle; ++ do { ++ ret = drmCommandWriteRead(bo->bom->fd, DRM_RADEON_GEM_WAIT_RENDERING, ++ &args, sizeof(args)); ++ } while (ret == -EAGAIN); ++ return ret; ++} ++ +static struct radeon_bo_funcs bo_gem_funcs = { + bo_open, + bo_ref, + bo_unref, + bo_map, -+ bo_unmap ++ bo_unmap, ++ bo_wait +}; + +struct radeon_bo_manager *radeon_bo_manager_gem_ctor(int fd) @@ -285,9 +671,11 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_bo_gem.c + } + free(bomg); +} -diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_bo_gem.h ---- /dev/null 2008-12-18 14:22:13.823022429 +1000 -+++ libdrm-2.4.3/libdrm/radeon/radeon_bo_gem.h 2008-12-22 12:05:48.000000000 +1000 +diff --git a/libdrm/radeon/radeon_bo_gem.h b/libdrm/radeon/radeon_bo_gem.h +new file mode 100644 +index 0000000..c0f68e6 +--- /dev/null ++++ b/libdrm/radeon/radeon_bo_gem.h @@ -0,0 +1,40 @@ +/* + * Copyright © 2008 Dave Airlie @@ -329,29 +717,31 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_bo_gem.h +void radeon_bo_manager_gem_dtor(struct radeon_bo_manager *bom); + +#endif -diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_bo.h ---- /dev/null 2008-12-18 14:22:13.823022429 +1000 -+++ libdrm-2.4.3/libdrm/radeon/radeon_bo.h 2008-12-22 12:05:48.000000000 +1000 -@@ -0,0 +1,167 @@ +diff --git a/libdrm/radeon/radeon_cs.h b/libdrm/radeon/radeon_cs.h +new file mode 100644 +index 0000000..7cc75d4 +--- /dev/null ++++ b/libdrm/radeon/radeon_cs.h +@@ -0,0 +1,198 @@ +/* ++ * Copyright © 2008 Nicolai Haehnle + * Copyright © 2008 Jérôme Glisse + * All Rights Reserved. + * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS -+ * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL ++ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, ++ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ++ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the @@ -360,150 +750,183 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_bo.h + */ +/* + * Authors: ++ * Aapo Tahkola ++ * Nicolai Haehnle + * Jérôme Glisse + */ -+#ifndef RADEON_BO_H -+#define RADEON_BO_H ++#ifndef RADEON_CS_H ++#define RADEON_CS_H + -+#include +#include -+#include "radeon_track.h" ++#include "drm.h" ++#include "radeon_drm.h" ++#include "radeon_bo.h" + -+/* bo object */ -+#define RADEON_BO_FLAGS_MACRO_TILE 1 -+#define RADEON_BO_FLAGS_MICRO_TILE 2 ++struct radeon_cs_reloc { ++ struct radeon_bo *bo; ++ uint32_t read_domain; ++ uint32_t write_domain; ++ uint32_t flags; ++}; + -+struct radeon_bo_manager; + -+struct radeon_bo { -+ uint32_t alignment; -+ uint32_t handle; -+ uint32_t size; -+ uint32_t domains; -+ uint32_t flags; -+ unsigned cref; -+#ifdef RADEON_BO_TRACK -+ struct radeon_track *track; -+#endif -+ void *ptr; -+ struct radeon_bo_manager *bom; ++#define RADEON_CS_SPACE_OK 0 ++#define RADEON_CS_SPACE_OP_TO_BIG 1 ++#define RADEON_CS_SPACE_FLUSH 2 ++ ++struct radeon_cs_space_check { ++ struct radeon_bo *bo; ++ uint32_t read_domains; ++ uint32_t write_domain; ++ uint32_t new_accounted; +}; + -+/* bo functions */ -+struct radeon_bo_funcs { -+ struct radeon_bo *(*bo_open)(struct radeon_bo_manager *bom, -+ uint32_t handle, -+ uint32_t size, -+ uint32_t alignment, -+ uint32_t domains, -+ uint32_t flags); -+ void (*bo_ref)(struct radeon_bo *bo); -+ struct radeon_bo *(*bo_unref)(struct radeon_bo *bo); -+ int (*bo_map)(struct radeon_bo *bo, int write); -+ int (*bo_unmap)(struct radeon_bo *bo); ++struct radeon_cs_manager; ++ ++struct radeon_cs { ++ struct radeon_cs_manager *csm; ++ void *relocs; ++ uint32_t *packets; ++ unsigned crelocs; ++ unsigned relocs_total_size; ++ unsigned cdw; ++ unsigned ndw; ++ int section; ++ unsigned section_ndw; ++ unsigned section_cdw; ++ const char *section_file; ++ const char *section_func; ++ int section_line; ++ +}; + -+struct radeon_bo_manager { -+ struct radeon_bo_funcs *funcs; ++/* cs functions */ ++struct radeon_cs_funcs { ++ struct radeon_cs *(*cs_create)(struct radeon_cs_manager *csm, ++ uint32_t ndw); ++ int (*cs_write_reloc)(struct radeon_cs *cs, ++ struct radeon_bo *bo, ++ uint32_t read_domain, ++ uint32_t write_domain, ++ uint32_t flags); ++ int (*cs_begin)(struct radeon_cs *cs, ++ uint32_t ndw, ++ const char *file, ++ const char *func, ++ int line); ++ int (*cs_end)(struct radeon_cs *cs, ++ const char *file, ++ const char *func, ++ int line); ++ int (*cs_emit)(struct radeon_cs *cs); ++ int (*cs_destroy)(struct radeon_cs *cs); ++ int (*cs_erase)(struct radeon_cs *cs); ++ int (*cs_need_flush)(struct radeon_cs *cs); ++ void (*cs_print)(struct radeon_cs *cs, FILE *file); ++ int (*cs_space_check)(struct radeon_cs *cs, struct radeon_cs_space_check *bos, ++ int num_bo); ++}; ++ ++struct radeon_cs_manager { ++ struct radeon_cs_funcs *funcs; + int fd; -+ struct radeon_tracker tracker; ++ uint32_t vram_limit, gart_limit; ++ uint32_t vram_write_used, gart_write_used; ++ uint32_t read_used; +}; -+ -+static inline void _radeon_bo_debug(struct radeon_bo *bo, -+ const char *op, -+ const char *file, -+ const char *func, -+ int line) ++ ++static inline struct radeon_cs *radeon_cs_create(struct radeon_cs_manager *csm, ++ uint32_t ndw) +{ -+ fprintf(stderr, "%s %p 0x%08X 0x%08X 0x%08X [%s %s %d]\n", -+ op, bo, bo->handle, bo->size, bo->cref, file, func, line); ++ return csm->funcs->cs_create(csm, ndw); +} + -+static inline struct radeon_bo *_radeon_bo_open(struct radeon_bo_manager *bom, -+ uint32_t handle, -+ uint32_t size, -+ uint32_t alignment, -+ uint32_t domains, -+ uint32_t flags, -+ const char *file, -+ const char *func, -+ int line) ++static inline int radeon_cs_write_reloc(struct radeon_cs *cs, ++ struct radeon_bo *bo, ++ uint32_t read_domain, ++ uint32_t write_domain, ++ uint32_t flags) +{ -+ struct radeon_bo *bo; -+ -+ bo = bom->funcs->bo_open(bom, handle, size, alignment, domains, flags); -+#ifdef RADEON_BO_TRACK -+ if (bo) { -+ bo->track = radeon_tracker_add_track(&bom->tracker, bo->handle); -+ radeon_track_add_event(bo->track, file, func, "open", line); -+ } -+#endif -+ return bo; ++ return cs->csm->funcs->cs_write_reloc(cs, ++ bo, ++ read_domain, ++ write_domain, ++ flags); +} + -+static inline void _radeon_bo_ref(struct radeon_bo *bo, ++static inline int radeon_cs_begin(struct radeon_cs *cs, ++ uint32_t ndw, + const char *file, + const char *func, + int line) +{ -+ bo->cref++; -+#ifdef RADEON_BO_TRACK -+ radeon_track_add_event(bo->track, file, func, "ref", line); -+#endif -+ bo->bom->funcs->bo_ref(bo); ++ return cs->csm->funcs->cs_begin(cs, ndw, file, func, line); +} + -+static inline struct radeon_bo *_radeon_bo_unref(struct radeon_bo *bo, -+ const char *file, -+ const char *func, -+ int line) ++static inline int radeon_cs_end(struct radeon_cs *cs, ++ const char *file, ++ const char *func, ++ int line) +{ -+ bo->cref--; -+#ifdef RADEON_BO_TRACK -+ radeon_track_add_event(bo->track, file, func, "unref", line); -+ if (bo->cref <= 0) { -+ radeon_tracker_remove_track(&bo->bom->tracker, bo->track); -+ bo->track = NULL; -+ } -+#endif -+ return bo->bom->funcs->bo_unref(bo); ++ return cs->csm->funcs->cs_end(cs, file, func, line); +} + -+static inline int _radeon_bo_map(struct radeon_bo *bo, -+ int write, -+ const char *file, -+ const char *func, -+ int line) ++static inline int radeon_cs_emit(struct radeon_cs *cs) +{ -+ return bo->bom->funcs->bo_map(bo, write); ++ return cs->csm->funcs->cs_emit(cs); ++} ++ ++static inline int radeon_cs_destroy(struct radeon_cs *cs) ++{ ++ return cs->csm->funcs->cs_destroy(cs); ++} ++ ++static inline int radeon_cs_erase(struct radeon_cs *cs) ++{ ++ return cs->csm->funcs->cs_erase(cs); ++} ++ ++static inline int radeon_cs_need_flush(struct radeon_cs *cs) ++{ ++ return cs->csm->funcs->cs_need_flush(cs); ++} ++ ++static inline void radeon_cs_print(struct radeon_cs *cs, FILE *file) ++{ ++ cs->csm->funcs->cs_print(cs, file); ++} ++ ++static inline int radeon_cs_space_check(struct radeon_cs *cs, ++ struct radeon_cs_space_check *bos, ++ int num_bo) ++{ ++ return cs->csm->funcs->cs_space_check(cs, bos, num_bo); ++} ++ ++static inline void radeon_cs_set_limit(struct radeon_cs *cs, uint32_t domain, uint32_t limit) ++{ ++ ++ if (domain == RADEON_GEM_DOMAIN_VRAM) ++ cs->csm->vram_limit = limit; ++ else ++ cs->csm->gart_limit = limit; +} + -+static inline int _radeon_bo_unmap(struct radeon_bo *bo, -+ const char *file, -+ const char *func, -+ int line) ++static inline void radeon_cs_write_dword(struct radeon_cs *cs, uint32_t dword) +{ -+ return bo->bom->funcs->bo_unmap(bo); ++ cs->packets[cs->cdw++] = dword; ++ if (cs->section) { ++ cs->section_cdw++; ++ } +} + -+#define radeon_bo_open(bom, h, s, a, d, f)\ -+ _radeon_bo_open(bom, h, s, a, d, f, __FILE__, __FUNCTION__, __LINE__) -+#define radeon_bo_ref(bo)\ -+ _radeon_bo_ref(bo, __FILE__, __FUNCTION__, __LINE__) -+#define radeon_bo_unref(bo)\ -+ _radeon_bo_unref(bo, __FILE__, __FUNCTION__, __LINE__) -+#define radeon_bo_map(bo, w)\ -+ _radeon_bo_map(bo, w, __FILE__, __FUNCTION__, __LINE__) -+#define radeon_bo_unmap(bo)\ -+ _radeon_bo_unmap(bo, __FILE__, __FUNCTION__, __LINE__) -+#define radeon_bo_debug(bo, opcode)\ -+ _radeon_bo_debug(bo, opcode, __FILE__, __FUNCTION__, __LINE__) -+ +#endif -diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.c ---- /dev/null 2008-12-18 14:22:13.823022429 +1000 -+++ libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.c 2008-12-22 12:05:48.000000000 +1000 -@@ -0,0 +1,420 @@ +diff --git a/libdrm/radeon/radeon_cs_gem.c b/libdrm/radeon/radeon_cs_gem.c +new file mode 100644 +index 0000000..dc14a8a +--- /dev/null ++++ b/libdrm/radeon/radeon_cs_gem.c +@@ -0,0 +1,537 @@ +/* + * Copyright © 2008 Jérôme Glisse + * All Rights Reserved. @@ -612,25 +1035,6 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.c + return (struct radeon_cs*)csg; +} + -+static int cs_gem_write_dword(struct radeon_cs *cs, uint32_t dword) -+{ -+ struct cs_gem *csg = (struct cs_gem*)cs; -+ if (cs->cdw >= cs->ndw) { -+ uint32_t tmp, *ptr; -+ tmp = (cs->cdw + 1 + 0x3FF) & (~0x3FF); -+ ptr = (uint32_t*)realloc(cs->packets, 4 * tmp); -+ if (ptr == NULL) { -+ return -ENOMEM; -+ } -+ cs->packets = ptr; -+ cs->ndw = tmp; -+ csg->chunks[0].chunk_data = (uint64_t)(intptr_t)csg->base.packets; -+ } -+ cs->packets[cs->cdw++] = dword; -+ csg->chunks[0].length_dw += 1; -+ return 0; -+} -+ +static int cs_gem_write_reloc(struct radeon_cs *cs, + struct radeon_bo *bo, + uint32_t read_domain, @@ -677,8 +1081,8 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.c + /* update flags */ + reloc->flags |= (flags & reloc->flags); + /* write relocation packet */ -+ cs_gem_write_dword(cs, 0xc0001000); -+ cs_gem_write_dword(cs, idx); ++ radeon_cs_write_dword(cs, 0xc0001000); ++ radeon_cs_write_dword(cs, idx); + return 0; + } + } @@ -711,8 +1115,8 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.c + csg->chunks[1].length_dw += RELOC_SIZE; + radeon_bo_ref(bo); + cs->relocs_total_size += bo->size; -+ cs_gem_write_dword(cs, 0xc0001000); -+ cs_gem_write_dword(cs, idx); ++ radeon_cs_write_dword(cs, 0xc0001000); ++ radeon_cs_write_dword(cs, idx); + return 0; +} + @@ -722,6 +1126,35 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.c + const char *func, + int line) +{ ++ ++ if (cs->section) { ++ fprintf(stderr, "CS already in a section(%s,%s,%d)\n", ++ cs->section_file, cs->section_func, cs->section_line); ++ fprintf(stderr, "CS can't start section(%s,%s,%d)\n", ++ file, func, line); ++ return -EPIPE; ++ } ++ cs->section = 1; ++ cs->section_ndw = ndw; ++ cs->section_cdw = 0; ++ cs->section_file = file; ++ cs->section_func = func; ++ cs->section_line = line; ++ ++ ++ if (cs->cdw + ndw > cs->ndw) { ++ uint32_t tmp, *ptr; ++ int num = (ndw > 0x3FF) ? ndw : 0x3FF; ++ ++ tmp = (cs->cdw + 1 + num) & (~num); ++ ptr = (uint32_t*)realloc(cs->packets, 4 * tmp); ++ if (ptr == NULL) { ++ return -ENOMEM; ++ } ++ cs->packets = ptr; ++ cs->ndw = tmp; ++ } ++ + return 0; +} + @@ -731,7 +1164,19 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.c + int line) + +{ ++ if (!cs->section) { ++ fprintf(stderr, "CS no section to end at (%s,%s,%d)\n", ++ file, func, line); ++ return -EPIPE; ++ } + cs->section = 0; ++ if (cs->section_ndw != cs->section_cdw) { ++ fprintf(stderr, "CS section size missmatch start at (%s,%s,%d) %d vs %d\n", ++ cs->section_file, cs->section_func, cs->section_line, cs->section_ndw, cs->section_cdw); ++ fprintf(stderr, "CS section end at (%s,%s,%d)\n", ++ file, func, line); ++ return -EPIPE; ++ } + return 0; +} + @@ -756,6 +1201,10 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.c + radeon_bo_unref(csg->relocs_bo[i]); + csg->relocs_bo[i] = NULL; + } ++ ++ cs->csm->read_used = 0; ++ cs->csm->vram_write_used = 0; ++ cs->csm->gart_write_used = 0; + return r; +} + @@ -893,249 +1342,180 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.c + } +} + -+static struct radeon_cs_funcs radeon_cs_gem_funcs = { -+ cs_gem_create, -+ cs_gem_write_dword, -+ cs_gem_write_reloc, -+ cs_gem_begin, -+ cs_gem_end, -+ cs_gem_emit, -+ cs_gem_destroy, -+ cs_gem_erase, -+ cs_gem_need_flush, -+ cs_gem_print -+}; -+ -+struct radeon_cs_manager *radeon_cs_manager_gem_ctor(int fd) -+{ -+ struct radeon_cs_manager *csm; -+ -+ csm = (struct radeon_cs_manager*)calloc(1, -+ sizeof(struct radeon_cs_manager)); -+ if (csm == NULL) { -+ return NULL; -+ } -+ csm->funcs = &radeon_cs_gem_funcs; -+ csm->fd = fd; -+ return csm; -+} -+ -+void radeon_cs_manager_gem_dtor(struct radeon_cs_manager *csm) -+{ -+ free(csm); -+} -diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.h ---- /dev/null 2008-12-18 14:22:13.823022429 +1000 -+++ libdrm-2.4.3/libdrm/radeon/radeon_cs_gem.h 2008-12-22 12:05:48.000000000 +1000 -@@ -0,0 +1,41 @@ -+/* -+ * Copyright © 2008 Nicolai Haehnle -+ * Copyright © 2008 Jérôme Glisse -+ * All Rights Reserved. -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sub license, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS -+ * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -+ * USE OR OTHER DEALINGS IN THE SOFTWARE. -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial portions -+ * of the Software. -+ */ -+/* -+ * Authors: -+ * Aapo Tahkola -+ * Nicolai Haehnle -+ * Jérôme Glisse -+ */ -+#ifndef RADEON_CS_GEM_H -+#define RADEON_CS_GEM_H -+ -+#include "radeon_cs.h" -+ -+struct radeon_cs_manager *radeon_cs_manager_gem_ctor(int fd); -+void radeon_cs_manager_gem_dtor(struct radeon_cs_manager *csm); -+ -+#endif -diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_cs.h ---- /dev/null 2008-12-18 14:22:13.823022429 +1000 -+++ libdrm-2.4.3/libdrm/radeon/radeon_cs.h 2008-12-22 12:05:48.000000000 +1000 -@@ -0,0 +1,160 @@ -+/* -+ * Copyright © 2008 Nicolai Haehnle -+ * Copyright © 2008 Jérôme Glisse -+ * All Rights Reserved. -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sub license, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL -+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, -+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -+ * USE OR OTHER DEALINGS IN THE SOFTWARE. -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial portions -+ * of the Software. -+ */ -+/* -+ * Authors: -+ * Aapo Tahkola -+ * Nicolai Haehnle -+ * Jérôme Glisse -+ */ -+#ifndef RADEON_CS_H -+#define RADEON_CS_H -+ -+#include -+#include "radeon_bo.h" -+ -+struct radeon_cs_reloc { -+ struct radeon_bo *bo; -+ uint32_t read_domain; -+ uint32_t write_domain; -+ uint32_t flags; -+}; -+ -+struct radeon_cs_manager; -+ -+struct radeon_cs { -+ struct radeon_cs_manager *csm; -+ void *relocs; -+ uint32_t *packets; -+ unsigned crelocs; -+ unsigned relocs_total_size; -+ unsigned cdw; -+ unsigned ndw; -+ int section; -+ unsigned section_ndw; -+ unsigned section_cdw; -+ const char *section_file; -+ const char *section_func; -+ int section_line; -+}; -+ -+/* cs functions */ -+struct radeon_cs_funcs { -+ struct radeon_cs *(*cs_create)(struct radeon_cs_manager *csm, -+ uint32_t ndw); -+ int (*cs_write_dword)(struct radeon_cs *cs, uint32_t dword); -+ int (*cs_write_reloc)(struct radeon_cs *cs, -+ struct radeon_bo *bo, -+ uint32_t read_domain, -+ uint32_t write_domain, -+ uint32_t flags); -+ int (*cs_begin)(struct radeon_cs *cs, -+ uint32_t ndw, -+ const char *file, -+ const char *func, -+ int line); -+ int (*cs_end)(struct radeon_cs *cs, -+ const char *file, -+ const char *func, -+ int line); -+ int (*cs_emit)(struct radeon_cs *cs); -+ int (*cs_destroy)(struct radeon_cs *cs); -+ int (*cs_erase)(struct radeon_cs *cs); -+ int (*cs_need_flush)(struct radeon_cs *cs); -+ void (*cs_print)(struct radeon_cs *cs, FILE *file); -+}; -+ -+struct radeon_cs_manager { -+ struct radeon_cs_funcs *funcs; -+ int fd; -+}; -+ -+static inline struct radeon_cs *radeon_cs_create(struct radeon_cs_manager *csm, -+ uint32_t ndw) -+{ -+ return csm->funcs->cs_create(csm, ndw); -+} -+ -+static inline int radeon_cs_write_dword(struct radeon_cs *cs, uint32_t dword) -+{ -+ return cs->csm->funcs->cs_write_dword(cs, dword); -+} -+ -+static inline int radeon_cs_write_reloc(struct radeon_cs *cs, -+ struct radeon_bo *bo, -+ uint32_t read_domain, -+ uint32_t write_domain, -+ uint32_t flags) -+{ -+ return cs->csm->funcs->cs_write_reloc(cs, -+ bo, -+ read_domain, -+ write_domain, -+ flags); -+} -+ -+static inline int radeon_cs_begin(struct radeon_cs *cs, -+ uint32_t ndw, -+ const char *file, -+ const char *func, -+ int line) ++static int cs_gem_check_space(struct radeon_cs *cs, struct radeon_cs_space_check *bos, int num_bo) +{ -+ return cs->csm->funcs->cs_begin(cs, ndw, file, func, line); -+} ++ struct radeon_cs_manager *csm = cs->csm; ++ int this_op_read = 0, this_op_gart_write = 0, this_op_vram_write = 0; ++ uint32_t read_domains, write_domain; ++ int i; ++ struct radeon_bo *bo; + -+static inline int radeon_cs_end(struct radeon_cs *cs, -+ const char *file, -+ const char *func, -+ int line) -+{ -+ return cs->csm->funcs->cs_end(cs, file, func, line); -+} ++ /* check the totals for this operation */ + -+static inline int radeon_cs_emit(struct radeon_cs *cs) -+{ -+ return cs->csm->funcs->cs_emit(cs); -+} ++ if (num_bo == 0) ++ return 0; + -+static inline int radeon_cs_destroy(struct radeon_cs *cs) -+{ -+ return cs->csm->funcs->cs_destroy(cs); ++ /* prepare */ ++ for (i = 0; i < num_bo; i++) { ++ bo = bos[i].bo; ++ ++ bos[i].new_accounted = 0; ++ read_domains = bos[i].read_domains; ++ write_domain = bos[i].write_domain; ++ ++ /* already accounted this bo */ ++ if (write_domain && (write_domain == bo->space_accounted)) ++ continue; ++ ++ if (read_domains && ((read_domains << 16) == bo->space_accounted)) ++ continue; ++ ++ if (bo->space_accounted == 0) { ++ if (write_domain == RADEON_GEM_DOMAIN_VRAM) ++ this_op_vram_write += bo->size; ++ else if (write_domain == RADEON_GEM_DOMAIN_GTT) ++ this_op_gart_write += bo->size; ++ else ++ this_op_read += bo->size; ++ bos[i].new_accounted = (read_domains << 16) | write_domain; ++ } else { ++ uint16_t old_read, old_write; ++ ++ old_read = bo->space_accounted >> 16; ++ old_write = bo->space_accounted & 0xffff; ++ ++ if (write_domain && (old_read & write_domain)) { ++ bos[i].new_accounted = write_domain; ++ /* moving from read to a write domain */ ++ if (write_domain == RADEON_GEM_DOMAIN_VRAM) { ++ this_op_read -= bo->size; ++ this_op_vram_write += bo->size; ++ } else if (write_domain == RADEON_GEM_DOMAIN_VRAM) { ++ this_op_read -= bo->size; ++ this_op_gart_write += bo->size; ++ } ++ } else if (read_domains & old_write) { ++ bos[i].new_accounted = bo->space_accounted & 0xffff; ++ } else { ++ /* rewrite the domains */ ++ if (write_domain != old_write) ++ fprintf(stderr,"WRITE DOMAIN RELOC FAILURE 0x%x %d %d\n", bo->handle, write_domain, old_write); ++ if (read_domains != old_read) ++ fprintf(stderr,"READ DOMAIN RELOC FAILURE 0x%x %d %d\n", bo->handle, read_domains, old_read); ++ return RADEON_CS_SPACE_FLUSH; ++ } ++ } ++ } ++ ++ if (this_op_read < 0) ++ this_op_read = 0; ++ ++ /* check sizes - operation first */ ++ if ((this_op_read + this_op_gart_write > csm->gart_limit) || ++ (this_op_vram_write > csm->vram_limit)) { ++ return RADEON_CS_SPACE_OP_TO_BIG; ++ } ++ ++ if (((csm->vram_write_used + this_op_vram_write) > csm->vram_limit) || ++ ((csm->read_used + csm->gart_write_used + this_op_gart_write + this_op_read) > csm->gart_limit)) { ++ return RADEON_CS_SPACE_FLUSH; ++ } ++ ++ csm->gart_write_used += this_op_gart_write; ++ csm->vram_write_used += this_op_vram_write; ++ csm->read_used += this_op_read; ++ /* commit */ ++ for (i = 0; i < num_bo; i++) { ++ bo = bos[i].bo; ++ bo->space_accounted = bos[i].new_accounted; ++ } ++ ++ return RADEON_CS_SPACE_OK; +} + -+static inline int radeon_cs_erase(struct radeon_cs *cs) -+{ -+ return cs->csm->funcs->cs_erase(cs); -+} ++static struct radeon_cs_funcs radeon_cs_gem_funcs = { ++ cs_gem_create, ++ cs_gem_write_reloc, ++ cs_gem_begin, ++ cs_gem_end, ++ cs_gem_emit, ++ cs_gem_destroy, ++ cs_gem_erase, ++ cs_gem_need_flush, ++ cs_gem_print, ++ cs_gem_check_space, ++}; + -+static inline int radeon_cs_need_flush(struct radeon_cs *cs) ++struct radeon_cs_manager *radeon_cs_manager_gem_ctor(int fd) +{ -+ return cs->csm->funcs->cs_need_flush(cs); ++ struct radeon_cs_manager *csm; ++ ++ csm = (struct radeon_cs_manager*)calloc(1, ++ sizeof(struct radeon_cs_manager)); ++ if (csm == NULL) { ++ return NULL; ++ } ++ csm->funcs = &radeon_cs_gem_funcs; ++ csm->fd = fd; ++ return csm; +} + -+static inline void radeon_cs_print(struct radeon_cs *cs, FILE *file) ++void radeon_cs_manager_gem_dtor(struct radeon_cs_manager *csm) +{ -+ cs->csm->funcs->cs_print(cs, file); ++ free(csm); +} +diff --git a/libdrm/radeon/radeon_cs_gem.h b/libdrm/radeon/radeon_cs_gem.h +new file mode 100644 +index 0000000..5efd146 +--- /dev/null ++++ b/libdrm/radeon/radeon_cs_gem.h +@@ -0,0 +1,41 @@ ++/* ++ * Copyright © 2008 Nicolai Haehnle ++ * Copyright © 2008 Jérôme Glisse ++ * All Rights Reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sub license, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS ++ * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE ++ * USE OR OTHER DEALINGS IN THE SOFTWARE. ++ * ++ * The above copyright notice and this permission notice (including the ++ * next paragraph) shall be included in all copies or substantial portions ++ * of the Software. ++ */ ++/* ++ * Authors: ++ * Aapo Tahkola ++ * Nicolai Haehnle ++ * Jérôme Glisse ++ */ ++#ifndef RADEON_CS_GEM_H ++#define RADEON_CS_GEM_H ++ ++#include "radeon_cs.h" ++ ++struct radeon_cs_manager *radeon_cs_manager_gem_ctor(int fd); ++void radeon_cs_manager_gem_dtor(struct radeon_cs_manager *csm); + +#endif -diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_track.c ---- /dev/null 2008-12-18 14:22:13.823022429 +1000 -+++ libdrm-2.4.3/libdrm/radeon/radeon_track.c 2008-12-22 12:05:48.000000000 +1000 +diff --git a/libdrm/radeon/radeon_track.c b/libdrm/radeon/radeon_track.c +new file mode 100644 +index 0000000..1623906 +--- /dev/null ++++ b/libdrm/radeon/radeon_track.c @@ -0,0 +1,140 @@ +/* + * Copyright © 2008 Jérôme Glisse @@ -1277,9 +1657,11 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_track.c + free(tmp); + } +} -diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_track.h ---- /dev/null 2008-12-18 14:22:13.823022429 +1000 -+++ libdrm-2.4.3/libdrm/radeon/radeon_track.h 2008-12-22 12:05:48.000000000 +1000 +diff --git a/libdrm/radeon/radeon_track.h b/libdrm/radeon/radeon_track.h +new file mode 100644 +index 0000000..838d1f3 +--- /dev/null ++++ b/libdrm/radeon/radeon_track.h @@ -0,0 +1,64 @@ +/* + * Copyright © 2008 Jérôme Glisse @@ -1345,185 +1727,3 @@ diff -up /dev/null libdrm-2.4.3/libdrm/radeon/radeon_track.h + FILE *file); + +#endif -diff -up libdrm-2.4.3/shared-core/radeon_drm.h.dave libdrm-2.4.3/shared-core/radeon_drm.h ---- libdrm-2.4.3/shared-core/radeon_drm.h.dave 2008-12-19 14:33:38.000000000 +1000 -+++ libdrm-2.4.3/shared-core/radeon_drm.h 2008-12-22 12:05:48.000000000 +1000 -@@ -453,8 +453,18 @@ typedef struct { - int pfCurrentPage; /* which buffer is being displayed? */ - int crtc2_base; /* CRTC2 frame offset */ - int tiling_enabled; /* set by drm, read by 2d + 3d clients */ -+ -+ unsigned int last_fence; -+ -+ uint32_t front_handle; -+ uint32_t back_handle; -+ uint32_t depth_handle; -+ uint32_t front_pitch; -+ uint32_t back_pitch; -+ uint32_t depth_pitch; - } drm_radeon_sarea_t; - -+ - /* WARNING: If you change any of these defines, make sure to change the - * defines in the Xserver file (xf86drmRadeon.h) - * -@@ -493,6 +503,18 @@ typedef struct { - #define DRM_RADEON_SURF_ALLOC 0x1a - #define DRM_RADEON_SURF_FREE 0x1b - -+#define DRM_RADEON_GEM_INFO 0x1c -+#define DRM_RADEON_GEM_CREATE 0x1d -+#define DRM_RADEON_GEM_MMAP 0x1e -+#define DRM_RADEON_GEM_PIN 0x1f -+#define DRM_RADEON_GEM_UNPIN 0x20 -+#define DRM_RADEON_GEM_PREAD 0x21 -+#define DRM_RADEON_GEM_PWRITE 0x22 -+#define DRM_RADEON_GEM_SET_DOMAIN 0x23 -+#define DRM_RADEON_GEM_WAIT_RENDERING 0x24 -+ -+#define DRM_RADEON_CS 0x26 -+ - #define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t) - #define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START) - #define DRM_IOCTL_RADEON_CP_STOP DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_STOP, drm_radeon_cp_stop_t) -@@ -521,6 +543,17 @@ typedef struct { - #define DRM_IOCTL_RADEON_SURF_ALLOC DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_ALLOC, drm_radeon_surface_alloc_t) - #define DRM_IOCTL_RADEON_SURF_FREE DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_FREE, drm_radeon_surface_free_t) - -+#define DRM_IOCTL_RADEON_GEM_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_INFO, struct drm_radeon_gem_info) -+#define DRM_IOCTL_RADEON_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_CREATE, struct drm_radeon_gem_create) -+#define DRM_IOCTL_RADEON_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_MMAP, struct drm_radeon_gem_mmap) -+#define DRM_IOCTL_RADEON_GEM_PIN DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PIN, struct drm_radeon_gem_pin) -+#define DRM_IOCTL_RADEON_GEM_UNPIN DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_UNPIN, struct drm_radeon_gem_unpin) -+#define DRM_IOCTL_RADEON_GEM_PREAD DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PREAD, struct drm_radeon_gem_pread) -+#define DRM_IOCTL_RADEON_GEM_PWRITE DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PWRITE, struct drm_radeon_gem_pwrite) -+#define DRM_IOCTL_RADEON_GEM_SET_DOMAIN DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_DOMAIN, struct drm_radeon_gem_set_domain) -+#define DRM_IOCTL_RADEON_GEM_WAIT_RENDERING DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_GEM_WAIT_RENDERING, struct drm_radeon_gem_wait_rendering) -+#define DRM_IOCTL_RADEON_CS DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_CS, struct drm_radeon_cs) -+ - typedef struct drm_radeon_init { - enum { - RADEON_INIT_CP = 0x01, -@@ -677,6 +710,7 @@ typedef struct drm_radeon_indirect { - #define RADEON_PARAM_VBLANK_CRTC 13 /* VBLANK CRTC */ - #define RADEON_PARAM_FB_LOCATION 14 /* FB location */ - #define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */ -+#define RADEON_PARAM_KERNEL_MM 16 - - typedef struct drm_radeon_getparam { - int param; -@@ -732,6 +766,7 @@ typedef struct drm_radeon_setparam { - #define RADEON_SETPARAM_NEW_MEMMAP 4 /* Use new memory map */ - #define RADEON_SETPARAM_PCIGART_TABLE_SIZE 5 /* PCI GART Table Size */ - #define RADEON_SETPARAM_VBLANK_CRTC 6 /* VBLANK CRTC */ -+#define RADEON_SETPARAM_MM_INIT 7 /* Initialise the mm */ - /* 1.14: Clients can allocate/free a surface - */ - typedef struct drm_radeon_surface_alloc { -@@ -747,4 +782,106 @@ typedef struct drm_radeon_surface_free { - #define DRM_RADEON_VBLANK_CRTC1 1 - #define DRM_RADEON_VBLANK_CRTC2 2 - -+#define RADEON_GEM_DOMAIN_CPU 0x1 // Cached CPU domain -+#define RADEON_GEM_DOMAIN_GTT 0x2 // GTT or cache flushed -+#define RADEON_GEM_DOMAIN_VRAM 0x4 // VRAM domain -+ -+/* return to userspace start/size of gtt and vram apertures */ -+struct drm_radeon_gem_info { -+ uint64_t gart_start; -+ uint64_t gart_size; -+ uint64_t vram_start; -+ uint64_t vram_size; -+ uint64_t vram_visible; -+}; -+ -+struct drm_radeon_gem_create { -+ uint64_t size; -+ uint64_t alignment; -+ uint32_t handle; -+ uint32_t initial_domain; // to allow VRAM to be created -+ uint32_t no_backing_store; // for VRAM objects - select whether they need backing store -+ // pretty much front/back/depth don't need it - other things do -+}; -+ -+struct drm_radeon_gem_mmap { -+ uint32_t handle; -+ uint32_t pad; -+ uint64_t offset; -+ uint64_t size; -+ uint64_t addr_ptr; -+}; -+ -+struct drm_radeon_gem_set_domain { -+ uint32_t handle; -+ uint32_t read_domains; -+ uint32_t write_domain; -+}; -+ -+struct drm_radeon_gem_wait_rendering { -+ uint32_t handle; -+}; -+ -+struct drm_radeon_gem_pin { -+ uint32_t handle; -+ uint32_t pin_domain; -+ uint64_t alignment; -+ uint64_t offset; -+}; -+ -+struct drm_radeon_gem_unpin { -+ uint32_t handle; -+ uint32_t pad; -+}; -+ -+struct drm_radeon_gem_busy { -+ uint32_t handle; -+ uint32_t busy; -+}; -+ -+struct drm_radeon_gem_pread { -+ /** Handle for the object being read. */ -+ uint32_t handle; -+ uint32_t pad; -+ /** Offset into the object to read from */ -+ uint64_t offset; -+ /** Length of data to read */ -+ uint64_t size; -+ /** Pointer to write the data into. */ -+ uint64_t data_ptr; /* void *, but pointers are not 32/64 compatible */ -+}; -+ -+struct drm_radeon_gem_pwrite { -+ /** Handle for the object being written to. */ -+ uint32_t handle; -+ uint32_t pad; -+ /** Offset into the object to write to */ -+ uint64_t offset; -+ /** Length of data to write */ -+ uint64_t size; -+ /** Pointer to read the data from. */ -+ uint64_t data_ptr; /* void *, but pointers are not 32/64 compatible */ -+}; -+ -+ -+/* New interface which obsolete all previous interface. -+ */ -+ -+#define RADEON_CHUNK_ID_RELOCS 0x01 -+#define RADEON_CHUNK_ID_IB 0x02 -+ -+struct drm_radeon_cs_chunk { -+ uint32_t chunk_id; -+ uint32_t length_dw; -+ uint64_t chunk_data; -+}; -+ -+struct drm_radeon_cs { -+ uint32_t num_chunks; -+ uint32_t cs_id; -+ uint64_t chunks; /* this points to uint64_t * which point to -+ cs chunks */ -+}; -+ -+ - #endif diff --git a/libdrm.spec b/libdrm.spec index 173dc42..e3e0c86 100644 --- a/libdrm.spec +++ b/libdrm.spec @@ -3,7 +3,7 @@ Summary: Direct Rendering Manager runtime library Name: libdrm Version: 2.4.4 -Release: 2%{?dist} +Release: 3%{?dist} License: MIT Group: System Environment/Libraries URL: http://dri.sourceforge.net @@ -28,7 +28,6 @@ Patch3: libdrm-make-dri-perms-okay.patch Patch4: libdrm-2.4.0-no-bc.patch # radeon libdrm patches from modesetting-gem branch of upstream Patch8: libdrm-radeon.patch -Patch9: libdrm-radeon-update.patch %description Direct Rendering Manager runtime library @@ -48,7 +47,6 @@ Direct Rendering Manager development package %patch3 -p1 -b .forceperms %patch4 -p1 -b .no-bc %patch8 -p1 -b .radeon -%patch9 -p1 -b .radeon2 %build autoreconf -v --install || exit 1 @@ -100,6 +98,9 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/pkgconfig/libdrm.pc %changelog +* Thu Feb 05 2009 Dave Airlie 2.4.4-3 +- update with more libdrm/radeon upstream fixes + * Sun Feb 01 2009 Dave Airlie 2.4.4-2 - update specfile with review changes