示例#1
0
static struct fd_device * fd_device_new_impl(int fd)
{
	struct fd_device *dev;
	drmVersionPtr version;

	/* figure out if we are kgsl or msm drm driver: */
	version = drmGetVersion(fd);
	if (!version) {
		ERROR_MSG("cannot get version: %s", strerror(errno));
		return NULL;
	}

	if (!strcmp(version->name, "kgsl")) {
		DEBUG_MSG("kgsl DRM device");
		dev = kgsl_device_new(fd);
	} else if (!strcmp(version->name, "msm")) {
		DEBUG_MSG("msm DRM device");
		dev = msm_device_new(fd);
	} else {
		ERROR_MSG("unknown device: %s", version->name);
		dev = NULL;
	}

	if (!dev)
		return NULL;

	atomic_set(&dev->refcnt, 1);
	dev->fd = fd;
	dev->handle_table = drmHashCreate();
	dev->name_table = drmHashCreate();
	init_cache_buckets(dev);

	return dev;
}
struct fd_device * fd_device_new(int fd)
{
	struct fd_device *dev;
	drmVersionPtr version;

	/* figure out if we are kgsl or msm drm driver: */
	version = drmGetVersion(fd);
	if (!version) {
		ERROR_MSG("cannot get version: %s", strerror(errno));
		return NULL;
	}

	if (!strcmp(version->name, "msm")) {
		DEBUG_MSG("msm DRM device");
		if (version->version_major != 1) {
			ERROR_MSG("unsupported version: %u.%u.%u", version->version_major,
				version->version_minor, version->version_patchlevel);
			dev = NULL;
			goto out;
		}

		dev = msm_device_new(fd);
		dev->version = version->version_minor;
#if HAVE_FREEDRENO_KGSL
	} else if (!strcmp(version->name, "kgsl")) {
		DEBUG_MSG("kgsl DRM device");
		dev = kgsl_device_new(fd);
#endif
	} else {
		ERROR_MSG("unknown device: %s", version->name);
		dev = NULL;
	}

out:
	drmFreeVersion(version);

	if (!dev)
		return NULL;

	p_atomic_set(&dev->refcnt, 1);
	dev->fd = fd;
	dev->handle_table = _mesa_hash_table_create(NULL, u32_hash, u32_equals);
	dev->name_table = _mesa_hash_table_create(NULL, u32_hash, u32_equals);
	fd_bo_cache_init(&dev->bo_cache, FALSE);
	fd_bo_cache_init(&dev->ring_cache, TRUE);

	return dev;
}