aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/modedemo/demo.c345
1 files changed, 261 insertions, 84 deletions
diff --git a/tests/modedemo/demo.c b/tests/modedemo/demo.c
index b399aec1..de31e7a6 100644
--- a/tests/modedemo/demo.c
+++ b/tests/modedemo/demo.c
@@ -14,6 +14,60 @@
/* Pitch needs to be power of two */
#define PITCH 2048
+/* old functions to be replaced */
+drmModeFBPtr createFB(int fd, drmModeResPtr res);
+void testCursor(int fd, uint32_t crtc);
+void prettyColors(int fd, unsigned int handle);
+void prettyCursor(int fd, unsigned int handle);
+
+/* structs for the demo_driver */
+
+struct demo_driver;
+
+struct demo_screen
+{
+ /* drm stuff */
+ drmBO buffer;
+ drmModeFBPtr fb;
+ drmModeCrtcPtr crtc;
+ drmModeOutputPtr output;
+
+ struct drm_mode_modeinfo *mode;
+
+ /* virtual buffer */
+ uint32_t virt_x;
+ uint32_t virt_y;
+ uint32_t pitch;
+
+ /* parent */
+ struct demo_driver *driver;
+};
+
+#define DEMO_MAX_SCREENS 4
+#define MAX_FIND_OUTPUTS 8
+
+struct demo_driver
+{
+ /* drm stuff */
+ int fd;
+ drmModeResPtr res;
+
+ /* screens */
+ size_t numScreens;
+ struct demo_screen screens[DEMO_MAX_SCREENS];
+};
+
+struct demo_driver* demoCreateDriver(const char *name);
+void demoUpdateRes(struct demo_driver *driver);
+int demoCreateScreens(struct demo_driver *driver);
+void demoTakeDownScreen(struct demo_screen *screen);
+int demoFindConnectedOutputs(struct demo_driver *driver, drmModeOutputPtr *out, size_t max_out);
+drmModeCrtcPtr demoFindFreeCrtc(struct demo_driver *driver, drmModeOutputPtr output);
+void demoPanScreen(struct demo_screen *screen, uint16_t x, uint16_t y);
+/* yet to be implemented */
+void demoMouseActivate(struct demo_screen *screen);
+void demoMouseMove(struct demo_screen *screen, uint16_t x, uint16_t y);
+
static struct drm_mode_modeinfo mode = {
.name = "Test mode",
.clock = 25200,
@@ -31,87 +85,232 @@ static struct drm_mode_modeinfo mode = {
.flags = 10,
};
-drmModeFBPtr createFB(int fd, drmModeResPtr res);
-int findConnectedOutputs(int fd, drmModeResPtr res, drmModeOutputPtr *out);
-drmModeCrtcPtr findFreeCrtc(int fd, drmModeResPtr res);
-void testCursor(int fd, uint32_t crtc);
-void prettyColors(int fd, unsigned int handle);
-void prettyCursor(int fd, unsigned int handle);
-
int main(int argc, char **argv)
{
- int fd;
- const char *driver = "i915"; /* hardcoded for now */
- drmModeResPtr res;
- drmModeFBPtr framebuffer;
- int numOutputs;
- drmModeOutputPtr out[8];
- drmModeCrtcPtr crtc;
+ const char *driver_name = "i915"; /* hardcoded for now */
+ struct demo_driver *driver;
+ int num;
+ int i;
- printf("Starting test\n");
+ printf("starting demo\n");
- fd = drmOpen(driver, NULL);
+ driver = demoCreateDriver(driver_name);
- if (fd < 0) {
- printf("Failed to open the card fb\n");
+ if (!driver) {
+ printf("failed to create driver\n");
return 1;
}
- res = drmModeGetResources(fd);
- if (res == 0) {
- printf("Failed to get resources from card\n");
- drmClose(fd);
+ num = demoCreateScreens(driver);
+ if (num < 1) {
+ printf("no screens attached or an error occured\n");
return 1;
}
+ printf("created %i screens\n", num);
- framebuffer = createFB(fd, res);
- if (framebuffer == NULL) {
- printf("Failed to create framebuffer\n");
- return 1;
+ for (i = 0; i < num; i++) {
+ prettyColors(driver->fd, driver->screens[i].fb->handle);
}
+ sleep(1);
- numOutputs = findConnectedOutputs(fd, res, out);
- if (numOutputs < 1) {
- printf("Failed to find connected outputs\n");
- return 1;
+ for (i = 0; i < num; i++) {
+ printf("%i: 100 0\n", i);
+ demoPanScreen(&driver->screens[i], 100, 0);
+ sleep(1);
+
+ printf("%i: 0 100\n", i);
+ demoPanScreen(&driver->screens[i], 0, 100);
+ sleep(1);
+
+ printf("%i: 100 100\n", i);
+ demoPanScreen(&driver->screens[i], 100, 100);
+ sleep(1);
+
+ printf("%i: 0 0\n", i);
+ demoPanScreen(&driver->screens[i], 0, 1);
+ sleep(1);
+ testCursor(driver->fd, driver->screens[i].crtc->crtc_id);
}
- crtc = findFreeCrtc(fd, res);
- if (numOutputs < 1) {
- printf("Couldn't find a free crtc\n");
- return 1;
+ sleep(2);
+ printf("ok\n");
+ return 0;
+}
+
+int demoCreateScreens(struct demo_driver *driver)
+{
+ drmModeOutputPtr out[MAX_FIND_OUTPUTS];
+ int num;
+ int num_screens = 0;
+ struct demo_screen *screen;
+ int ret = 0;
+ int i;
+
+ num = demoFindConnectedOutputs(driver, out, MAX_FIND_OUTPUTS);
+ if (num < 0)
+ return 0;
+
+ printf("found %i connected outputs\n", num);
+
+ for (i = 0; i < num; i++) {
+ screen = &driver->screens[i];
+
+ screen->crtc = demoFindFreeCrtc(driver, out[i]);
+ if (!screen->crtc) {
+ printf("found no free crtc for output\n");
+ drmModeFreeOutput(out[i]);
+ continue;
+ }
+
+ screen->fb = createFB(driver->fd, driver->res);
+ if (!screen->fb) {
+ drmModeFreeOutput(out[i]);
+ drmModeFreeCrtc(screen->crtc);
+ screen->crtc = 0;
+ printf("could not create framebuffer\n");
+ continue;
+ }
+
+ screen->virt_x = SIZE_X;
+ screen->virt_y = SIZE_Y;
+ screen->pitch = PITCH;
+
+ screen->output = out[i];
+ screen->mode = &mode;
+ screen->driver = driver;
+
+ ret = drmModeSetCrtc(
+ driver->fd,
+ screen->crtc->crtc_id,
+ screen->fb->buffer_id,
+ 0, 0,
+ &screen->output->output_id, 1,
+ screen->mode);
+
+ if (ret) {
+ printf("failed to set mode\n");
+ demoTakeDownScreen(screen);
+ } else {
+ num_screens++;
+ }
+
+ demoUpdateRes(driver);
}
- prettyColors(fd, framebuffer->handle);
+ return num_screens;
+}
- printf("0 0\n");
- drmModeSetCrtc(fd, crtc->crtc_id, framebuffer->buffer_id, 0, 0, &out[0]->output_id, 1, &mode);
- sleep(2);
+void demoTakeDownScreen(struct demo_screen *screen)
+{
+ /* TODO Unrefence the BO */
+ /* TODO Destroy FB */
+ /* TODO take down the mode */
- printf("0 100\n");
- drmModeSetCrtc(fd, crtc->crtc_id, framebuffer->buffer_id, 0, 100, &out[0]->output_id, 1, &mode);
- sleep(2);
+ drmModeFreeOutput(screen->output);
+ drmModeFreeCrtc(screen->crtc);
+}
- printf("100 0\n");
- drmModeSetCrtc(fd, crtc->crtc_id, framebuffer->buffer_id, 100, 0, &out[0]->output_id, 1, &mode);
- sleep(2);
+drmModeCrtcPtr demoFindFreeCrtc(struct demo_driver *driver, drmModeOutputPtr output)
+{
+ drmModeCrtcPtr crtc;
+ int i, j, used = 0;
+ drmModeResPtr res = driver->res;
- printf("100 100\n");
- drmModeSetCrtc(fd, crtc->crtc_id, framebuffer->buffer_id, 100, 100, &out[0]->output_id, 1, &mode);
- sleep(2);
- printf("0 0\n");
- drmModeSetCrtc(fd, crtc->crtc_id, framebuffer->buffer_id, 1, 1, &out[0]->output_id, 1, &mode);
+ for (i = 0; i < res->count_crtcs; i++) {
+ used = 0;
+ for (j = 0; j < DEMO_MAX_SCREENS; j++) {
+ crtc = driver->screens[j].crtc;
- testCursor(fd, crtc->crtc_id);
+ if (crtc && crtc->crtc_id == res->crtcs[i])
+ used = 1;
+ }
- /* turn the crtc off just in case */
- drmModeSetCrtc(fd, crtc->crtc_id, 0, 0, 0, 0, 0, 0);
+ if (!used) {
+ crtc = drmModeGetCrtc(driver->fd, res->crtcs[i]);
+ break;
+ } else {
+ crtc = 0;
+ }
+ }
- drmModeFreeResources(res);
- printf("Ok\n");
+ return crtc;
+}
- return 0;
+struct demo_driver* demoCreateDriver(const char *name)
+{
+ struct demo_driver* driver = malloc(sizeof(struct demo_driver));
+
+ memset(driver, 0, sizeof(struct demo_driver));
+
+ driver->fd = drmOpen(name, NULL);
+
+ if (driver->fd < 0) {
+ printf("Failed to open the card fb\n");
+ goto err_driver;
+ }
+
+ demoUpdateRes(driver);
+ if (!driver->res) {
+ printf("could not retrive resources\n");
+ goto err_res;
+ }
+
+ return driver;
+
+err_res:
+ drmClose(driver->fd);
+err_driver:
+ free(driver);
+ return NULL;
+}
+
+void demoUpdateRes(struct demo_driver *driver)
+{
+ if (driver->res)
+ drmModeFreeResources(driver->res);
+
+ driver->res = drmModeGetResources(driver->fd);
+
+ if (!driver->res)
+ printf("failed to get resources from kernel\n");
+}
+
+int demoFindConnectedOutputs(struct demo_driver *driver, drmModeOutputPtr *out, size_t max_out)
+{
+ int count = 0;
+ int i;
+ int fd = driver->fd;
+ drmModeResPtr res = driver->res;
+
+ drmModeOutputPtr output;
+
+ for (i = 0; i < res->count_outputs && count < max_out; i++) {
+ output = drmModeGetOutput(fd, res->outputs[i]);
+
+ if (!output)
+ continue;
+
+ if (output->connection != DRM_MODE_CONNECTED) {
+ drmModeFreeOutput(output);
+ continue;
+ }
+
+ out[count++] = output;
+ }
+
+ return count;
+}
+
+void demoPanScreen(struct demo_screen *screen, uint16_t x, uint16_t y)
+{
+ drmModeSetCrtc(
+ screen->driver->fd,
+ screen->crtc->crtc_id,
+ screen->fb->buffer_id,
+ x, y,
+ &screen->output->output_id, 1,
+ screen->mode);
}
drmModeFBPtr createFB(int fd, drmModeResPtr res)
@@ -147,33 +346,7 @@ drmModeFBPtr createFB(int fd, drmModeResPtr res)
err_bo:
drmBOUnreference(fd, &bo);
err:
- printf("Something went wrong when creating a fb, using one of the predefined ones\n");
-
- return drmModeGetFB(fd, res->fbs[0]);
-}
-
-int findConnectedOutputs(int fd, drmModeResPtr res, drmModeOutputPtr *out)
-{
- int count = 0;
- int i;
-
- drmModeOutputPtr output;
-
- for (i = 0; i < res->count_outputs; i++) {
- output = drmModeGetOutput(fd, res->outputs[i]);
-
- if (!output || output->connection != DRM_MODE_CONNECTED)
- continue;
-
- out[count++] = output;
- }
-
- return count;
-}
-
-drmModeCrtcPtr findFreeCrtc(int fd, drmModeResPtr res)
-{
- return drmModeGetCrtc(fd, res->crtcs[1]);
+ return 0;
}
void draw(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int v, unsigned int *ptr)
@@ -225,10 +398,14 @@ void testCursor(int fd, uint32_t crtc)
drmModeSetCursor(fd, crtc, &bo, 64, 64);
printf("move cursor 0, 0\n");
drmModeMoveCursor(fd, crtc, 0, 0);
- sleep(2);
+ sleep(1);
printf("move cursor 40, 40\n");
drmModeMoveCursor(fd, crtc, 40, 40);
- sleep(2);
+ sleep(1);
+ printf("move cursor 100, 100\n");
+ drmModeMoveCursor(fd, crtc, 100, 100);
+ sleep(1);
+ drmModeSetCursor(fd, crtc, NULL, 0, 0);
}
void prettyCursor(int fd, unsigned int handle)