Subversion Repositories Kolibri OS

Rev

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