Esempio n. 1
0
void Application::init() {
    GLenum e = glGetError();
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    e = glGetError();

    glDisable(GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);

    m_camera.SetMode(MODELVIEWER);
    //m_camera.SetMode(FREE);
    m_camera.SetPosition(glm::vec3(10000.0f, 10000.0f, 10000.0f));
    m_camera.SetLookAt(glm::vec3(0.0f, 0.0f, 0.0f));
    m_camera.SetClipping(0.01f, 10000000.0f);
    m_camera.SetFOV(60);
    m_camera.SetViewport(0, 0, m_width, m_height);
    m_camera.camera_scale = 0.1f;

    prepare_framebuffer();

    glGenBuffers(1, &m_transformation_buffer);
    glBindBuffer(GL_UNIFORM_BUFFER, m_transformation_buffer);
    glBufferData(GL_UNIFORM_BUFFER, 4 * sizeof(glm::mat4), NULL, GL_DYNAMIC_DRAW);

    glGenBuffers(1, &m_lighting_buffer);
    glBindBuffer(GL_UNIFORM_BUFFER, m_lighting_buffer);
    glBufferData(GL_UNIFORM_BUFFER, 2 * sizeof(glm::vec4), NULL, GL_DYNAMIC_DRAW);

    glGenBuffers(1, &m_general_buffer);
    glBindBuffer(GL_UNIFORM_BUFFER, m_general_buffer);
    glBufferData(GL_UNIFORM_BUFFER, 2 * sizeof(glm::vec4), NULL, GL_DYNAMIC_DRAW);
}
int main(int argc, char *argv[])
{
	static const char opts[] = "chopv";
	static struct option options[] = {
		{ "cursor", 0, 0, 'c' },
		{ "help", 0, 0, 'h' },
		{ "overlay", 0, 0, 'o' },
		{ "primary", 0, 0, 'p' },
		{ "verbose", 0, 0, 'v' },
		{ 0, 0, 0, 0 },
	};
	struct kms_framebuffer *cursor = NULL;
	struct kms_framebuffer *root = NULL;
	struct kms_framebuffer *fb = NULL;
	struct kms_device *device;
	bool use_overlay = false;
	bool use_primary = false;
	struct kms_plane *plane;
	bool use_cursor = false;
	bool verbose = false;
	unsigned int i;
	int opt, idx;
	int fd, err;

	while ((opt = getopt_long(argc, argv, opts, options, &idx)) != -1) {
		switch (opt) {
		case 'c':
			use_cursor = true;
			break;

		case 'h':
			break;

		case 'o':
			use_overlay = true;
			break;

		case 'p':
			use_primary = true;
			break;

		case 'v':
			verbose = true;
			break;

		default:
			printf("unknown option \"%c\"\n", opt);
			return 1;
		}
	}

	if (optind >= argc) {
		fprintf(stderr, "usage: %s [options] DEVICE\n", argv[0]);
		return 1;
	}

	fd = open(argv[optind], O_RDWR);
	if (fd < 0) {
		fprintf(stderr, "open() failed: %m\n");
		return 1;
	}

	err = drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
	if (err < 0) {
		fprintf(stderr, "drmSetClientCap() failed: %d\n", err);
		return 1;
	}

	device = kms_device_open(fd);
	if (!device)
		return 1;

	if (verbose) {
		printf("Screens: %u\n", device->num_screens);

		for (i = 0; i < device->num_screens; i++) {
			struct kms_screen *screen = device->screens[i];
			const char *status = "disconnected";

			if (screen->connected)
				status = "connected";

			printf("  %u: %x\n", i, screen->id);
			printf("    Status: %s\n", status);
			printf("    Name: %s\n", screen->name);
			printf("    Resolution: %ux%u\n", screen->width,
			       screen->height);
		}

		printf("Planes: %u\n", device->num_planes);

		for (i = 0; i < device->num_planes; i++) {
			struct kms_plane *plane = device->planes[i];
			const char *type = NULL;

			switch (plane->type) {
			case DRM_PLANE_TYPE_OVERLAY:
				type = "overlay";
				break;

			case DRM_PLANE_TYPE_PRIMARY:
				type = "primary";
				break;

			case DRM_PLANE_TYPE_CURSOR:
				type = "cursor";
				break;
			}

			printf("  %u: %p\n", i, plane);
			printf("    ID: %x\n", plane->id);
			printf("    CRTC: %x\n", plane->crtc->id);
			printf("    Type: %x (%s)\n", plane->type, type);
		}
	}

	if (use_cursor) {
		unsigned int x, y;
		uint32_t format;

		plane = kms_device_find_plane_by_type(device,
						      DRM_PLANE_TYPE_CURSOR,
						      0);
		if (!plane) {
			fprintf(stderr, "no cursor plane found\n");
			return 1;
		}

		format = choose_format(plane);
		if (!format) {
			fprintf(stderr, "no matching format found\n");
			return 1;
		}

		cursor = kms_framebuffer_create(device, 32, 32, format);
		if (!cursor) {
			fprintf(stderr, "failed to create cursor buffer\n");
			return 1;
		}

		prepare_framebuffer(cursor, false);

		x = (device->screens[0]->width - cursor->width) / 2;
		y = (device->screens[0]->height - cursor->height) / 2;

		kms_plane_set(plane, cursor, x, y);
	}

	if (use_overlay) {
		uint32_t format;

		plane = kms_device_find_plane_by_type(device,
						      DRM_PLANE_TYPE_OVERLAY,
						      0);
		if (!plane) {
			fprintf(stderr, "no overlay plane found\n");
			return 1;
		}

		format = choose_format(plane);
		if (!format) {
			fprintf(stderr, "no matching format found\n");
			return 1;
		}

		fb = kms_framebuffer_create(device, 320, 240, format);
		if (!fb)
			return 1;

		prepare_framebuffer(fb, false);

		kms_plane_set(plane, fb, 0, 0);
	}

	if (use_primary) {
		unsigned int x, y;
		uint32_t format;

		plane = kms_device_find_plane_by_type(device,
						      DRM_PLANE_TYPE_PRIMARY,
						      0);
		if (!plane) {
			fprintf(stderr, "no primary plane found\n");
			return 1;
		}

		format = choose_format(plane);
		if (!format) {
			fprintf(stderr, "no matching format found\n");
			return 1;
		}

		root = kms_framebuffer_create(device, 640, 480, format);
		if (!root)
			return 1;

		prepare_framebuffer(root, true);

		x = (device->screens[0]->width - root->width) / 2;
		y = (device->screens[0]->height - root->height) / 2;

		kms_plane_set(plane, root, x, y);
	}

	while (1) {
		struct timeval timeout = { 1, 0 };
		fd_set fds;

		FD_ZERO(&fds);
		FD_SET(STDIN_FILENO, &fds);

		err = select(STDIN_FILENO + 1, &fds, NULL, NULL, &timeout);
		if (err < 0) {
			fprintf(stderr, "select() failed: %m\n");
			break;
		}

		/* timeout */
		if (err == 0)
			continue;

		if (FD_ISSET(STDIN_FILENO, &fds))
			break;
	}

	if (cursor)
		kms_framebuffer_free(cursor);

	if (root)
		kms_framebuffer_free(root);

	if (fb)
		kms_framebuffer_free(fb);

	kms_device_close(device);
	close(fd);

	return 0;
}