On Fri, Jul 03, 2015 at 10:29:44PM -0700, Kristian Høgsberg wrote: > On Tue, Jun 30, 2015 at 7:13 AM, Thomas Daniel <thomas.daniel@xxxxxxxxx> wrote: > > From: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > > > > Userspace can pass in an offset that it presumes the object is located > > at. The kernel will then do its utmost to fit the object into that > > location. The assumption is that userspace is handling its own object > > locations (for example along with full-ppgtt) and that the kernel will > > rarely have to make space for the user's requests. > > > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > > > > v2: Fixed incorrect eviction found by Michal Winiarski - fix suggested by Chris > > Wilson. Fixed incorrect error paths causing crash found by Michal Winiarski. > > (Not published externally) > > > > v3: Rebased because of trivial conflict in object_bind_to_vm. Fixed eviction > > to allow eviction of soft-pinned objects when another soft-pinned object used > > by a subsequent execbuffer overlaps reported by Michal Winiarski. > > (Not published externally) > > > > v4: Moved soft-pinned objects to the front of ordered_vmas so that they are > > pinned first after an address conflict happens to avoid repeated conflicts in > > rare cases (Suggested by Chris Wilson). Expanded comment on > > drm_i915_gem_exec_object2.offset to cover this new API. Note this patch is outdated compared to the one I have in my tree. There are also requirements to improve drm_mm_reserve_node(). > Can we add an I915_PARAM_HAS_EXEC_PINNED param for this feature? Yeah, it's not that difficult to test, static bool test_has_softpin(int fd) { struct drm_i915_gem_create create; struct drm_i915_gem_exec_object2 object; struct drm_i915_gem_pwrite pwrite; struct drm_i915_gem_execbuffer2 execbuf; uint32_t batch[2] = { 0xa << 23 }; bool ret = false; if (DBG_NO_SOFTPIN) return DBG_NO_SOFTPIN < 0; if (gem_param(fd, I915_PARAM_HAS_ALIASING_PPGTT) < 2) return false; memset(&create, 0, sizeof(create)); create.size = 4096; drmIoctl(fd, DRM_IOCTL_I915_GEM_CREATE, &create); memset(&pwrite, 0, sizeof(pwrite)); pwrite.handle = create.handle; pwrite.offset = 0; pwrite.size = sizeof(batch); pwrite.data_ptr = (uintptr_t)batch; if (drmIoctl(fd, DRM_IOCTL_I915_GEM_PWRITE, &pwrite)) goto fail; object.handle = create.handle; memset(&execbuf, 0, sizeof(execbuf)); execbuf.buffers_ptr = (uintptr_t)&object; execbuf.buffer_count = 1; if (drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf)) goto fail; object.flags = EXEC_OBJECT_PINNED; ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) == 0; fail: drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, &create); return ret; } but compares to static bool test_has_softpin(int fd) { if (DBG_NO_SOFTPIN) return DBG_NO_SOFTPIN < 0; if (gem_param(fd, I915_PARAM_HAS_ALIASING_PPGTT) < 2) return false; return gem_param(fd, I915_PARAM_HAS_EXEC_SOFTPIN) > 0; } with a parameter. At some point, we probably want to add a GETPARAMV! -Chris -- Chris Wilson, Intel Open Source Technology Centre _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx