summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: ac71f08)
raw | patch | inline | side by side (parent: ac71f08)
author | Eric Anholt <eric@anholt.net> | |
Fri, 2 Oct 2009 02:09:26 +0000 (19:09 -0700) | ||
committer | Eric Anholt <eric@anholt.net> | |
Fri, 2 Oct 2009 02:09:26 +0000 (19:09 -0700) |
There are a bunch of places in GL where if we can't do this we have to
flush the batchbuffer, and the cost of lookups here is outweighed by flush
savings.
flush the batchbuffer, and the cost of lookups here is outweighed by flush
savings.
index 219c761620ccd632cb70d01eeee473086da0c519..20e59b86044781ccd3f9b301cf401865ba998452 100644 (file)
return 0;
}
+int
+drm_intel_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo)
+{
+ return bo->bufmgr->bo_references(bo, target_bo);
+}
+
int
drm_intel_get_pipe_from_crtc_id (drm_intel_bufmgr *bufmgr, int crtc_id)
{
index 218b7596785b24c2a3713274af0fd4d855679ccd..cb7196c37e76398607a305b1b67c6bfb91d4c87c 100644 (file)
int drm_intel_bo_busy(drm_intel_bo *bo);
int drm_intel_bo_disable_reuse(drm_intel_bo *bo);
+int drm_intel_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo);
/* drm_intel_bufmgr_gem.c */
drm_intel_bufmgr *drm_intel_bufmgr_gem_init(int fd, int batch_size);
index 78297e05cecffd64b4cab2db68a4e954d3e17be9..d4fa15986863f21c9a2624cb3cceb9c1bb5fb0f7 100644 (file)
if (bo_gem->gtt_virtual == NULL) {
struct drm_i915_gem_mmap_gtt mmap_arg;
- DBG("bo_map_gtt: %d (%s)\n", bo_gem->gem_handle, bo_gem->name);
+ DBG("bo_map_gtt: mmap %d (%s)\n", bo_gem->gem_handle, bo_gem->name);
memset(&mmap_arg, 0, sizeof(mmap_arg));
mmap_arg.handle = bo_gem->gem_handle;
bo->virtual = bo_gem->gtt_virtual;
- DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
+ DBG("bo_map_gtt: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
bo_gem->gtt_virtual);
/* Now move it to the GTT domain so that the CPU caches are flushed */
return 0;
}
+/**
+ * Clear the flag set by drm_intel_gem_bo_get_aperture_space() so we're ready
+ * for the next drm_intel_bufmgr_check_aperture_space() call.
+ */
+static int
+drm_intel_gem_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo)
+{
+ drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
+ int i;
+
+ if (bo == NULL || target_bo == NULL)
+ return 0;
+
+ for (i = 0; i < bo_gem->reloc_count; i++) {
+ if (bo_gem->reloc_target_bo[i] == target_bo)
+ return 1;
+ if (drm_intel_gem_bo_references(bo_gem->reloc_target_bo[i], target_bo))
+ return 1;
+ }
+
+ return 0;
+}
+
/**
* Initializes the GEM buffer manager, which uses the kernel to allocate, map,
* and manage map buffer objections.
bufmgr_gem->bufmgr.check_aperture_space = drm_intel_gem_check_aperture_space;
bufmgr_gem->bufmgr.bo_disable_reuse = drm_intel_gem_bo_disable_reuse;
bufmgr_gem->bufmgr.get_pipe_from_crtc_id = drm_intel_gem_get_pipe_from_crtc_id;
+ bufmgr_gem->bufmgr.bo_references = drm_intel_gem_bo_references;
+
/* Initialize the linked lists for BO reuse cache. */
for (i = 0, size = 4096; i < DRM_INTEL_GEM_BO_BUCKETS; i++, size *= 2) {
DRMINITLISTHEAD(&bufmgr_gem->cache_bucket[i].head);
index af17c12daaee21973e704c880325f5701f305a5c..454d4574d66a5d17577e26b3f214d074a845d372 100644 (file)
*/
int (*get_pipe_from_crtc_id)(drm_intel_bufmgr *bufmgr, int crtc_id);
+ /** Returns true if target_bo is in the relocation tree rooted at bo. */
+ int (*bo_references)(drm_intel_bo *bo, drm_intel_bo *target_bo);
+
int debug; /**< Enables verbose debugging printouts */
};