[gem] Use CPU domain for new or pageable objects
Newly allocated objects need to be in the CPU domain as they've just been cleared by the CPU. Also, unmapping objects from the GTT needs to put them into the CPU domain, both to flush rendering as well as to ensure that any paging action gets flushed before we remap to the GTT.main
parent
71b09a5f75
commit
44ed693ca6
|
@ -100,6 +100,14 @@ drm_gem_object_alloc(struct drm_device *dev, size_t size)
|
|||
kref_init(&obj->handlecount);
|
||||
obj->size = size;
|
||||
|
||||
/*
|
||||
* We've just allocated pages from the kernel,
|
||||
* so they've just been written by the CPU with
|
||||
* zeros. They'll need to be clflushed before we
|
||||
* use them with the GPU.
|
||||
*/
|
||||
obj->write_domain = DRM_GEM_DOMAIN_CPU;
|
||||
obj->read_domains = DRM_GEM_DOMAIN_CPU;
|
||||
if (dev->driver->gem_init_object != NULL &&
|
||||
dev->driver->gem_init_object(obj) != 0) {
|
||||
fput(obj->filp);
|
||||
|
|
|
@ -35,6 +35,11 @@
|
|||
#define WATCH_LRU 0
|
||||
#define WATCH_RELOC 0
|
||||
|
||||
static void
|
||||
i915_gem_object_set_domain(struct drm_gem_object *obj,
|
||||
uint32_t read_domains,
|
||||
uint32_t write_domain);
|
||||
|
||||
int
|
||||
i915_gem_init_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
|
@ -456,11 +461,14 @@ i915_gem_object_unbind(struct drm_gem_object *obj)
|
|||
if (obj_priv->gtt_space == NULL)
|
||||
return;
|
||||
|
||||
/* Ignore the return value of wait_rendering. If we're here but
|
||||
* a wait_rendering hasn't completed, we're in the freeing process,
|
||||
* and we want the buffer to go away even if the command queue is hung.
|
||||
/* Move the object to the CPU domain to ensure that
|
||||
* any possible CPU writes while it's not in the GTT
|
||||
* are flushed when we go to remap it. This will
|
||||
* also ensure that all pending GPU writes are finished
|
||||
* before we unbind.
|
||||
*/
|
||||
(void)i915_gem_object_wait_rendering(obj);
|
||||
i915_gem_object_set_domain (obj, DRM_GEM_DOMAIN_CPU,
|
||||
DRM_GEM_DOMAIN_CPU);
|
||||
|
||||
if (obj_priv->agp_mem != NULL) {
|
||||
drm_unbind_agp(obj_priv->agp_mem);
|
||||
|
|
Loading…
Reference in New Issue