From dd139e3a72c6dae49491d9135cf5eb8125b5fd19 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Oct 27 2008 21:00:49 +0000 Subject: - add support for wait for rendering --- diff --git a/radeon-modeset.patch b/radeon-modeset.patch index 7df5e55..1bf1196 100644 --- a/radeon-modeset.patch +++ b/radeon-modeset.patch @@ -1,3 +1,9 @@ +commit 17b7b76a702640462a3878ae745fd1f5ddd32f19 +Author: Dave Airlie +Date: Tue Oct 28 06:40:31 2008 +1000 + + radeon: enable gem wait rendering. + commit 2171a9d834be69e002a93fe440450ff532758e93 Author: Dave Airlie Date: Mon Oct 27 16:51:00 2008 +1000 @@ -2447,10 +2453,10 @@ index 0000000..0d79b58 +#endif diff --git a/src/radeon_bufmgr_gem.c b/src/radeon_bufmgr_gem.c new file mode 100644 -index 0000000..1e29981 +index 0000000..7ad911d --- /dev/null +++ b/src/radeon_bufmgr_gem.c -@@ -0,0 +1,532 @@ +@@ -0,0 +1,533 @@ +/************************************************************************** + * + * Copyright © 2007-2008 Red Hat Inc. @@ -2652,7 +2658,7 @@ index 0000000..1e29981 + if (gem_bo->map_count++ != 0) + return 0; + -+ gem_bo->touched = 1; ++ gem_bo->touched = 1; /* workaround */ + args.handle = gem_bo->gem_handle; + args.offset = 0; + args.size = gem_bo->bo.size; @@ -2690,15 +2696,16 @@ index 0000000..1e29981 +void radeon_bufmgr_gem_wait_rendering(dri_bo *buf) +{ + dri_bufmgr_gem *bufmgr_gem = (dri_bufmgr_gem *)buf->bufmgr; -+ struct drm_radeon_gem_set_domain dom_args; ++ struct drm_radeon_gem_wait_rendering args; + dri_bo_gem *gem_bo = (dri_bo_gem *)buf; + int ret; + -+ dom_args.handle = gem_bo->gem_handle; -+ dom_args.read_domains = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM; -+ dom_args.write_domain = 0; -+ ret = drmCommandWriteRead(bufmgr_gem->fd, DRM_RADEON_GEM_SET_DOMAIN, -+ &dom_args, sizeof(dom_args)); ++ args.handle = gem_bo->gem_handle; ++ ++ do { ++ ret = drmCommandWriteRead(bufmgr_gem->fd, DRM_RADEON_GEM_WAIT_RENDERING, ++ &args, sizeof(args)); ++ } while (ret == -EAGAIN); + return; +} + @@ -5510,7 +5517,7 @@ index c759bd6..46fa59a 100644 pScrn->vtSema = FALSE; diff --git a/src/radeon_drm.h b/src/radeon_drm.h -index 66cefb7..18bad6b 100644 +index 66cefb7..af7d382 100644 --- a/src/radeon_drm.h +++ b/src/radeon_drm.h @@ -303,7 +303,6 @@ typedef union { @@ -5549,7 +5556,7 @@ index 66cefb7..18bad6b 100644 +#define DRM_RADEON_GEM_PREAD 0x21 +#define DRM_RADEON_GEM_PWRITE 0x22 +#define DRM_RADEON_GEM_SET_DOMAIN 0x23 -+#define DRM_RADEON_GEM_INDIRECT 0x24 // temporary for X server ++#define DRM_RADEON_GEM_WAIT_RENDERING 0x24 + +#define DRM_RADEON_CS 0x25 +#define DRM_RADEON_CS2 0x26 @@ -5557,7 +5564,7 @@ index 66cefb7..18bad6b 100644 #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) -@@ -522,16 +543,29 @@ typedef struct { +@@ -522,16 +543,28 @@ 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) @@ -5569,8 +5576,7 @@ index 66cefb7..18bad6b 100644 +#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_INDIRECT DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_INDIRECT, struct drm_radeon_gem_indirect) -+ ++#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) +#define DRM_IOCTL_RADEON_CS2 DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_CS2, struct drm_radeon_cs2) + @@ -5590,7 +5596,7 @@ index 66cefb7..18bad6b 100644 int cp_mode; int gart_size; int ring_size; -@@ -543,9 +577,8 @@ typedef struct drm_radeon_init { +@@ -543,9 +576,8 @@ typedef struct drm_radeon_init { unsigned int depth_bpp; unsigned int depth_offset, depth_pitch; @@ -5602,7 +5608,7 @@ index 66cefb7..18bad6b 100644 unsigned long ring_offset; unsigned long ring_rptr_offset; unsigned long buffers_offset; -@@ -581,7 +614,7 @@ typedef struct drm_radeon_clear { +@@ -581,7 +613,7 @@ typedef struct drm_radeon_clear { unsigned int clear_depth; unsigned int color_mask; unsigned int depth_mask; /* misnamed field: should be stencil */ @@ -5611,7 +5617,7 @@ index 66cefb7..18bad6b 100644 } drm_radeon_clear_t; typedef struct drm_radeon_vertex { -@@ -607,9 +640,9 @@ typedef struct drm_radeon_vertex2 { +@@ -607,9 +639,9 @@ typedef struct drm_radeon_vertex2 { int idx; /* Index of vertex buffer */ int discard; /* Client finished with buffer? */ int nr_states; @@ -5623,7 +5629,7 @@ index 66cefb7..18bad6b 100644 } drm_radeon_vertex2_t; /* v1.3 - obsoletes drm_radeon_vertex2 -@@ -624,15 +657,15 @@ typedef struct drm_radeon_vertex2 { +@@ -624,15 +656,15 @@ typedef struct drm_radeon_vertex2 { */ typedef struct drm_radeon_cmd_buffer { int bufsz; @@ -5642,7 +5648,7 @@ index 66cefb7..18bad6b 100644 } drm_radeon_tex_image_t; typedef struct drm_radeon_texture { -@@ -641,11 +674,11 @@ typedef struct drm_radeon_texture { +@@ -641,11 +673,11 @@ typedef struct drm_radeon_texture { int format; int width; /* Texture image coordinates */ int height; @@ -5656,7 +5662,7 @@ index 66cefb7..18bad6b 100644 } drm_radeon_stipple_t; typedef struct drm_radeon_indirect { -@@ -655,9 +688,6 @@ typedef struct drm_radeon_indirect { +@@ -655,9 +687,6 @@ typedef struct drm_radeon_indirect { int discard; } drm_radeon_indirect_t; @@ -5666,7 +5672,7 @@ index 66cefb7..18bad6b 100644 /* enum for card type parameters */ #define RADEON_CARD_PCI 0 #define RADEON_CARD_AGP 1 -@@ -683,10 +713,11 @@ typedef struct drm_radeon_indirect { +@@ -683,10 +712,11 @@ 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 */ @@ -5679,7 +5685,7 @@ index 66cefb7..18bad6b 100644 } drm_radeon_getparam_t; /* 1.6: Set up a memory manager for regions of shared memory: -@@ -698,7 +729,7 @@ typedef struct drm_radeon_mem_alloc { +@@ -698,7 +728,7 @@ typedef struct drm_radeon_mem_alloc { int region; int alignment; int size; @@ -5688,7 +5694,7 @@ index 66cefb7..18bad6b 100644 } drm_radeon_mem_alloc_t; typedef struct drm_radeon_mem_free { -@@ -715,7 +746,7 @@ typedef struct drm_radeon_mem_init_heap { +@@ -715,7 +745,7 @@ typedef struct drm_radeon_mem_init_heap { /* 1.6: Userspace can request & wait on irq's: */ typedef struct drm_radeon_irq_emit { @@ -5697,7 +5703,7 @@ index 66cefb7..18bad6b 100644 } drm_radeon_irq_emit_t; typedef struct drm_radeon_irq_wait { -@@ -734,10 +765,10 @@ typedef struct drm_radeon_setparam { +@@ -734,10 +764,10 @@ typedef struct drm_radeon_setparam { #define RADEON_SETPARAM_FB_LOCATION 1 /* determined framebuffer location */ #define RADEON_SETPARAM_SWITCH_TILING 2 /* enable/disable color tiling */ #define RADEON_SETPARAM_PCIGART_LOCATION 3 /* PCI Gart Location */ @@ -5709,7 +5715,7 @@ index 66cefb7..18bad6b 100644 /* 1.14: Clients can allocate/free a surface */ typedef struct drm_radeon_surface_alloc { -@@ -753,4 +784,117 @@ typedef struct drm_radeon_surface_free { +@@ -753,4 +783,114 @@ typedef struct drm_radeon_surface_free { #define DRM_RADEON_VBLANK_CRTC1 1 #define DRM_RADEON_VBLANK_CRTC2 2 @@ -5749,7 +5755,8 @@ index 66cefb7..18bad6b 100644 + uint32_t write_domain; +}; + -+struct drm_radeon_gem_exec_buffer { ++struct drm_radeon_gem_wait_rendering { ++ uint32_t handle; +}; + +struct drm_radeon_gem_pin { @@ -5793,10 +5800,6 @@ index 66cefb7..18bad6b 100644 + uint64_t data_ptr; /* void *, but pointers are not 32/64 compatible */ +}; + -+struct drm_radeon_gem_indirect { -+ uint32_t handle; -+ uint32_t used; -+}; + +/* New interface which obsolete all previous interface. + */ @@ -5828,7 +5831,7 @@ index 66cefb7..18bad6b 100644 + #endif diff --git a/src/radeon_exa.c b/src/radeon_exa.c -index 0f86fdd..77a15c9 100644 +index 0f86fdd..4736c27 100644 --- a/src/radeon_exa.c +++ b/src/radeon_exa.c @@ -43,7 +43,11 @@ @@ -5893,7 +5896,7 @@ index 0f86fdd..77a15c9 100644 + if (radeon_bufmgr_gem_has_references(driver_priv->bo)) + RADEONCPFlushIndirect(pScrn, 0); + -+ //radeon_bufmgr_gem_wait_rendering(driver_priv->bo); ++ radeon_bufmgr_gem_wait_rendering(driver_priv->bo); + + /* flush IB */ + ret = dri_bo_map(driver_priv->bo, 1); diff --git a/xorg-x11-drv-ati.spec b/xorg-x11-drv-ati.spec index 989063f..70b0368 100644 --- a/xorg-x11-drv-ati.spec +++ b/xorg-x11-drv-ati.spec @@ -5,7 +5,7 @@ Summary: Xorg X11 ati video driver Name: xorg-x11-drv-ati Version: 6.9.0 -Release: 32%{?dist} +Release: 33%{?dist} URL: http://www.x.org License: MIT Group: User Interface/X Hardware Support @@ -32,7 +32,7 @@ Requires: hwdata Requires: xorg-x11-server-Xorg >= 1.4.99.1 Requires: libdrm >= 2.4.0-0.21 # new CS method needs newer kernel -Requires: kernel >= 2.6.27.4-52 +Requires: kernel >= 2.6.27.4-58 %description X.Org X11 ati video driver. @@ -74,6 +74,9 @@ rm -rf $RPM_BUILD_ROOT %{_mandir}/man4/radeon.4* %changelog +* Tue Oct 28 2008 Dave Airlie 6.9.0-33 +- add support for wait for rendering + * Mon Oct 27 2008 Dave Airlie 6.9.0-32 - move to CS2 mechanism - using chunks to avoid multiple relocations - add kernel requires about 2.6.27.4-52 for new CS mechanism