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; }