diff --git a/libdrm/intel/intel_bufmgr.h b/libdrm/intel/intel_bufmgr.h index 4d33521..59def00 100644 --- a/libdrm/intel/intel_bufmgr.h +++ b/libdrm/intel/intel_bufmgr.h @@ -126,5 +126,7 @@ int intel_bo_set_tiling(dri_bo *buf, uint32_t *tiling_mode); int intel_bo_flink(dri_bo *buf, uint32_t *name); +int dri_gem_bo_map_gtt(dri_bo *bo); + #endif /* INTEL_BUFMGR_GEM_H */ diff --git a/libdrm/intel/intel_bufmgr_gem.c b/libdrm/intel/intel_bufmgr_gem.c index af20efb..dae2e76 100644 --- a/libdrm/intel/intel_bufmgr_gem.c +++ b/libdrm/intel/intel_bufmgr_gem.c @@ -35,6 +35,7 @@ */ #include +#include #include #include #include @@ -42,6 +43,8 @@ #include #include #include +#include +#include #include "errno.h" #include "dri_bufmgr.h" @@ -370,6 +373,7 @@ intel_bo_gem_create_from_name(dri_bufmgr *bufmgr, const char *name, bo_gem->refcount = 1; bo_gem->validate_index = -1; bo_gem->gem_handle = open_arg.handle; + bo_gem->bo.handle = bo_gem->gem_handle; DBG("bo_create_from_handle: %d (%s)\n", handle, bo_gem->name); @@ -517,6 +521,69 @@ dri_gem_bo_map(dri_bo *bo, int write_enable) return 0; } +int +dri_gem_bo_map_gtt(dri_bo *bo) +{ + dri_bufmgr_gem *bufmgr_gem; + dri_bo_gem *bo_gem = (dri_bo_gem *)bo; + struct drm_i915_gem_set_domain set_domain; + int ret; + int fd; + + bufmgr_gem = (dri_bufmgr_gem *)bo->bufmgr; + + /* Allow recursive mapping. Mesa may recursively map buffers with + * nested display loops. + */ + if (!bo_gem->mapped) { + + assert(bo->virtual == NULL); + + DBG("bo_map_gtt: %d (%s)\n", bo_gem->gem_handle, bo_gem->name); + + if (bo_gem->virtual == NULL) { + fd = open("/sys/devices/pci0000:00/0000:00:02.0/resource2_wc", + O_RDWR); + if (fd == -1) { + fprintf(stderr, "failed to open GTT: %s\n", + strerror(errno)); + return errno; + } + + bo_gem->virtual = mmap(NULL, bo->size, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, bo->offset); + if (bo_gem->virtual == MAP_FAILED) { + fprintf(stderr, "failed to map GTT: %s\n", + strerror(errno)); + return errno; + } + close(fd); + } + bo->virtual = bo_gem->virtual; + bo_gem->swrast = 0; + bo_gem->mapped = 1; + DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name, + bo_gem->virtual); + } + + if (!bo_gem->swrast) { + set_domain.handle = bo_gem->gem_handle; + set_domain.read_domains = I915_GEM_DOMAIN_GTT; + set_domain.write_domain = I915_GEM_DOMAIN_GTT; + do { + ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, + &set_domain); + } while (ret == -1 && errno == EINTR); + if (ret != 0) { + fprintf (stderr, "%s:%d: Error setting swrast %d: %s\n", + __FILE__, __LINE__, bo_gem->gem_handle, strerror (errno)); + } + bo_gem->swrast = 1; + } + + return 0; +} + static int dri_gem_bo_unmap(dri_bo *bo) { @@ -593,7 +660,7 @@ dri_gem_bo_get_subdata (dri_bo *bo, unsigned long offset, return 0; } -static void +void dri_gem_bo_wait_rendering(dri_bo *bo) { dri_bufmgr_gem *bufmgr_gem = (dri_bufmgr_gem *)bo->bufmgr;