diff options
| author | Nicolas Caramelli <caramelli.devel@gmail.com> | 2020-07-13 17:22:09 +0200 |
|---|---|---|
| committer | jeremyk-lunarg <jeremyk@lunarg.com> | 2020-08-07 11:59:36 -0600 |
| commit | c8be8c840153dfc736099c10d67abf880722f9e1 (patch) | |
| tree | 4d24efcdd1b6d2cc95ebf602468971799385e287 /cube/cube.c | |
| parent | a1c21580f50b9d6ead9e5f04b8b8fdc378f49087 (diff) | |
| download | usermoji-c8be8c840153dfc736099c10d67abf880722f9e1.tar.xz | |
Add support for VK_EXT_directfb_surface extension
Diffstat (limited to 'cube/cube.c')
| -rw-r--r-- | cube/cube.c | 108 |
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 |
