summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 73d2da6)
raw | patch | inline | side by side (parent: 73d2da6)
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | |
Fri, 8 Apr 2016 19:57:18 +0000 (22:57 +0300) | ||
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | |
Fri, 8 Apr 2016 19:57:18 +0000 (22:57 +0300) |
kmscube/kmscube.cpp | patch | blob | history |
diff --git a/kmscube/kmscube.cpp b/kmscube/kmscube.cpp
index 62c9d977526880b1a9ecaf63671eebf8d7f6dc2f..49592ecc756509934f0d7a66b45c26cf760e7ba5 100644 (file)
--- a/kmscube/kmscube.cpp
+++ b/kmscube/kmscube.cpp
#include <vector>
#include <memory>
#include <algorithm>
#include <vector>
#include <memory>
#include <algorithm>
+#include <poll.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
#include <kms++.h>
#include "test.h"
#include <kms++.h>
#include "test.h"
+#include "opts.h"
using namespace kms;
using namespace std;
using namespace kms;
using namespace std;
struct gbm_bo* bo_next;
};
struct gbm_bo* bo_next;
};
+class NullEglSurface
+{
+public:
+ NullEglSurface(const EglState& egl)
+ : egl(egl)
+ {
+ esurface = eglCreateWindowSurface(egl.display(), egl.config(), 0, NULL);
+ FAIL_IF(esurface == EGL_NO_SURFACE, "failed to create egl surface");
+ }
+
+ ~NullEglSurface()
+ {
+ eglDestroySurface(egl.display(), esurface);
+ }
+
+ void make_current()
+ {
+ eglMakeCurrent(egl.display(), esurface, esurface, egl.context());
+ }
+
+ void swap_buffers()
+ {
+ eglSwapBuffers(egl.display(), esurface);
+ }
+
+private:
+ const EglState& egl;
+
+ EGLSurface esurface;
+};
+
class OutputHandler : private PageFlipHandlerBase
{
public:
class OutputHandler : private PageFlipHandlerBase
{
public:
float m_rotation_mult;
};
float m_rotation_mult;
};
-int main(int argc, char *argv[])
+static void main_gbm()
{
{
- for (int i = 1; i < argc; ++i) {
- if (argv[i] == string("-v"))
- s_verbose = true;
- }
-
Card card;
GbmDevice gdev(card);
Card card;
GbmDevice gdev(card);
for (auto& out : outputs)
out->start_flipping();
for (auto& out : outputs)
out->start_flipping();
- while (!s_need_exit || s_flip_pending) {
- fd_set fds;
- FD_ZERO(&fds);
- if (!s_need_exit)
- FD_SET(0, &fds);
- FD_SET(card.fd(), &fds);
-
- int ret = select(card.fd() + 1, &fds, NULL, NULL, NULL);
+ struct pollfd fds[2] = { 0 };
+ fds[0].fd = 0;
+ fds[0].events = POLLIN;
+ fds[1].fd = card.fd();
+ fds[1].events = POLLIN;
- FAIL_IF(ret < 0, "select error: %d", ret);
- FAIL_IF(ret == 0, "select timeout");
+ while (!s_need_exit || s_flip_pending) {
+ int r = poll(fds, ARRAY_SIZE(fds), -1);
+ FAIL_IF(r < 0, "poll error %d", r);
- if (FD_ISSET(0, &fds))
+ if (fds[0].revents)
s_need_exit = true;
s_need_exit = true;
- if (FD_ISSET(card.fd(), &fds))
+ if (fds[1].revents)
card.call_page_flip_handlers();
}
card.call_page_flip_handlers();
}
+}
+
+static void main_egl()
+{
+ EglState egl(EGL_DEFAULT_DISPLAY);
+ NullEglSurface surface(egl);
+ GlScene scene;
+
+ scene.set_viewport(600, 600);
+
+ int framenum = 0;
+
+ struct pollfd fds[1] = { 0 };
+ fds[0].fd = 0;
+ fds[0].events = POLLIN;
+
+ while (true) {
+ int r = poll(fds, ARRAY_SIZE(fds), 0);
+ ASSERT(r >= 0);
+
+ if (fds[0].revents)
+ break;
+
+ surface.make_current();
+ scene.draw(framenum++);
+ surface.swap_buffers();
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ OptionSet optionset = {
+ Option("v|verbose",
+ [&]()
+ {
+ s_verbose = true;
+ }),
+ };
+
+ optionset.parse(argc, argv);
+
+ int mode;
+
+ if (optionset.params().size() == 0) {
+ mode = 0;
+ } else {
+ const string m = optionset.params().front();
+
+ if (m == "gbm")
+ mode = 0;
+ else if (m == "null")
+ mode = 1;
+ else {
+ printf("Unknown mode %s\n", m.c_str());
+ return -1;
+ }
+ }
+
+ switch (mode) {
+ case 0:
+ main_gbm();
+ break;
+
+ case 1:
+ main_egl();
+ break;
+ }
return 0;
}
return 0;
}