Rev 6110 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6110 | Rev 6667 | ||
---|---|---|---|
Line 44... | Line 44... | ||
44 | #include |
44 | #include |
45 | #include |
45 | #include |
46 | #include |
46 | #include |
47 | #include |
47 | #include |
48 | #include |
48 | #include |
49 | //#include |
49 | #include |
50 | #include |
50 | #include |
51 | #include |
51 | #include |
52 | #include |
52 | #include |
Line 53... | Line 53... | ||
53 | 53 | ||
Line 72... | Line 72... | ||
72 | #define VG(x) |
72 | #define VG(x) |
73 | #endif |
73 | #endif |
Line 74... | Line 74... | ||
74 | 74 | ||
Line -... | Line 75... | ||
- | 75 | #define memclear(s) memset(&s, 0, sizeof(s)) |
|
- | 76 | ||
- | 77 | ||
- | 78 | #define pthread_mutex_lock __gthread_mutex_lock |
|
- | 79 | #define pthread_mutex_unlock __gthread_mutex_unlock |
|
75 | #define memclear(s) memset(&s, 0, sizeof(s)) |
80 | #define pthread_mutex_destroy __gthread_mutex_destroy |
76 | 81 | ||
77 | #if 0 |
82 | #if 0 |
78 | #define DBG(...) do { \ |
83 | #define DBG(...) do { \ |
79 | if (bufmgr_gem->bufmgr.debug) \ |
84 | if (bufmgr_gem->bufmgr.debug) \ |
Line 116... | Line 121... | ||
116 | 121 | ||
Line 117... | Line 122... | ||
117 | int fd; |
122 | int fd; |
Line 118... | Line 123... | ||
118 | 123 | ||
Line 119... | Line 124... | ||
119 | int max_relocs; |
124 | int max_relocs; |
120 | 125 | ||
121 | // pthread_mutex_t lock; |
126 | __gthread_mutex_t lock; |
122 | 127 | ||
Line 749... | Line 754... | ||
749 | bo_size = page_size; |
754 | bo_size = page_size; |
750 | } else { |
755 | } else { |
751 | bo_size = bucket->size; |
756 | bo_size = bucket->size; |
752 | } |
757 | } |
Line 753... | Line 758... | ||
753 | 758 | ||
754 | // pthread_mutex_lock(&bufmgr_gem->lock); |
759 | pthread_mutex_lock(&bufmgr_gem->lock); |
755 | /* Get a buffer out of the cache if available */ |
760 | /* Get a buffer out of the cache if available */ |
756 | retry: |
761 | retry: |
757 | alloc_from_cache = false; |
762 | alloc_from_cache = false; |
758 | if (bucket != NULL && !DRMLISTEMPTY(&bucket->head)) { |
763 | if (bucket != NULL && !DRMLISTEMPTY(&bucket->head)) { |
Line 798... | Line 803... | ||
798 | drm_intel_gem_bo_free(&bo_gem->bo); |
803 | drm_intel_gem_bo_free(&bo_gem->bo); |
799 | goto retry; |
804 | goto retry; |
800 | } |
805 | } |
801 | } |
806 | } |
802 | } |
807 | } |
803 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
808 | pthread_mutex_unlock(&bufmgr_gem->lock); |
Line 804... | Line 809... | ||
804 | 809 | ||
805 | if (!alloc_from_cache) { |
810 | if (!alloc_from_cache) { |
Line 806... | Line 811... | ||
806 | struct drm_i915_gem_create create; |
811 | struct drm_i915_gem_create create; |
Line 1094... | Line 1099... | ||
1094 | * For instance, in a DRI client only the render buffers passed |
1099 | * For instance, in a DRI client only the render buffers passed |
1095 | * between X and the client are named. And since X returns the |
1100 | * between X and the client are named. And since X returns the |
1096 | * alternating names for the front/back buffer a linear search |
1101 | * alternating names for the front/back buffer a linear search |
1097 | * provides a sufficiently fast match. |
1102 | * provides a sufficiently fast match. |
1098 | */ |
1103 | */ |
- | 1104 | pthread_mutex_lock(&bufmgr_gem->lock); |
|
1099 | for (list = bufmgr_gem->named.next; |
1105 | for (list = bufmgr_gem->named.next; |
1100 | list != &bufmgr_gem->named; |
1106 | list != &bufmgr_gem->named; |
1101 | list = list->next) { |
1107 | list = list->next) { |
1102 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
1108 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
1103 | if (bo_gem->global_name == handle) { |
1109 | if (bo_gem->global_name == handle) { |
1104 | drm_intel_gem_bo_reference(&bo_gem->bo); |
1110 | drm_intel_gem_bo_reference(&bo_gem->bo); |
- | 1111 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
1105 | return &bo_gem->bo; |
1112 | return &bo_gem->bo; |
1106 | } |
1113 | } |
1107 | } |
1114 | } |
Line 1108... | Line 1115... | ||
1108 | 1115 | ||
Line 1112... | Line 1119... | ||
1112 | DRM_IOCTL_GEM_OPEN, |
1119 | DRM_IOCTL_GEM_OPEN, |
1113 | &open_arg); |
1120 | &open_arg); |
1114 | if (ret != 0) { |
1121 | if (ret != 0) { |
1115 | DBG("Couldn't reference %s handle 0x%08x: %s\n", |
1122 | DBG("Couldn't reference %s handle 0x%08x: %s\n", |
1116 | name, handle, strerror(errno)); |
1123 | name, handle, strerror(errno)); |
- | 1124 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
1117 | return NULL; |
1125 | return NULL; |
1118 | } |
1126 | } |
1119 | /* Now see if someone has used a prime handle to get this |
1127 | /* Now see if someone has used a prime handle to get this |
1120 | * object from the kernel before by looking through the list |
1128 | * object from the kernel before by looking through the list |
1121 | * again for a matching gem_handle |
1129 | * again for a matching gem_handle |
Line 1124... | Line 1132... | ||
1124 | list != &bufmgr_gem->named; |
1132 | list != &bufmgr_gem->named; |
1125 | list = list->next) { |
1133 | list = list->next) { |
1126 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
1134 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
1127 | if (bo_gem->gem_handle == open_arg.handle) { |
1135 | if (bo_gem->gem_handle == open_arg.handle) { |
1128 | drm_intel_gem_bo_reference(&bo_gem->bo); |
1136 | drm_intel_gem_bo_reference(&bo_gem->bo); |
- | 1137 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
1129 | return &bo_gem->bo; |
1138 | return &bo_gem->bo; |
1130 | } |
1139 | } |
1131 | } |
1140 | } |
Line 1132... | Line 1141... | ||
1132 | 1141 | ||
1133 | bo_gem = calloc(1, sizeof(*bo_gem)); |
1142 | bo_gem = calloc(1, sizeof(*bo_gem)); |
- | 1143 | if (!bo_gem) { |
|
1134 | if (!bo_gem) |
1144 | pthread_mutex_unlock(&bufmgr_gem->lock); |
- | 1145 | return NULL; |
|
Line 1135... | Line 1146... | ||
1135 | return NULL; |
1146 | } |
1136 | 1147 | ||
1137 | bo_gem->bo.size = open_arg.size; |
1148 | bo_gem->bo.size = open_arg.size; |
1138 | bo_gem->bo.offset = 0; |
1149 | bo_gem->bo.offset = 0; |
Line 1153... | Line 1164... | ||
1153 | ret = drmIoctl(bufmgr_gem->fd, |
1164 | ret = drmIoctl(bufmgr_gem->fd, |
1154 | DRM_IOCTL_I915_GEM_GET_TILING, |
1165 | DRM_IOCTL_I915_GEM_GET_TILING, |
1155 | &get_tiling); |
1166 | &get_tiling); |
1156 | if (ret != 0) { |
1167 | if (ret != 0) { |
1157 | drm_intel_gem_bo_unreference(&bo_gem->bo); |
1168 | drm_intel_gem_bo_unreference(&bo_gem->bo); |
- | 1169 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
1158 | return NULL; |
1170 | return NULL; |
1159 | } |
1171 | } |
1160 | bo_gem->tiling_mode = get_tiling.tiling_mode; |
1172 | bo_gem->tiling_mode = get_tiling.tiling_mode; |
1161 | bo_gem->swizzle_mode = get_tiling.swizzle_mode; |
1173 | bo_gem->swizzle_mode = get_tiling.swizzle_mode; |
1162 | /* XXX stride is unknown */ |
1174 | /* XXX stride is unknown */ |
1163 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0); |
1175 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0); |
Line 1164... | Line 1176... | ||
1164 | 1176 | ||
1165 | DRMINITLISTHEAD(&bo_gem->vma_list); |
1177 | DRMINITLISTHEAD(&bo_gem->vma_list); |
- | 1178 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
|
1166 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
1179 | pthread_mutex_unlock(&bufmgr_gem->lock); |
Line 1167... | Line 1180... | ||
1167 | DBG("bo_create_from_handle: %d (%s)\n", handle, bo_gem->name); |
1180 | DBG("bo_create_from_handle: %d (%s)\n", handle, bo_gem->name); |
1168 | 1181 | ||
Line 1390... | Line 1403... | ||
1390 | (drm_intel_bufmgr_gem *) bo->bufmgr; |
1403 | (drm_intel_bufmgr_gem *) bo->bufmgr; |
1391 | struct timespec time; |
1404 | struct timespec time; |
Line 1392... | Line 1405... | ||
1392 | 1405 | ||
Line 1393... | Line 1406... | ||
1393 | clock_gettime(CLOCK_MONOTONIC, &time); |
1406 | clock_gettime(CLOCK_MONOTONIC, &time); |
Line 1394... | Line 1407... | ||
1394 | 1407 | ||
1395 | // pthread_mutex_lock(&bufmgr_gem->lock); |
1408 | pthread_mutex_lock(&bufmgr_gem->lock); |
1396 | 1409 | ||
1397 | if (atomic_dec_and_test(&bo_gem->refcount)) { |
1410 | if (atomic_dec_and_test(&bo_gem->refcount)) { |
Line 1398... | Line 1411... | ||
1398 | drm_intel_gem_bo_unreference_final(bo, time.tv_sec); |
1411 | drm_intel_gem_bo_unreference_final(bo, time.tv_sec); |
1399 | drm_intel_gem_cleanup_bo_cache(bufmgr_gem, time.tv_sec); |
1412 | drm_intel_gem_cleanup_bo_cache(bufmgr_gem, time.tv_sec); |
1400 | } |
1413 | } |
Line 1401... | Line 1414... | ||
1401 | 1414 | ||
1402 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
1415 | pthread_mutex_unlock(&bufmgr_gem->lock); |
Line 1414... | Line 1427... | ||
1414 | /* Return the same user ptr */ |
1427 | /* Return the same user ptr */ |
1415 | bo->virtual = bo_gem->user_virtual; |
1428 | bo->virtual = bo_gem->user_virtual; |
1416 | return 0; |
1429 | return 0; |
1417 | } |
1430 | } |
Line 1418... | Line 1431... | ||
1418 | 1431 | ||
Line 1419... | Line 1432... | ||
1419 | // pthread_mutex_lock(&bufmgr_gem->lock); |
1432 | pthread_mutex_lock(&bufmgr_gem->lock); |
1420 | 1433 | ||
Line 1421... | Line 1434... | ||
1421 | if (bo_gem->map_count++ == 0) |
1434 | if (bo_gem->map_count++ == 0) |
Line 1438... | Line 1451... | ||
1438 | DBG("%s:%d: Error mapping buffer %d (%s): %s .\n", |
1451 | DBG("%s:%d: Error mapping buffer %d (%s): %s .\n", |
1439 | __FILE__, __LINE__, bo_gem->gem_handle, |
1452 | __FILE__, __LINE__, bo_gem->gem_handle, |
1440 | bo_gem->name, strerror(errno)); |
1453 | bo_gem->name, strerror(errno)); |
1441 | if (--bo_gem->map_count == 0) |
1454 | if (--bo_gem->map_count == 0) |
1442 | drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem); |
1455 | drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem); |
1443 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
1456 | pthread_mutex_unlock(&bufmgr_gem->lock); |
1444 | return ret; |
1457 | return ret; |
1445 | } |
1458 | } |
1446 | VG(VALGRIND_MALLOCLIKE_BLOCK(mmap_arg.addr_ptr, mmap_arg.size, 0, 1)); |
1459 | VG(VALGRIND_MALLOCLIKE_BLOCK(mmap_arg.addr_ptr, mmap_arg.size, 0, 1)); |
1447 | bo_gem->mem_virtual = (void *)(uintptr_t) mmap_arg.addr_ptr; |
1460 | bo_gem->mem_virtual = (void *)(uintptr_t) mmap_arg.addr_ptr; |
1448 | } |
1461 | } |
Line 1469... | Line 1482... | ||
1469 | if (write_enable) |
1482 | if (write_enable) |
1470 | bo_gem->mapped_cpu_write = true; |
1483 | bo_gem->mapped_cpu_write = true; |
Line 1471... | Line 1484... | ||
1471 | 1484 | ||
1472 | drm_intel_gem_bo_mark_mmaps_incoherent(bo); |
1485 | drm_intel_gem_bo_mark_mmaps_incoherent(bo); |
1473 | VG(VALGRIND_MAKE_MEM_DEFINED(bo_gem->mem_virtual, bo->size)); |
1486 | VG(VALGRIND_MAKE_MEM_DEFINED(bo_gem->mem_virtual, bo->size)); |
Line 1474... | Line 1487... | ||
1474 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
1487 | pthread_mutex_unlock(&bufmgr_gem->lock); |
1475 | 1488 | ||
Line 1476... | Line 1489... | ||
1476 | return 0; |
1489 | return 0; |
Line 1543... | Line 1556... | ||
1543 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1556 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1544 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1557 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1545 | struct drm_i915_gem_set_domain set_domain; |
1558 | struct drm_i915_gem_set_domain set_domain; |
1546 | int ret; |
1559 | int ret; |
Line 1547... | Line 1560... | ||
1547 | 1560 | ||
Line 1548... | Line 1561... | ||
1548 | // pthread_mutex_lock(&bufmgr_gem->lock); |
1561 | pthread_mutex_lock(&bufmgr_gem->lock); |
1549 | 1562 | ||
1550 | ret = map_gtt(bo); |
1563 | ret = map_gtt(bo); |
1551 | if (ret) { |
1564 | if (ret) { |
1552 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
1565 | pthread_mutex_unlock(&bufmgr_gem->lock); |
Line 1553... | Line 1566... | ||
1553 | return ret; |
1566 | return ret; |
1554 | } |
1567 | } |
Line 1575... | Line 1588... | ||
1575 | strerror(errno)); |
1588 | strerror(errno)); |
1576 | } |
1589 | } |
Line 1577... | Line 1590... | ||
1577 | 1590 | ||
1578 | drm_intel_gem_bo_mark_mmaps_incoherent(bo); |
1591 | drm_intel_gem_bo_mark_mmaps_incoherent(bo); |
1579 | VG(VALGRIND_MAKE_MEM_DEFINED(bo_gem->gtt_virtual, bo->size)); |
1592 | VG(VALGRIND_MAKE_MEM_DEFINED(bo_gem->gtt_virtual, bo->size)); |
Line 1580... | Line 1593... | ||
1580 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
1593 | pthread_mutex_unlock(&bufmgr_gem->lock); |
1581 | 1594 | ||
Line 1582... | Line 1595... | ||
1582 | return 0; |
1595 | return 0; |
Line 1613... | Line 1626... | ||
1613 | * does reasonable things. |
1626 | * does reasonable things. |
1614 | */ |
1627 | */ |
1615 | if (!bufmgr_gem->has_llc) |
1628 | if (!bufmgr_gem->has_llc) |
1616 | return drm_intel_gem_bo_map_gtt(bo); |
1629 | return drm_intel_gem_bo_map_gtt(bo); |
Line 1617... | Line 1630... | ||
1617 | 1630 | ||
- | 1631 | pthread_mutex_lock(&bufmgr_gem->lock); |
|
1618 | // pthread_mutex_lock(&bufmgr_gem->lock); |
1632 | |
1619 | ret = map_gtt(bo); |
1633 | ret = map_gtt(bo); |
Line 1620... | Line 1634... | ||
1620 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
1634 | pthread_mutex_unlock(&bufmgr_gem->lock); |
1621 | 1635 | ||
Line 1622... | Line 1636... | ||
1622 | return ret; |
1636 | return ret; |
Line 1633... | Line 1647... | ||
1633 | 1647 | ||
1634 | if (bo_gem->is_userptr) |
1648 | if (bo_gem->is_userptr) |
Line 1635... | Line 1649... | ||
1635 | return 0; |
1649 | return 0; |
- | 1650 | ||
1636 | 1651 | bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
|
Line 1637... | Line 1652... | ||
1637 | bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1652 | |
1638 | // pthread_mutex_lock(&bufmgr_gem->lock); |
1653 | pthread_mutex_lock(&bufmgr_gem->lock); |
1639 | 1654 | ||
1640 | if (bo_gem->map_count <= 0) { |
1655 | if (bo_gem->map_count <= 0) { |
1641 | DBG("attempted to unmap an unmapped bo\n"); |
1656 | DBG("attempted to unmap an unmapped bo\n"); |
1642 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
1657 | pthread_mutex_unlock(&bufmgr_gem->lock); |
1643 | /* Preserve the old behaviour of just treating this as a |
1658 | /* Preserve the old behaviour of just treating this as a |
1644 | * no-op rather than reporting the error. |
1659 | * no-op rather than reporting the error. |
Line 1665... | Line 1680... | ||
1665 | if (--bo_gem->map_count == 0) { |
1680 | if (--bo_gem->map_count == 0) { |
1666 | drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem); |
1681 | drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem); |
1667 | drm_intel_gem_bo_mark_mmaps_incoherent(bo); |
1682 | drm_intel_gem_bo_mark_mmaps_incoherent(bo); |
1668 | bo->virtual = NULL; |
1683 | bo->virtual = NULL; |
1669 | } |
1684 | } |
1670 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
1685 | pthread_mutex_unlock(&bufmgr_gem->lock); |
Line 1671... | Line 1686... | ||
1671 | 1686 | ||
1672 | return ret; |
1687 | return ret; |
Line 1673... | Line 1688... | ||
1673 | } |
1688 | } |
Line 1863... | Line 1878... | ||
1863 | { |
1878 | { |
1864 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr; |
1879 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr; |
1865 | struct drm_gem_close close_bo; |
1880 | struct drm_gem_close close_bo; |
1866 | int i, ret; |
1881 | int i, ret; |
Line -... | Line 1882... | ||
- | 1882 | ||
- | 1883 | printf("\nENTER %s\n", __FUNCTION__); |
|
1867 | 1884 | ||
1868 | free(bufmgr_gem->exec2_objects); |
1885 | free(bufmgr_gem->exec2_objects); |
1869 | free(bufmgr_gem->exec_objects); |
1886 | free(bufmgr_gem->exec_objects); |
Line 1870... | Line 1887... | ||
1870 | free(bufmgr_gem->exec_bos); |
1887 | free(bufmgr_gem->exec_bos); |
Line 1871... | Line 1888... | ||
1871 | 1888 | ||
1872 | // pthread_mutex_destroy(&bufmgr_gem->lock); |
1889 | pthread_mutex_destroy(&bufmgr_gem->lock); |
1873 | 1890 | ||
1874 | /* Free any cached buffer objects we were going to reuse */ |
1891 | /* Free any cached buffer objects we were going to reuse */ |
Line 1885... | Line 1902... | ||
1885 | drm_intel_gem_bo_free(&bo_gem->bo); |
1902 | drm_intel_gem_bo_free(&bo_gem->bo); |
1886 | } |
1903 | } |
1887 | } |
1904 | } |
Line 1888... | Line 1905... | ||
1888 | 1905 | ||
- | 1906 | free(bufmgr); |
|
- | 1907 | printf("\nLEAVE %s\n", __FUNCTION__); |
|
1889 | free(bufmgr); |
1908 | |
Line 1890... | Line 1909... | ||
1890 | } |
1909 | } |
1891 | 1910 | ||
1892 | /** |
1911 | /** |
Line 2080... | Line 2099... | ||
2080 | clock_gettime(CLOCK_MONOTONIC, &time); |
2099 | clock_gettime(CLOCK_MONOTONIC, &time); |
Line 2081... | Line 2100... | ||
2081 | 2100 | ||
Line 2082... | Line 2101... | ||
2082 | assert(bo_gem->reloc_count >= start); |
2101 | assert(bo_gem->reloc_count >= start); |
- | 2102 | ||
- | 2103 | /* Unreference the cleared target buffers */ |
|
2083 | 2104 | pthread_mutex_lock(&bufmgr_gem->lock); |
|
2084 | /* Unreference the cleared target buffers */ |
2105 | |
2085 | for (i = start; i < bo_gem->reloc_count; i++) { |
2106 | for (i = start; i < bo_gem->reloc_count; i++) { |
2086 | drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->reloc_target_info[i].bo; |
2107 | drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->reloc_target_info[i].bo; |
2087 | if (&target_bo_gem->bo != bo) { |
2108 | if (&target_bo_gem->bo != bo) { |
Line 2095... | Line 2116... | ||
2095 | for (i = 0; i < bo_gem->softpin_target_count; i++) { |
2116 | for (i = 0; i < bo_gem->softpin_target_count; i++) { |
2096 | drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->softpin_target[i]; |
2117 | drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->softpin_target[i]; |
2097 | drm_intel_gem_bo_unreference_locked_timed(&target_bo_gem->bo, time.tv_sec); |
2118 | drm_intel_gem_bo_unreference_locked_timed(&target_bo_gem->bo, time.tv_sec); |
2098 | } |
2119 | } |
2099 | bo_gem->softpin_target_count = 0; |
2120 | bo_gem->softpin_target_count = 0; |
- | 2121 | ||
- | 2122 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
- | 2123 | ||
2100 | } |
2124 | } |
Line 2101... | Line 2125... | ||
2101 | 2125 | ||
2102 | /** |
2126 | /** |
2103 | * Walk the tree of relocations rooted at BO and accumulate the list of |
2127 | * Walk the tree of relocations rooted at BO and accumulate the list of |
Line 2237... | Line 2261... | ||
2237 | int ret, i; |
2261 | int ret, i; |
Line 2238... | Line 2262... | ||
2238 | 2262 | ||
2239 | if (to_bo_gem(bo)->has_error) |
2263 | if (to_bo_gem(bo)->has_error) |
Line -... | Line 2264... | ||
- | 2264 | return -ENOMEM; |
|
2240 | return -ENOMEM; |
2265 | |
2241 | 2266 | pthread_mutex_lock(&bufmgr_gem->lock); |
|
Line 2242... | Line 2267... | ||
2242 | /* Update indices and set up the validate list. */ |
2267 | /* Update indices and set up the validate list. */ |
2243 | drm_intel_gem_bo_process_reloc(bo); |
2268 | drm_intel_gem_bo_process_reloc(bo); |
Line 2287... | Line 2312... | ||
2287 | /* Disconnect the buffer from the validate list */ |
2312 | /* Disconnect the buffer from the validate list */ |
2288 | bo_gem->validate_index = -1; |
2313 | bo_gem->validate_index = -1; |
2289 | bufmgr_gem->exec_bos[i] = NULL; |
2314 | bufmgr_gem->exec_bos[i] = NULL; |
2290 | } |
2315 | } |
2291 | bufmgr_gem->exec_count = 0; |
2316 | bufmgr_gem->exec_count = 0; |
- | 2317 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
Line 2292... | Line 2318... | ||
2292 | 2318 | ||
2293 | return ret; |
2319 | return ret; |
Line 2294... | Line 2320... | ||
2294 | } |
2320 | } |
Line 2324... | Line 2350... | ||
2324 | case I915_EXEC_RENDER: |
2350 | case I915_EXEC_RENDER: |
2325 | case I915_EXEC_DEFAULT: |
2351 | case I915_EXEC_DEFAULT: |
2326 | break; |
2352 | break; |
2327 | } |
2353 | } |
Line 2328... | Line 2354... | ||
2328 | 2354 | ||
2329 | // pthread_mutex_lock(&bufmgr_gem->lock); |
2355 | pthread_mutex_lock(&bufmgr_gem->lock); |
2330 | /* Update indices and set up the validate list. */ |
2356 | /* Update indices and set up the validate list. */ |
Line 2331... | Line 2357... | ||
2331 | drm_intel_gem_bo_process_reloc2(bo); |
2357 | drm_intel_gem_bo_process_reloc2(bo); |
2332 | 2358 | ||
Line 2383... | Line 2409... | ||
2383 | /* Disconnect the buffer from the validate list */ |
2409 | /* Disconnect the buffer from the validate list */ |
2384 | bo_gem->validate_index = -1; |
2410 | bo_gem->validate_index = -1; |
2385 | bufmgr_gem->exec_bos[i] = NULL; |
2411 | bufmgr_gem->exec_bos[i] = NULL; |
2386 | } |
2412 | } |
2387 | bufmgr_gem->exec_count = 0; |
2413 | bufmgr_gem->exec_count = 0; |
2388 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
2414 | pthread_mutex_unlock(&bufmgr_gem->lock); |
Line 2389... | Line 2415... | ||
2389 | 2415 | ||
2390 | return ret; |
2416 | return ret; |
Line 2391... | Line 2417... | ||
2391 | } |
2417 | } |
Line 2552... | Line 2578... | ||
2552 | uint32_t handle; |
2578 | uint32_t handle; |
2553 | drm_intel_bo_gem *bo_gem; |
2579 | drm_intel_bo_gem *bo_gem; |
2554 | struct drm_i915_gem_get_tiling get_tiling; |
2580 | struct drm_i915_gem_get_tiling get_tiling; |
2555 | drmMMListHead *list; |
2581 | drmMMListHead *list; |
Line -... | Line 2582... | ||
- | 2582 | ||
2556 | 2583 | pthread_mutex_lock(&bufmgr_gem->lock); |
|
2557 | ret = drmPrimeFDToHandle(bufmgr_gem->fd, prime_fd, &handle); |
2584 | ret = drmPrimeFDToHandle(bufmgr_gem->fd, prime_fd, &handle); |
2558 | if (ret) { |
2585 | if (ret) { |
2559 | DBG("create_from_prime: failed to obtain handle from fd: %s\n", strerror(errno)); |
2586 | DBG("create_from_prime: failed to obtain handle from fd: %s\n", strerror(errno)); |
2560 | pthread_mutex_unlock(&bufmgr_gem->lock); |
2587 | pthread_mutex_unlock(&bufmgr_gem->lock); |
Line 2570... | Line 2597... | ||
2570 | list != &bufmgr_gem->named; |
2597 | list != &bufmgr_gem->named; |
2571 | list = list->next) { |
2598 | list = list->next) { |
2572 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
2599 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
2573 | if (bo_gem->gem_handle == handle) { |
2600 | if (bo_gem->gem_handle == handle) { |
2574 | drm_intel_gem_bo_reference(&bo_gem->bo); |
2601 | drm_intel_gem_bo_reference(&bo_gem->bo); |
- | 2602 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
2575 | return &bo_gem->bo; |
2603 | return &bo_gem->bo; |
2576 | } |
2604 | } |
2577 | } |
2605 | } |
Line 2578... | Line 2606... | ||
2578 | 2606 | ||
2579 | bo_gem = calloc(1, sizeof(*bo_gem)); |
2607 | bo_gem = calloc(1, sizeof(*bo_gem)); |
- | 2608 | if (!bo_gem) { |
|
2580 | if (!bo_gem) { |
2609 | pthread_mutex_unlock(&bufmgr_gem->lock); |
2581 | return NULL; |
2610 | return NULL; |
2582 | } |
2611 | } |
2583 | /* Determine size of bo. The fd-to-handle ioctl really should |
2612 | /* Determine size of bo. The fd-to-handle ioctl really should |
2584 | * return the size, but it doesn't. If we have kernel 3.12 or |
2613 | * return the size, but it doesn't. If we have kernel 3.12 or |
Line 2606... | Line 2635... | ||
2606 | bo_gem->reusable = false; |
2635 | bo_gem->reusable = false; |
2607 | bo_gem->use_48b_address_range = false; |
2636 | bo_gem->use_48b_address_range = false; |
Line 2608... | Line 2637... | ||
2608 | 2637 | ||
2609 | DRMINITLISTHEAD(&bo_gem->vma_list); |
2638 | DRMINITLISTHEAD(&bo_gem->vma_list); |
- | 2639 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
|
Line 2610... | Line 2640... | ||
2610 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
2640 | pthread_mutex_unlock(&bufmgr_gem->lock); |
2611 | 2641 | ||
2612 | memclear(get_tiling); |
2642 | memclear(get_tiling); |
2613 | get_tiling.handle = bo_gem->gem_handle; |
2643 | get_tiling.handle = bo_gem->gem_handle; |
Line 2631... | Line 2661... | ||
2631 | drm_intel_bo_gem_export_to_prime(drm_intel_bo *bo, int *prime_fd) |
2661 | drm_intel_bo_gem_export_to_prime(drm_intel_bo *bo, int *prime_fd) |
2632 | { |
2662 | { |
2633 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
2663 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
2634 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
2664 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
Line -... | Line 2665... | ||
- | 2665 | ||
2635 | 2666 | pthread_mutex_lock(&bufmgr_gem->lock); |
|
2636 | if (DRMLISTEMPTY(&bo_gem->name_list)) |
2667 | if (DRMLISTEMPTY(&bo_gem->name_list)) |
- | 2668 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
|
Line 2637... | Line 2669... | ||
2637 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
2669 | pthread_mutex_unlock(&bufmgr_gem->lock); |
2638 | 2670 | ||
2639 | if (drmPrimeHandleToFD(bufmgr_gem->fd, bo_gem->gem_handle, |
2671 | if (drmPrimeHandleToFD(bufmgr_gem->fd, bo_gem->gem_handle, |
Line 2657... | Line 2689... | ||
2657 | struct drm_gem_flink flink; |
2689 | struct drm_gem_flink flink; |
Line 2658... | Line 2690... | ||
2658 | 2690 | ||
2659 | memclear(flink); |
2691 | memclear(flink); |
Line -... | Line 2692... | ||
- | 2692 | flink.handle = bo_gem->gem_handle; |
|
- | 2693 | ||
2660 | flink.handle = bo_gem->gem_handle; |
2694 | pthread_mutex_lock(&bufmgr_gem->lock); |
2661 | 2695 | ||
- | 2696 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink); |
|
2662 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink); |
2697 | if (ret != 0) { |
- | 2698 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
Line 2663... | Line 2699... | ||
2663 | if (ret != 0) |
2699 | return -errno; |
2664 | return -errno; |
2700 | } |
Line 2665... | Line 2701... | ||
2665 | 2701 | ||
2666 | bo_gem->global_name = flink.name; |
2702 | bo_gem->global_name = flink.name; |
2667 | bo_gem->reusable = false; |
- | |
- | 2703 | bo_gem->reusable = false; |
|
2668 | 2704 | ||
Line 2669... | Line 2705... | ||
2669 | if (DRMLISTEMPTY(&bo_gem->name_list)) |
2705 | if (DRMLISTEMPTY(&bo_gem->name_list)) |
2670 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
2706 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
2671 | 2707 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
Line 3173... | Line 3209... | ||
3173 | drm_intel_aub_annotation *annotations, |
3209 | drm_intel_aub_annotation *annotations, |
3174 | unsigned count) |
3210 | unsigned count) |
3175 | { |
3211 | { |
3176 | } |
3212 | } |
Line -... | Line 3213... | ||
- | 3213 | ||
3177 | 3214 | static __gthread_mutex_t bufmgr_list_mutex = {0, -1}; |
|
Line 3178... | Line 3215... | ||
3178 | static drmMMListHead bufmgr_list = { &bufmgr_list, &bufmgr_list }; |
3215 | static drmMMListHead bufmgr_list = { &bufmgr_list, &bufmgr_list }; |
3179 | 3216 | ||
3180 | static drm_intel_bufmgr_gem * |
3217 | static drm_intel_bufmgr_gem * |
Line 3196... | Line 3233... | ||
3196 | drm_intel_bufmgr_gem_unref(drm_intel_bufmgr *bufmgr) |
3233 | drm_intel_bufmgr_gem_unref(drm_intel_bufmgr *bufmgr) |
3197 | { |
3234 | { |
3198 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; |
3235 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; |
Line 3199... | Line 3236... | ||
3199 | 3236 | ||
3200 | if (atomic_add_unless(&bufmgr_gem->refcount, -1, 1)) { |
3237 | if (atomic_add_unless(&bufmgr_gem->refcount, -1, 1)) { |
Line 3201... | Line 3238... | ||
3201 | // pthread_mutex_lock(&bufmgr_list_mutex); |
3238 | pthread_mutex_lock(&bufmgr_list_mutex); |
3202 | 3239 | ||
3203 | if (atomic_dec_and_test(&bufmgr_gem->refcount)) { |
3240 | if (atomic_dec_and_test(&bufmgr_gem->refcount)) { |
3204 | DRMLISTDEL(&bufmgr_gem->managers); |
3241 | DRMLISTDEL(&bufmgr_gem->managers); |
Line 3205... | Line 3242... | ||
3205 | drm_intel_bufmgr_gem_destroy(bufmgr); |
3242 | drm_intel_bufmgr_gem_destroy(bufmgr); |
3206 | } |
3243 | } |
3207 | 3244 | ||
Line 3208... | Line 3245... | ||
3208 | // pthread_mutex_unlock(&bufmgr_list_mutex); |
3245 | pthread_mutex_unlock(&bufmgr_list_mutex); |
3209 | } |
3246 | } |
Line 3222... | Line 3259... | ||
3222 | struct drm_i915_gem_get_aperture aperture; |
3259 | struct drm_i915_gem_get_aperture aperture; |
3223 | drm_i915_getparam_t gp; |
3260 | drm_i915_getparam_t gp; |
3224 | int ret, tmp; |
3261 | int ret, tmp; |
3225 | bool exec2 = false; |
3262 | bool exec2 = false; |
Line -... | Line 3263... | ||
- | 3263 | ||
- | 3264 | if(bufmgr_list_mutex.handle == -1) |
|
- | 3265 | __gthread_mutex_init_function(&bufmgr_gem->lock); |
|
3226 | 3266 | ||
Line 3227... | Line 3267... | ||
3227 | // pthread_mutex_lock(&bufmgr_list_mutex); |
3267 | pthread_mutex_lock(&bufmgr_list_mutex); |
3228 | 3268 | ||
3229 | bufmgr_gem = drm_intel_bufmgr_gem_find(fd); |
3269 | bufmgr_gem = drm_intel_bufmgr_gem_find(fd); |
Line 3235... | Line 3275... | ||
3235 | goto exit; |
3275 | goto exit; |
Line 3236... | Line 3276... | ||
3236 | 3276 | ||
3237 | bufmgr_gem->fd = fd; |
3277 | bufmgr_gem->fd = fd; |
Line 3238... | Line 3278... | ||
3238 | atomic_set(&bufmgr_gem->refcount, 1); |
3278 | atomic_set(&bufmgr_gem->refcount, 1); |
3239 | - | ||
3240 | // if (pthread_mutex_init(&bufmgr_gem->lock, NULL) != 0) { |
- | |
3241 | // free(bufmgr_gem); |
- | |
Line 3242... | Line 3279... | ||
3242 | // return NULL; |
3279 | |
3243 | // } |
3280 | __gthread_mutex_init_function(&bufmgr_gem->lock); |
3244 | 3281 | ||
3245 | memclear(aperture); |
3282 | memclear(aperture); |
Line 3415... | Line 3452... | ||
3415 | bufmgr_gem->vma_max = -1; /* unlimited by default */ |
3452 | bufmgr_gem->vma_max = -1; /* unlimited by default */ |
Line 3416... | Line 3453... | ||
3416 | 3453 | ||
Line 3417... | Line 3454... | ||
3417 | DRMLISTADD(&bufmgr_gem->managers, &bufmgr_list); |
3454 | DRMLISTADD(&bufmgr_gem->managers, &bufmgr_list); |
3418 | 3455 | ||
Line 3419... | Line 3456... | ||
3419 | exit: |
3456 | exit: |
3420 | // pthread_mutex_unlock(&bufmgr_list_mutex); |
3457 | pthread_mutex_unlock(&bufmgr_list_mutex); |
Line 3437... | Line 3474... | ||
3437 | * For instance, in a DRI client only the render buffers passed |
3474 | * For instance, in a DRI client only the render buffers passed |
3438 | * between X and the client are named. And since X returns the |
3475 | * between X and the client are named. And since X returns the |
3439 | * alternating names for the front/back buffer a linear search |
3476 | * alternating names for the front/back buffer a linear search |
3440 | * provides a sufficiently fast match. |
3477 | * provides a sufficiently fast match. |
3441 | */ |
3478 | */ |
- | 3479 | pthread_mutex_lock(&bufmgr_gem->lock); |
|
3442 | for (list = bufmgr_gem->named.next; |
3480 | for (list = bufmgr_gem->named.next; |
3443 | list != &bufmgr_gem->named; |
3481 | list != &bufmgr_gem->named; |
3444 | list = list->next) { |
3482 | list = list->next) { |
3445 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
3483 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); |
3446 | if (bo_gem->gem_handle == handle) { |
3484 | if (bo_gem->gem_handle == handle) { |
- | 3485 | drm_intel_gem_bo_reference(&bo_gem->bo); |
|
- | 3486 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
3447 | return &bo_gem->bo; |
3487 | return &bo_gem->bo; |
3448 | } |
3488 | } |
3449 | } |
3489 | } |
Line 3450... | Line 3490... | ||
3450 | 3490 | ||
Line 3469... | Line 3509... | ||
3469 | ret = drmIoctl(bufmgr_gem->fd, |
3509 | ret = drmIoctl(bufmgr_gem->fd, |
3470 | DRM_IOCTL_I915_GEM_GET_TILING, |
3510 | DRM_IOCTL_I915_GEM_GET_TILING, |
3471 | &get_tiling); |
3511 | &get_tiling); |
3472 | if (ret != 0) { |
3512 | if (ret != 0) { |
3473 | drm_intel_gem_bo_unreference(&bo_gem->bo); |
3513 | drm_intel_gem_bo_unreference(&bo_gem->bo); |
- | 3514 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
3474 | return NULL; |
3515 | return NULL; |
3475 | } |
3516 | } |
3476 | bo_gem->tiling_mode = get_tiling.tiling_mode; |
3517 | bo_gem->tiling_mode = get_tiling.tiling_mode; |
3477 | bo_gem->swizzle_mode = get_tiling.swizzle_mode; |
3518 | bo_gem->swizzle_mode = get_tiling.swizzle_mode; |
3478 | /* XXX stride is unknown */ |
3519 | /* XXX stride is unknown */ |
3479 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0); |
3520 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0); |
Line 3480... | Line 3521... | ||
3480 | 3521 | ||
3481 | DRMINITLISTHEAD(&bo_gem->vma_list); |
3522 | DRMINITLISTHEAD(&bo_gem->vma_list); |
- | 3523 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
|
3482 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
3524 | pthread_mutex_unlock(&bufmgr_gem->lock); |
Line 3483... | Line 3525... | ||
3483 | printf("bo_create_from_handle: %d\n", handle); |
3525 | printf("bo_create_from_gem_handle: %d\n", handle); |
3484 | 3526 |