Rev 4363 | Rev 5368 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4363 | Rev 5068 | ||
---|---|---|---|
Line 211... | Line 211... | ||
211 | * Boolean of whether this buffer can be re-used |
211 | * Boolean of whether this buffer can be re-used |
212 | */ |
212 | */ |
213 | bool reusable; |
213 | bool reusable; |
Line 214... | Line 214... | ||
214 | 214 | ||
- | 215 | /** |
|
- | 216 | * Boolean of whether the GPU is definitely not accessing the buffer. |
|
- | 217 | * |
|
- | 218 | * This is only valid when reusable, since non-reusable |
|
- | 219 | * buffers are those that have been shared wth other |
|
- | 220 | * processes, so we don't know their state. |
|
- | 221 | */ |
|
- | 222 | bool idle; |
|
- | 223 | ||
215 | /** |
224 | /** |
216 | * Size in bytes of this buffer and its relocation descendents. |
225 | * Size in bytes of this buffer and its relocation descendents. |
217 | * |
226 | * |
218 | * Used to avoid costly tree walking in |
227 | * Used to avoid costly tree walking in |
219 | * drm_intel_bufmgr_check_aperture in the common case. |
228 | * drm_intel_bufmgr_check_aperture in the common case. |
Line 381... | Line 390... | ||
381 | i, |
390 | i, |
382 | bo_gem->gem_handle, bo_gem->name, |
391 | bo_gem->gem_handle, bo_gem->name, |
383 | (unsigned long long)bo_gem->relocs[j].offset, |
392 | (unsigned long long)bo_gem->relocs[j].offset, |
384 | target_gem->gem_handle, |
393 | target_gem->gem_handle, |
385 | target_gem->name, |
394 | target_gem->name, |
386 | target_bo->offset, |
395 | target_bo->offset64, |
387 | bo_gem->relocs[j].delta); |
396 | bo_gem->relocs[j].delta); |
388 | } |
397 | } |
389 | } |
398 | } |
390 | } |
399 | } |
Line 566... | Line 575... | ||
566 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
575 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
567 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
576 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
568 | struct drm_i915_gem_busy busy; |
577 | struct drm_i915_gem_busy busy; |
569 | int ret; |
578 | int ret; |
Line -... | Line 579... | ||
- | 579 | ||
- | 580 | if (bo_gem->reusable && bo_gem->idle) |
|
- | 581 | return false; |
|
570 | 582 | ||
571 | VG_CLEAR(busy); |
583 | VG_CLEAR(busy); |
Line 572... | Line 584... | ||
572 | busy.handle = bo_gem->gem_handle; |
584 | busy.handle = bo_gem->gem_handle; |
- | 585 | ||
- | 586 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_BUSY, &busy); |
|
- | 587 | if (ret == 0) { |
|
- | 588 | bo_gem->idle = !busy.busy; |
|
- | 589 | return busy.busy; |
|
573 | 590 | } else { |
|
574 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_BUSY, &busy); |
591 | return false; |
575 | 592 | } |
|
Line 576... | Line 593... | ||
576 | return (ret == 0 && busy.busy); |
593 | return (ret == 0 && busy.busy); |
577 | } |
594 | } |
Line 863... | Line 880... | ||
863 | drm_intel_gem_bo_reference(&bo_gem->bo); |
880 | drm_intel_gem_bo_reference(&bo_gem->bo); |
864 | return &bo_gem->bo; |
881 | return &bo_gem->bo; |
865 | } |
882 | } |
866 | } |
883 | } |
Line 867... | Line -... | ||
867 | - | ||
868 | bo_gem = calloc(1, sizeof(*bo_gem)); |
- | |
869 | if (!bo_gem) |
- | |
870 | return NULL; |
- | |
871 | 884 | ||
872 | VG_CLEAR(open_arg); |
885 | VG_CLEAR(open_arg); |
873 | open_arg.name = handle; |
886 | open_arg.name = handle; |
874 | ret = drmIoctl(bufmgr_gem->fd, |
887 | ret = drmIoctl(bufmgr_gem->fd, |
875 | DRM_IOCTL_GEM_OPEN, |
888 | DRM_IOCTL_GEM_OPEN, |
876 | &open_arg); |
889 | &open_arg); |
877 | if (ret != 0) { |
890 | if (ret != 0) { |
878 | DBG("Couldn't reference %s handle 0x%08x: %s\n", |
891 | DBG("Couldn't reference %s handle 0x%08x: %s\n", |
879 | name, handle, strerror(errno)); |
- | |
880 | free(bo_gem); |
892 | name, handle, strerror(errno)); |
881 | return NULL; |
893 | return NULL; |
- | 894 | } |
|
- | 895 | /* Now see if someone has used a prime handle to get this |
|
- | 896 | * object from the kernel before by looking through the list |
|
- | 897 | * again for a matching gem_handle |
|
- | 898 | */ |
|
- | 899 | for (list = bufmgr_gem->named.next; |
|
- | 900 | list != &bufmgr_gem->named; |
|
- | 901 | list = list->next) { |
|
- | 902 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
|
- | 903 | if (bo_gem->gem_handle == open_arg.handle) { |
|
- | 904 | drm_intel_gem_bo_reference(&bo_gem->bo); |
|
- | 905 | return &bo_gem->bo; |
|
- | 906 | } |
|
- | 907 | } |
|
- | 908 | ||
- | 909 | bo_gem = calloc(1, sizeof(*bo_gem)); |
|
- | 910 | if (!bo_gem) |
|
- | 911 | return NULL; |
|
882 | } |
912 | |
883 | bo_gem->bo.size = open_arg.size; |
913 | bo_gem->bo.size = open_arg.size; |
- | 914 | bo_gem->bo.offset = 0; |
|
884 | bo_gem->bo.offset = 0; |
915 | bo_gem->bo.offset64 = 0; |
885 | bo_gem->bo.virtual = NULL; |
916 | bo_gem->bo.virtual = NULL; |
886 | bo_gem->bo.bufmgr = bufmgr; |
917 | bo_gem->bo.bufmgr = bufmgr; |
887 | bo_gem->name = name; |
918 | bo_gem->name = name; |
888 | atomic_set(&bo_gem->refcount, 1); |
919 | atomic_set(&bo_gem->refcount, 1); |
Line 1320... | Line 1351... | ||
1320 | */ |
1351 | */ |
Line 1321... | Line 1352... | ||
1321 | 1352 | ||
1322 | int drm_intel_gem_bo_map_unsynchronized(drm_intel_bo *bo) |
1353 | int drm_intel_gem_bo_map_unsynchronized(drm_intel_bo *bo) |
1323 | { |
1354 | { |
- | 1355 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
|
- | 1356 | #ifdef HAVE_VALGRIND |
|
- | 1357 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
|
1324 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1358 | #endif |
Line 1325... | Line 1359... | ||
1325 | int ret; |
1359 | int ret; |
1326 | 1360 | ||
1327 | /* If the CPU cache isn't coherent with the GTT, then use a |
1361 | /* If the CPU cache isn't coherent with the GTT, then use a |
Line 1660... | Line 1694... | ||
1660 | bo_gem->relocs[bo_gem->reloc_count].delta = target_offset; |
1694 | bo_gem->relocs[bo_gem->reloc_count].delta = target_offset; |
1661 | bo_gem->relocs[bo_gem->reloc_count].target_handle = |
1695 | bo_gem->relocs[bo_gem->reloc_count].target_handle = |
1662 | target_bo_gem->gem_handle; |
1696 | target_bo_gem->gem_handle; |
1663 | bo_gem->relocs[bo_gem->reloc_count].read_domains = read_domains; |
1697 | bo_gem->relocs[bo_gem->reloc_count].read_domains = read_domains; |
1664 | bo_gem->relocs[bo_gem->reloc_count].write_domain = write_domain; |
1698 | bo_gem->relocs[bo_gem->reloc_count].write_domain = write_domain; |
1665 | bo_gem->relocs[bo_gem->reloc_count].presumed_offset = target_bo->offset; |
1699 | bo_gem->relocs[bo_gem->reloc_count].presumed_offset = target_bo->offset64; |
Line 1666... | Line 1700... | ||
1666 | 1700 | ||
1667 | bo_gem->reloc_target_info[bo_gem->reloc_count].bo = target_bo; |
1701 | bo_gem->reloc_target_info[bo_gem->reloc_count].bo = target_bo; |
1668 | if (target_bo != bo) |
1702 | if (target_bo != bo) |
1669 | drm_intel_gem_bo_reference(target_bo); |
1703 | drm_intel_gem_bo_reference(target_bo); |
Line 1811... | Line 1845... | ||
1811 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
1845 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
1812 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
1846 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
1813 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1847 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
Line 1814... | Line 1848... | ||
1814 | 1848 | ||
1815 | /* Update the buffer offset */ |
1849 | /* Update the buffer offset */ |
1816 | if (bufmgr_gem->exec_objects[i].offset != bo->offset) { |
1850 | if (bufmgr_gem->exec_objects[i].offset != bo->offset64) { |
1817 | DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n", |
1851 | DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n", |
1818 | bo_gem->gem_handle, bo_gem->name, bo->offset, |
1852 | bo_gem->gem_handle, bo_gem->name, bo->offset64, |
1819 | (unsigned long long)bufmgr_gem->exec_objects[i]. |
1853 | (unsigned long long)bufmgr_gem->exec_objects[i]. |
- | 1854 | offset); |
|
1820 | offset); |
1855 | bo->offset64 = bufmgr_gem->exec_objects[i].offset; |
1821 | bo->offset = bufmgr_gem->exec_objects[i].offset; |
1856 | bo->offset = bufmgr_gem->exec_objects[i].offset; |
1822 | } |
1857 | } |
1823 | } |
1858 | } |
Line 1831... | Line 1866... | ||
1831 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
1866 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
1832 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
1867 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
1833 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
1868 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
Line 1834... | Line 1869... | ||
1834 | 1869 | ||
1835 | /* Update the buffer offset */ |
1870 | /* Update the buffer offset */ |
1836 | if (bufmgr_gem->exec2_objects[i].offset != bo->offset) { |
1871 | if (bufmgr_gem->exec2_objects[i].offset != bo->offset64) { |
1837 | DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n", |
1872 | DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n", |
1838 | bo_gem->gem_handle, bo_gem->name, bo->offset, |
1873 | bo_gem->gem_handle, bo_gem->name, bo->offset64, |
- | 1874 | (unsigned long long)bufmgr_gem->exec2_objects[i].offset); |
|
1839 | (unsigned long long)bufmgr_gem->exec2_objects[i].offset); |
1875 | bo->offset64 = bufmgr_gem->exec2_objects[i].offset; |
1840 | bo->offset = bufmgr_gem->exec2_objects[i].offset; |
1876 | bo->offset = bufmgr_gem->exec2_objects[i].offset; |
1841 | } |
1877 | } |
1842 | } |
1878 | } |
Line 2219... | Line 2255... | ||
2219 | 2255 | ||
2220 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
2256 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
2221 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
2257 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
Line -... | Line 2258... | ||
- | 2258 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
|
- | 2259 | ||
2222 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
2260 | bo_gem->idle = false; |
2223 | 2261 | ||
2224 | /* Disconnect the buffer from the validate list */ |
2262 | /* Disconnect the buffer from the validate list */ |
2225 | bo_gem->validate_index = -1; |
2263 | bo_gem->validate_index = -1; |
2226 | bufmgr_gem->exec_bos[i] = NULL; |
2264 | bufmgr_gem->exec_bos[i] = NULL; |
Line 2272... | Line 2310... | ||
2272 | DRM_IOCTL_I915_GEM_PIN, |
2310 | DRM_IOCTL_I915_GEM_PIN, |
2273 | &pin); |
2311 | &pin); |
2274 | if (ret != 0) |
2312 | if (ret != 0) |
2275 | return -errno; |
2313 | return -errno; |
Line -... | Line 2314... | ||
- | 2314 | ||
2276 | 2315 | bo->offset64 = pin.offset; |
|
2277 | bo->offset = pin.offset; |
2316 | bo->offset = pin.offset; |
2278 | return 0; |
2317 | return 0; |
Line 2279... | Line 2318... | ||
2279 | } |
2318 | } |
Line 2486... | Line 2525... | ||
2486 | return -errno; |
2525 | return -errno; |
Line 2487... | Line 2526... | ||
2487 | 2526 | ||
2488 | bo_gem->global_name = flink.name; |
2527 | bo_gem->global_name = flink.name; |
Line -... | Line 2528... | ||
- | 2528 | bo_gem->reusable = false; |
|
2489 | bo_gem->reusable = false; |
2529 | |
2490 | 2530 | if (DRMLISTEMPTY(&bo_gem->name_list)) |
|
Line 2491... | Line 2531... | ||
2491 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
2531 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
2492 | } |
2532 | } |
Line 2874... | Line 2914... | ||
2874 | aub_out(bufmgr_gem, 0); /* timestamp */ |
2914 | aub_out(bufmgr_gem, 0); /* timestamp */ |
2875 | aub_out(bufmgr_gem, 0); /* timestamp */ |
2915 | aub_out(bufmgr_gem, 0); /* timestamp */ |
2876 | aub_out(bufmgr_gem, 0); /* comment len */ |
2916 | aub_out(bufmgr_gem, 0); /* comment len */ |
Line 2877... | Line 2917... | ||
2877 | 2917 | ||
2878 | /* Set up the GTT. The max we can handle is 256M */ |
2918 | /* Set up the GTT. The max we can handle is 256M */ |
2879 | aub_out(bufmgr_gem, CMD_AUB_TRACE_HEADER_BLOCK | (5 - 2)); |
2919 | aub_out(bufmgr_gem, CMD_AUB_TRACE_HEADER_BLOCK | ((bufmgr_gem->gen >= 8 ? 6 : 5) - 2)); |
2880 | aub_out(bufmgr_gem, AUB_TRACE_MEMTYPE_NONLOCAL | 0 | AUB_TRACE_OP_DATA_WRITE); |
2920 | aub_out(bufmgr_gem, AUB_TRACE_MEMTYPE_NONLOCAL | 0 | AUB_TRACE_OP_DATA_WRITE); |
2881 | aub_out(bufmgr_gem, 0); /* subtype */ |
2921 | aub_out(bufmgr_gem, 0); /* subtype */ |
2882 | aub_out(bufmgr_gem, 0); /* offset */ |
2922 | aub_out(bufmgr_gem, 0); /* offset */ |
2883 | aub_out(bufmgr_gem, gtt_size); /* size */ |
2923 | aub_out(bufmgr_gem, gtt_size); /* size */ |
Line 2892... | Line 2932... | ||
2892 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; |
2932 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; |
2893 | struct drm_i915_gem_context_create create; |
2933 | struct drm_i915_gem_context_create create; |
2894 | drm_intel_context *context = NULL; |
2934 | drm_intel_context *context = NULL; |
2895 | int ret; |
2935 | int ret; |
Line -... | Line 2936... | ||
- | 2936 | ||
- | 2937 | context = calloc(1, sizeof(*context)); |
|
- | 2938 | if (!context) |
|
- | 2939 | return NULL; |
|
2896 | 2940 | ||
2897 | VG_CLEAR(create); |
2941 | VG_CLEAR(create); |
2898 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create); |
2942 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create); |
2899 | if (ret != 0) { |
2943 | if (ret != 0) { |
2900 | DBG("DRM_IOCTL_I915_GEM_CONTEXT_CREATE failed: %s\n", |
2944 | DBG("DRM_IOCTL_I915_GEM_CONTEXT_CREATE failed: %s\n", |
- | 2945 | strerror(errno)); |
|
2901 | strerror(errno)); |
2946 | free(context); |
2902 | return NULL; |
2947 | return NULL; |
Line 2903... | Line -... | ||
2903 | } |
- | |
2904 | 2948 | } |
|
2905 | context = calloc(1, sizeof(*context)); |
2949 | |
Line 2906... | Line 2950... | ||
2906 | context->ctx_id = create.ctx_id; |
2950 | context->ctx_id = create.ctx_id; |
2907 | context->bufmgr = bufmgr; |
2951 | context->bufmgr = bufmgr; |
Line 3136... | Line 3180... | ||
3136 | * Every 4 was too few for the blender benchmark. |
3180 | * Every 4 was too few for the blender benchmark. |
3137 | */ |
3181 | */ |
3138 | bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2; |
3182 | bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2; |
Line 3139... | Line 3183... | ||
3139 | 3183 | ||
3140 | bufmgr_gem->bufmgr.bo_alloc = drm_intel_gem_bo_alloc; |
3184 | bufmgr_gem->bufmgr.bo_alloc = drm_intel_gem_bo_alloc; |
3141 | // bufmgr_gem->bufmgr.bo_alloc_for_render = |
3185 | bufmgr_gem->bufmgr.bo_alloc_for_render = |
3142 | // drm_intel_gem_bo_alloc_for_render; |
3186 | drm_intel_gem_bo_alloc_for_render; |
3143 | bufmgr_gem->bufmgr.bo_alloc_tiled = drm_intel_gem_bo_alloc_tiled; |
3187 | bufmgr_gem->bufmgr.bo_alloc_tiled = drm_intel_gem_bo_alloc_tiled; |
3144 | bufmgr_gem->bufmgr.bo_reference = drm_intel_gem_bo_reference; |
3188 | bufmgr_gem->bufmgr.bo_reference = drm_intel_gem_bo_reference; |
3145 | bufmgr_gem->bufmgr.bo_unreference = drm_intel_gem_bo_unreference; |
3189 | bufmgr_gem->bufmgr.bo_unreference = drm_intel_gem_bo_unreference; |
3146 | bufmgr_gem->bufmgr.bo_map = drm_intel_gem_bo_map; |
3190 | bufmgr_gem->bufmgr.bo_map = drm_intel_gem_bo_map; |