return -EINVAL;
}
- if (map_flags & BO_MAP_READ_WRITE) {
+ if (map_flags) {
if (lock_data_[0]) {
+ drv_bo_invalidate(bo_, lock_data_[0]);
vaddr = lock_data_[0]->addr;
} else {
vaddr = drv_bo_map(bo_, 0, 0, drv_bo_get_width(bo_), drv_bo_get_height(bo_),
drmHashInsert(bo->drv->map_table, bo->handles[plane].u32, (void *)data);
success:
+ drv_bo_invalidate(bo, data);
*map_data = data;
offset = drv_bo_get_plane_stride(bo, plane) * y;
offset += drv_stride_from_format(bo->format, x, plane);
return ret;
}
+int drv_bo_invalidate(struct bo *bo, struct map_info *data)
+{
+ int ret = 0;
+ assert(data);
+ assert(data->refcount >= 0);
+
+ if (bo->drv->backend->bo_invalidate)
+ ret = bo->drv->backend->bo_invalidate(bo, data);
+
+ return ret;
+}
+
int drv_bo_flush(struct bo *bo, struct map_info *data)
{
int ret = 0;
int drv_bo_unmap(struct bo *bo, struct map_info *data);
+int drv_bo_invalidate(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);
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, uint32_t map_flags);
int (*bo_unmap)(struct bo *bo, struct map_info *data);
+ int (*bo_invalidate)(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 use_flags);
};