diff options
author | Keith Packard <keithp@keithp.com> | 2008-05-08 10:44:02 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2008-05-08 10:44:02 -0700 |
commit | 9af4c497433398fa4576a7c1c31036448cf4f24c (patch) | |
tree | 796775f0bebcdedc7b28dbc2511bfc00797786fc /linux-core/drm_gem.c | |
parent | effc6d998f080ba6f9c81d1b4b0e75a42be0238e (diff) |
[intel-gem] Move domains to relocation records. add set_domain ioctl.
Domain information is about buffer relationships, not buffer contents. That
means a relocation contains the domain information as it knows how the
source buffer references the target buffer.
This also adds the set_domain ioctl so that user space can move buffers to
the cpu domain.
Diffstat (limited to 'linux-core/drm_gem.c')
-rw-r--r-- | linux-core/drm_gem.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/linux-core/drm_gem.c b/linux-core/drm_gem.c index 4eaeffcf..3673c933 100644 --- a/linux-core/drm_gem.c +++ b/linux-core/drm_gem.c @@ -325,10 +325,6 @@ drm_gem_mmap_ioctl(struct drm_device *dev, void *data, if (IS_ERR((void *)addr)) return addr; - /* XXX hack until we have a driver callback to make this work */ - obj->read_domains = DRM_GEM_DOMAIN_CPU; - obj->write_domain = DRM_GEM_DOMAIN_CPU; - args->addr_ptr = (uint64_t) addr; return 0; @@ -461,6 +457,37 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data, } /** + * Called when user space prepares to use an object + */ +int +drm_gem_set_domain_ioctl (struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_gem_set_domain *args = data; + struct drm_gem_object *obj; + int ret; + + if (!(dev->driver->driver_features & DRIVER_GEM)) + return -ENODEV; + + obj = drm_gem_object_lookup(dev, file_priv, args->handle); + if (obj == NULL) + return -EINVAL; + + if (dev->driver->gem_set_domain) { + ret = dev->driver->gem_set_domain (obj, + args->read_domains, + args->write_domain); + } else { + obj->read_domains = args->read_domains; + obj->write_domain = args->write_domain; + ret = 0; + } + drm_gem_object_unreference (obj); + return ret; +} + +/** * Called at device open time, sets up the structure for handling refcounting * of mm objects. */ |