As an optimization, we would like to separate buffer flush/writeback
and unmap. This patch adds the appropriate entry point in our
internal driver API. Overall, the proposed flow is:
- drv_bo_map(..) creates a mapping and associated metadata
- drv_bo_flush(..) writes memory from any cache or temporary
buffer back to memory
- drv_bo_unmap(..) flushes, and frees the mapping and
associated metadata.
The drv_bo_flush function just does some sanity checks on
the map data at this point, but otherwise is a no-op.
BUG=chromium:764871
TEST=gbmtest, mmap_test -g on eve
Change-Id: If306f066a76bc5e0943c1170e2d6933fa5630eff
Reviewed-on: https://chromium-review.googlesource.com/668218
Commit-Ready: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
int drv_bo_unmap(struct bo *bo, struct map_info *data)
{
int drv_bo_unmap(struct bo *bo, struct map_info *data)
{
- int ret = 0;
-
- assert(data);
- assert(data->refcount >= 0);
+ int ret = drv_bo_flush(bo, data);
+ if (ret)
+ return ret;
pthread_mutex_lock(&bo->drv->driver_lock);
pthread_mutex_lock(&bo->drv->driver_lock);
+int drv_bo_flush(struct bo *bo, struct map_info *data)
+{
+ int ret = 0;
+ assert(data);
+ assert(data->refcount >= 0);
+
+ if (bo->drv->backend->bo_flush)
+ ret = bo->drv->backend->bo_flush(bo, data);
+
+ return ret;
+}
+
uint32_t drv_bo_get_width(struct bo *bo)
{
return bo->width;
uint32_t drv_bo_get_width(struct bo *bo)
{
return bo->width;
void *drv_bo_map(struct bo *bo, uint32_t x, uint32_t y, uint32_t width, uint32_t height,
uint32_t flags, struct map_info **map_data, size_t plane);
void *drv_bo_map(struct bo *bo, uint32_t x, uint32_t y, uint32_t width, uint32_t height,
uint32_t flags, struct map_info **map_data, size_t plane);
-int drv_bo_unmap(struct bo *bo, struct map_info *map_data);
+int drv_bo_unmap(struct bo *bo, struct map_info *data);
+
+int drv_bo_flush(struct bo *bo, struct map_info *data);
uint32_t drv_bo_get_width(struct bo *bo);
uint32_t drv_bo_get_width(struct bo *bo);
int (*bo_import)(struct bo *bo, struct drv_import_fd_data *data);
void *(*bo_map)(struct bo *bo, struct map_info *data, size_t plane, int prot);
int (*bo_unmap)(struct bo *bo, struct map_info *data);
int (*bo_import)(struct bo *bo, struct drv_import_fd_data *data);
void *(*bo_map)(struct bo *bo, struct map_info *data, size_t plane, int prot);
int (*bo_unmap)(struct bo *bo, struct map_info *data);
+ int (*bo_flush)(struct bo *bo, struct map_info *data);
uint32_t (*resolve_format)(uint32_t format, uint64_t usage);
};
uint32_t (*resolve_format)(uint32_t format, uint64_t usage);
};