Subversion Repositories Kolibri OS

Rev

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;