267,7 → 267,7 |
struct eb_objects *eb) |
{ |
#define N_RELOC(x) ((x) / sizeof(struct drm_i915_gem_relocation_entry)) |
struct drm_i915_gem_relocation_entry stack_reloc[N_RELOC(64)]; |
struct drm_i915_gem_relocation_entry stack_reloc[N_RELOC(512)]; |
struct drm_i915_gem_relocation_entry __user *user_relocs; |
struct drm_i915_gem_exec_object2 *entry = obj->exec_entry; |
int remain, ret; |
367,8 → 367,6 |
bool need_fence, need_mappable; |
int ret; |
|
// ENTER(); |
|
need_fence = |
has_fenced_gpu_access && |
entry->flags & EXEC_OBJECT_NEEDS_FENCE && |
377,10 → 375,7 |
|
ret = i915_gem_object_pin(obj, entry->alignment, need_mappable, false); |
if (ret) |
{ |
FAIL(); |
return ret; |
}; |
|
entry->flags |= __EXEC_OBJECT_HAS_PIN; |
|
388,10 → 383,7 |
if (entry->flags & EXEC_OBJECT_NEEDS_FENCE) { |
ret = i915_gem_object_get_fence(obj); |
if (ret) |
{ |
FAIL(); |
return ret; |
}; |
|
if (i915_gem_object_pin_fence(obj)) |
entry->flags |= __EXEC_OBJECT_HAS_FENCE; |
409,8 → 401,6 |
} |
|
entry->offset = obj->gtt_offset; |
// LEAVE(); |
|
return 0; |
} |
|
443,8 → 433,6 |
bool has_fenced_gpu_access = INTEL_INFO(ring->dev)->gen < 4; |
int retry; |
|
// ENTER(); |
|
INIT_LIST_HEAD(&ordered_objects); |
while (!list_empty(objects)) { |
struct drm_i915_gem_exec_object2 *entry; |
526,10 → 514,7 |
i915_gem_execbuffer_unreserve_object(obj); |
|
if (ret != -ENOSPC || retry++) |
{ |
// LEAVE(); |
return ret; |
}; |
|
// ret = i915_gem_evict_everything(ring->dev); |
if (ret) |
569,8 → 554,8 |
reloc_offset = malloc(count * sizeof(*reloc_offset)); |
reloc = malloc(total * sizeof(*reloc)); |
if (reloc == NULL || reloc_offset == NULL) { |
kfree(reloc); |
kfree(reloc_offset); |
free(reloc); |
free(reloc_offset); |
mutex_lock(&dev->struct_mutex); |
return -ENOMEM; |
} |
624,10 → 609,7 |
for (i = 0; i < count; i++) { |
|
if(exec[i].handle == -2) |
{ |
obj = get_fb_obj(); |
drm_gem_object_reference(&obj->base); |
} |
else |
obj = to_intel_bo(drm_gem_object_lookup(dev, file, |
exec[i].handle)); |
663,8 → 645,8 |
*/ |
|
err: |
kfree(reloc); |
kfree(reloc_offset); |
free(reloc); |
free(reloc_offset); |
return ret; |
} |
|
861,16 → 843,12 |
|
if (!i915_gem_check_execbuffer(args)) { |
DRM_DEBUG("execbuf with invalid offset/length\n"); |
FAIL(); |
return -EINVAL; |
} |
|
ret = validate_exec_list(exec, args->buffer_count); |
if (ret) |
{ |
FAIL(); |
return ret; |
}; |
|
flags = 0; |
if (args->flags & I915_EXEC_SECURE) { |
892,7 → 870,6 |
if (ctx_id != 0) { |
DRM_DEBUG("Ring %s doesn't support contexts\n", |
ring->name); |
FAIL(); |
return -EPERM; |
} |
break; |
1001,16 → 978,10 |
struct drm_i915_gem_object *obj; |
|
if(exec[i].handle == -2) |
{ |
obj = get_fb_obj(); |
drm_gem_object_reference(&obj->base); |
} |
else |
obj = to_intel_bo(drm_gem_object_lookup(dev, file, |
exec[i].handle)); |
|
// printf("%s object %p handle %d\n", __FUNCTION__, obj, exec[i].handle); |
|
if (&obj->base == NULL) { |
DRM_DEBUG("Invalid object handle %d at index %d\n", |
exec[i].handle, i); |
1123,11 → 1094,11 |
goto err; |
} |
|
trace_i915_gem_ring_dispatch(ring, intel_ring_get_seqno(ring), flags); |
// i915_gem_execbuffer_move_to_active(&objects, ring); |
// i915_gem_execbuffer_retire_commands(dev, file, ring); |
ring->gpu_caches_dirty = true; |
intel_ring_flush_all_caches(ring); |
|
i915_gem_execbuffer_move_to_active(&objects, ring); |
i915_gem_execbuffer_retire_commands(dev, file, ring); |
|
err: |
eb_destroy(eb); |
while (!list_empty(&objects)) { |
1144,11 → 1115,10 |
|
pre_mutex_err: |
kfree(cliprects); |
|
|
return ret; |
} |
|
|
int |
i915_gem_execbuffer2(struct drm_device *dev, void *data, |
struct drm_file *file) |
1157,24 → 1127,18 |
struct drm_i915_gem_exec_object2 *exec2_list = NULL; |
int ret; |
|
// ENTER(); |
|
if (args->buffer_count < 1 || |
args->buffer_count > UINT_MAX / sizeof(*exec2_list)) { |
DRM_DEBUG("execbuf2 with %d buffers\n", args->buffer_count); |
FAIL(); |
return -EINVAL; |
} |
|
exec2_list = kmalloc(sizeof(*exec2_list)*args->buffer_count, 0); |
if (exec2_list == NULL) |
exec2_list = malloc(sizeof(*exec2_list)*args->buffer_count); |
|
// if (exec2_list == NULL) |
// exec2_list = drm_malloc_ab(sizeof(*exec2_list), |
// args->buffer_count); |
if (exec2_list == NULL) { |
DRM_DEBUG("Failed to allocate exec list for %d buffers\n", |
args->buffer_count); |
FAIL(); |
return -ENOMEM; |
} |
ret = copy_from_user(exec2_list, |
1184,8 → 1148,7 |
if (ret != 0) { |
DRM_DEBUG("copy %d exec entries failed %d\n", |
args->buffer_count, ret); |
kfree(exec2_list); |
FAIL(); |
free(exec2_list); |
return -EFAULT; |
} |
|
1203,9 → 1166,6 |
} |
} |
|
kfree(exec2_list); |
|
// LEAVE(); |
|
free(exec2_list); |
return ret; |
} |