aboutsummaryrefslogtreecommitdiff
path: root/cube/cube.c
diff options
context:
space:
mode:
authorNicolas Caramelli <caramelli.devel@gmail.com>2020-07-13 17:22:09 +0200
committerjeremyk-lunarg <jeremyk@lunarg.com>2020-08-07 11:59:36 -0600
commitc8be8c840153dfc736099c10d67abf880722f9e1 (patch)
tree4d24efcdd1b6d2cc95ebf602468971799385e287 /cube/cube.c
parenta1c21580f50b9d6ead9e5f04b8b8fdc378f49087 (diff)
downloadusermoji-c8be8c840153dfc736099c10d67abf880722f9e1.tar.xz
Add support for VK_EXT_directfb_surface extension
Diffstat (limited to 'cube/cube.c')
-rw-r--r--cube/cube.c108
1 files changed, 108 insertions, 0 deletions
diff --git a/cube/cube.c b/cube/cube.c
index 71ad5a40..857056e3 100644
--- a/cube/cube.c
+++ b/cube/cube.c
@@ -327,6 +327,10 @@ struct demo {
struct wl_seat *seat;
struct wl_pointer *pointer;
struct wl_keyboard *keyboard;
+#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT)
+ IDirectFB *dfb;
+ IDirectFBSurface *window;
+ IDirectFBEventBuffer *event_buffer;
#elif defined(VK_USE_PLATFORM_ANDROID_KHR)
struct ANativeWindow *window;
#elif defined(VK_USE_PLATFORM_METAL_EXT)
@@ -2367,6 +2371,10 @@ static void demo_cleanup(struct demo *demo) {
wl_compositor_destroy(demo->compositor);
wl_registry_destroy(demo->registry);
wl_display_disconnect(demo->display);
+#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT)
+ demo->event_buffer->Release(demo->event_buffer);
+ demo->window->Release(demo->window);
+ demo->dfb->Release(demo->dfb);
#endif
vkDestroyInstance(demo->inst, NULL);
@@ -2769,6 +2777,82 @@ static void demo_create_window(struct demo *demo) {
wl_shell_surface_set_toplevel(demo->shell_surface);
wl_shell_surface_set_title(demo->shell_surface, APP_SHORT_NAME);
}
+#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT)
+static void demo_create_directfb_window(struct demo *demo) {
+ DFBResult ret;
+
+ ret = DirectFBInit(NULL, NULL);
+ if (ret) {
+ printf("DirectFBInit failed to initialize DirectFB!\n");
+ fflush(stdout);
+ exit(1);
+ }
+
+ ret = DirectFBCreate(&demo->dfb);
+ if (ret) {
+ printf("DirectFBCreate failed to create main interface of DirectFB!\n");
+ fflush(stdout);
+ exit(1);
+ }
+
+ DFBSurfaceDescription desc;
+ desc.flags = DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT;
+ desc.caps = DSCAPS_PRIMARY;
+ desc.width = demo->width;
+ desc.height = demo->height;
+ ret = demo->dfb->CreateSurface(demo->dfb, &desc, &demo->window);
+ if (ret) {
+ printf("CreateSurface failed to create DirectFB surface interface!\n");
+ fflush(stdout);
+ exit(1);
+ }
+
+ ret = demo->dfb->CreateInputEventBuffer(demo->dfb, DICAPS_KEYS, DFB_FALSE, &demo->event_buffer);
+ if (ret) {
+ printf("CreateInputEventBuffer failed to create DirectFB event buffer interface!\n");
+ fflush(stdout);
+ exit(1);
+ }
+}
+
+static void demo_handle_directfb_event(struct demo *demo, const DFBInputEvent *event) {
+ if (event->type != DIET_KEYPRESS) return;
+ switch (event->key_symbol) {
+ case DIKS_ESCAPE: // Escape
+ demo->quit = true;
+ break;
+ case DIKS_CURSOR_LEFT: // left arrow key
+ demo->spin_angle -= demo->spin_increment;
+ break;
+ case DIKS_CURSOR_RIGHT: // right arrow key
+ demo->spin_angle += demo->spin_increment;
+ break;
+ case DIKS_SPACE: // space bar
+ demo->pause = !demo->pause;
+ break;
+ default:
+ break;
+ }
+}
+
+static void demo_run_directfb(struct demo *demo) {
+ while (!demo->quit) {
+ DFBInputEvent event;
+
+ if (demo->pause) {
+ demo->event_buffer->WaitForEvent(demo->event_buffer);
+ if (!demo->event_buffer->GetEvent(demo->event_buffer, DFB_EVENT(&event)))
+ demo_handle_directfb_event(demo, &event);
+ } else {
+ if (!demo->event_buffer->GetEvent(demo->event_buffer, DFB_EVENT(&event)))
+ demo_handle_directfb_event(demo, &event);
+
+ demo_draw(demo);
+ demo->curFrame++;
+ if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) demo->quit = true;
+ }
+ }
+}
#elif defined(VK_USE_PLATFORM_ANDROID_KHR)
static void demo_run(struct demo *demo) {
if (!demo->prepared) return;
@@ -3031,6 +3115,11 @@ static void demo_init_vk(struct demo *demo) {
platformSurfaceExtFound = 1;
demo->extension_names[demo->enabled_extension_count++] = VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME;
}
+#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT)
+ if (!strcmp(VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME, instance_extensions[i].extensionName)) {
+ platformSurfaceExtFound = 1;
+ demo->extension_names[demo->enabled_extension_count++] = VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME;
+ }
#elif defined(VK_USE_PLATFORM_DISPLAY_KHR)
if (!strcmp(VK_KHR_DISPLAY_EXTENSION_NAME, instance_extensions[i].extensionName)) {
platformSurfaceExtFound = 1;
@@ -3108,6 +3197,12 @@ static void demo_init_vk(struct demo *demo) {
"Do you have a compatible Vulkan installable client driver (ICD) installed?\n"
"Please look at the Getting Started guide for additional information.\n",
"vkCreateInstance Failure");
+#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT)
+ ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find the " VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME
+ " extension.\n\n"
+ "Do you have a compatible Vulkan installable client driver (ICD) installed?\n"
+ "Please look at the Getting Started guide for additional information.\n",
+ "vkCreateInstance Failure");
#endif
}
const VkApplicationInfo app = {
@@ -3405,6 +3500,15 @@ static void demo_create_surface(struct demo *demo) {
createInfo.window = demo->xcb_window;
err = vkCreateXcbSurfaceKHR(demo->inst, &createInfo, NULL, &demo->surface);
+#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT)
+ VkDirectFBSurfaceCreateInfoEXT createInfo;
+ createInfo.sType = VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT;
+ createInfo.pNext = NULL;
+ createInfo.flags = 0;
+ createInfo.dfb = demo->dfb;
+ createInfo.surface = demo->window;
+
+ err = vkCreateDirectFBSurfaceEXT(demo->inst, &createInfo, NULL, &demo->surface);
#elif defined(VK_USE_PLATFORM_DISPLAY_KHR)
err = demo_create_display_surface(demo);
#elif defined(VK_USE_PLATFORM_METAL_EXT)
@@ -4014,6 +4118,8 @@ int main(int argc, char **argv) {
demo_create_xlib_window(&demo);
#elif defined(VK_USE_PLATFORM_WAYLAND_KHR)
demo_create_window(&demo);
+#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT)
+ demo_create_directfb_window(&demo);
#endif
demo_init_vk_swapchain(&demo);
@@ -4026,6 +4132,8 @@ int main(int argc, char **argv) {
demo_run_xlib(&demo);
#elif defined(VK_USE_PLATFORM_WAYLAND_KHR)
demo_run(&demo);
+#elif defined(VK_USE_PLATFORM_DIRECTFB_EXT)
+ demo_run_directfb(&demo);
#elif defined(VK_USE_PLATFORM_DISPLAY_KHR)
demo_run_display(&demo);
#endif