5 #include <tbm_bufmgr.h>
6 #include <tbm_bufmgr_backend.h>
8 #include "tbm_emulator_log.h"
12 static tbm_bo_handle get_tbm_bo_handle(struct vigs_drm_gem *gem,
15 tbm_bo_handle bo_handle;
18 memset(&bo_handle, 0, sizeof(bo_handle));
21 case TBM_DEVICE_DEFAULT:
23 bo_handle.u32 = gem->handle;
26 ret = vigs_drm_gem_map(gem, 1);
29 bo_handle.ptr = gem->vaddr;
31 TBM_EMULATOR_LOG_ERROR("vigs_drm_gem_map failed: %s",
37 TBM_EMULATOR_LOG_ERROR("TBM_DEVICE_3D not supported");
40 TBM_EMULATOR_LOG_ERROR("TBM_DEVICE_MM not supported");
43 TBM_EMULATOR_LOG_ERROR("%d not supported", device);
50 static void tbm_bufmgr_emulator_deinit(void *priv)
52 struct vigs_drm_device *drm_dev = priv;
54 TBM_EMULATOR_LOG_DEBUG("enter");
56 vigs_drm_device_destroy(drm_dev);
59 static int tbm_bufmgr_emulator_bo_size(tbm_bo bo)
61 struct vigs_drm_surface *sfc;
63 TBM_EMULATOR_LOG_DEBUG("bo = %p", bo);
65 sfc = (struct vigs_drm_surface*)tbm_backend_get_bo_priv(bo);
70 static void *tbm_bufmgr_emulator_bo_alloc(tbm_bo bo, int size, int flags)
72 TBM_EMULATOR_LOG_ERROR("not supported");
76 static void tbm_bufmgr_emulator_bo_free(tbm_bo bo)
78 struct vigs_drm_surface *sfc;
80 TBM_EMULATOR_LOG_DEBUG("bo = %p", bo);
82 sfc = (struct vigs_drm_surface*)tbm_backend_get_bo_priv(bo);
84 vigs_drm_gem_unref(&sfc->gem);
87 static void *tbm_bufmgr_emulator_bo_import(tbm_bo bo, unsigned int key)
89 struct vigs_drm_device *drm_dev;
91 struct vigs_drm_surface *sfc;
93 TBM_EMULATOR_LOG_DEBUG("bo = %p, key = %u", bo, key);
95 drm_dev = (struct vigs_drm_device*)tbm_backend_get_bufmgr_priv(bo);
97 ret = vigs_drm_surface_open(drm_dev, key, &sfc);
100 TBM_EMULATOR_LOG_ERROR("vigs_drm_surface_open failed for key %u: %s",
106 TBM_EMULATOR_LOG_DEBUG("handle = %u", sfc->gem.handle);
111 static unsigned int tbm_bufmgr_emulator_bo_export(tbm_bo bo)
113 struct vigs_drm_surface *sfc;
116 TBM_EMULATOR_LOG_DEBUG("bo = %p", bo);
118 sfc = (struct vigs_drm_surface*)tbm_backend_get_bo_priv(bo);
120 ret = vigs_drm_gem_get_name(&sfc->gem);
123 TBM_EMULATOR_LOG_ERROR("vigs_drm_gem_get_name failed: %s",
128 return sfc->gem.name;
131 static tbm_bo_handle tbm_bufmgr_emulator_bo_get_handle(tbm_bo bo, int device)
133 struct vigs_drm_surface *sfc;
135 TBM_EMULATOR_LOG_DEBUG("bo = %p, device = %d", bo, device);
137 sfc = (struct vigs_drm_surface*)tbm_backend_get_bo_priv(bo);
139 return get_tbm_bo_handle(&sfc->gem, device);
142 static tbm_bo_handle tbm_bufmgr_emulator_bo_map(tbm_bo bo, int device, int opt)
144 struct vigs_drm_surface *sfc;
145 tbm_bo_handle handle;
148 TBM_EMULATOR_LOG_DEBUG("bo = %p, device = %d, opt = %d", bo, device, opt);
150 sfc = (struct vigs_drm_surface*)tbm_backend_get_bo_priv(bo);
152 handle = get_tbm_bo_handle(&sfc->gem, device);
158 if ((opt & TBM_OPTION_READ) != 0) {
159 saf |= VIGS_DRM_SAF_READ;
162 if ((opt & TBM_OPTION_WRITE) != 0) {
163 saf |= VIGS_DRM_SAF_WRITE;
166 vigs_drm_surface_start_access(sfc, saf);
171 static int tbm_bufmgr_emulator_bo_unmap(tbm_bo bo)
173 struct vigs_drm_surface *sfc;
175 TBM_EMULATOR_LOG_DEBUG("bo = %p", bo);
177 sfc = (struct vigs_drm_surface*)tbm_backend_get_bo_priv(bo);
179 vigs_drm_surface_end_access(sfc, 1);
184 static int tbm_bufmgr_emulator_bo_cache_flush(tbm_bo bo, int flags)
186 TBM_EMULATOR_LOG_DEBUG("bo = %p, flags = %d", bo, flags);
190 static int tbm_bufmgr_emulator_bo_get_global_key(tbm_bo bo)
192 struct vigs_drm_surface *sfc;
195 TBM_EMULATOR_LOG_DEBUG("bo = %p", bo);
197 sfc = (struct vigs_drm_surface*)tbm_backend_get_bo_priv(bo);
199 ret = vigs_drm_gem_get_name(&sfc->gem);
202 TBM_EMULATOR_LOG_ERROR("vigs_drm_gem_get_name failed: %s",
207 return sfc->gem.name;
210 MODULEINITPPROTO(tbm_bufmgr_emulator_init);
212 static TBMModuleVersionInfo EmulatorVersRec =
219 TBMModuleData tbmModuleData = { &EmulatorVersRec, tbm_bufmgr_emulator_init };
221 int tbm_bufmgr_emulator_init(tbm_bufmgr bufmgr, int fd)
224 struct vigs_drm_device *drm_dev = NULL;
225 tbm_bufmgr_backend backend = NULL;
227 TBM_EMULATOR_LOG_DEBUG("enter");
233 ret = vigs_drm_device_create(fd, &drm_dev);
236 TBM_EMULATOR_LOG_ERROR("vigs_drm_device_create failed: %s", strerror(-ret));
240 backend = tbm_backend_alloc();
243 TBM_EMULATOR_LOG_ERROR("tbm_backend_alloc failed");
248 backend->priv = (void*)drm_dev;
249 backend->bufmgr_deinit = tbm_bufmgr_emulator_deinit;
250 backend->bo_size = tbm_bufmgr_emulator_bo_size;
251 backend->bo_alloc = tbm_bufmgr_emulator_bo_alloc;
252 backend->bo_free = tbm_bufmgr_emulator_bo_free;
253 backend->bo_import = tbm_bufmgr_emulator_bo_import;
254 backend->bo_export = tbm_bufmgr_emulator_bo_export;
255 backend->bo_get_handle = tbm_bufmgr_emulator_bo_get_handle;
256 backend->bo_map = tbm_bufmgr_emulator_bo_map;
257 backend->bo_unmap = tbm_bufmgr_emulator_bo_unmap;
258 backend->bo_cache_flush = tbm_bufmgr_emulator_bo_cache_flush;
259 backend->bo_get_global_key = tbm_bufmgr_emulator_bo_get_global_key;
260 backend->bo_lock = NULL;
261 backend->bo_unlock = NULL;
263 if (!tbm_backend_init(bufmgr, backend)) {
264 TBM_EMULATOR_LOG_ERROR("tbm_backend_init failed");
268 TBM_EMULATOR_LOG_INFO("initialized");
274 tbm_backend_free(backend);
278 vigs_drm_device_destroy(drm_dev);