static void * i915_drm_buffer_map(struct i915_winsys *iws, struct i915_winsys_buffer *buffer, boolean write) { struct i915_drm_buffer *buf = i915_drm_buffer(buffer); drm_intel_bo *bo = intel_bo(buffer); int ret = 0; assert(bo); if (buf->map_count) goto out; ret = drm_intel_gem_bo_map_gtt(bo); buf->ptr = bo->virtual; assert(ret == 0); out: if (ret) return NULL; buf->map_count++; return buf->ptr; }
static void intel_be_batch_reloc(struct i915_winsys *sws, struct pipe_buffer *buf, unsigned access_flags, unsigned delta) { struct intel_be_context *intel = intel_be_context(sws); drm_intel_bo *bo = intel_bo(buf); int ret; uint32_t read = 0; uint32_t write = 0; if (access_flags & I915_BUFFER_ACCESS_WRITE) { write = I915_GEM_DOMAIN_RENDER; read = I915_GEM_DOMAIN_RENDER; } if (access_flags & I915_BUFFER_ACCESS_READ) { read |= I915_GEM_DOMAIN_VERTEX; } ret = intel_be_offset_relocation(intel->batch, delta, bo, read, write); assert(ret == 0); /* TODO change return type */ /* return ret; */ }
static void i915_drm_buffer_unmap(struct i915_winsys *iws, struct i915_winsys_buffer *buffer) { struct i915_drm_buffer *buf = i915_drm_buffer(buffer); if (--buf->map_count) return; drm_intel_gem_bo_unmap_gtt(intel_bo(buffer)); }
static void i915_drm_buffer_destroy(struct i915_winsys *iws, struct i915_winsys_buffer *buffer) { drm_intel_bo_unreference(intel_bo(buffer)); #ifdef DEBUG i915_drm_buffer(buffer)->magic = 0; i915_drm_buffer(buffer)->bo = NULL; #endif FREE(buffer); }