+static void
+add_tdm_layer(vk_physical_device_t *pdev, tdm_layer *layer,
+ vk_display_t *display, tdm_output *output)
+{
+ int zpos;
+
+ vk_display_plane_t *plane = &pdev->planes[pdev->plane_count];
+
+ plane->pdev = pdev;
+ plane->tdm_layer = layer;
+
+ plane->supported_display_count = 1;
+ plane->supported_displays[0] = display;
+
+ /* TODO: Map layer zpos into positive integer range between [0, NUM_LAYERS].*/
+ plane->current_display = display;
+
+ tdm_layer_get_zpos(layer, &zpos);
+ plane->current_stack_index = zpos;
+
+ plane->prop.currentDisplay = VK_TO_HANDLE(VkDisplayKHR, plane->current_display);
+ plane->prop.currentStackIndex = plane->current_stack_index;
+
+ pdev->plane_count++;
+}
+
+static void
+plane_fini(vk_display_plane_t *plane)
+{
+ /* Do Nothing */
+}
+
+static void
+add_tdm_output(vk_physical_device_t *pdev, tdm_output *output)
+{
+ vk_display_t *display = &pdev->displays[pdev->display_count];
+ const char *str;
+ unsigned int w, h;
+ int count, i;
+ const tdm_output_mode *modes;
+ tdm_error error;
+
+ display->pdev = pdev;
+ display->tdm_output = output;
+
+ /* Initialize modes. */
+ tdm_output_get_available_modes(output, &modes, &count);
+ VK_ASSERT(count > 0);
+
+ display->built_in_modes = calloc(count, sizeof(vk_display_mode_t));
+ VK_CHECK(display->built_in_modes, return, "calloc() failed.\n");
+
+ for (i = 0; i < count; i++) {
+ display->built_in_modes[i].display = display;
+ display->built_in_modes[i].prop.displayMode =
+ VK_TO_HANDLE(VkDisplayModeKHR, &display->built_in_modes[i]);
+ display->built_in_modes[i].prop.parameters.visibleRegion.width = modes[i].hdisplay;
+ display->built_in_modes[i].prop.parameters.visibleRegion.height = modes[i].vdisplay;
+ display->built_in_modes[i].prop.parameters.refreshRate = modes[i].vrefresh;
+ }
+
+ display->custom_mode_count = 0;
+ display->custom_modes = NULL;
+
+ /* Initialize prop. */
+ display->prop.display = VK_TO_HANDLE(VkDisplayKHR, display);
+
+ tdm_output_get_model_info(output, NULL, NULL, &str);
+ display->prop.displayName = strdup(str);
+
+ tdm_output_get_physical_size(output, &w, &h);
+ display->prop.physicalDimensions.width = w;
+ display->prop.physicalDimensions.height = h;
+
+ /* TODO: Physical Resolution */
+
+ /* TODO: Transform */
+ display->prop.supportedTransforms = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
+
+ /* TODO: Changing Z pos is only allowed for video layers. */
+ display->prop.planeReorderPossible = VK_FALSE;
+
+ display->prop.persistentContent = VK_FALSE;
+
+ /* Add layers */
+ error = tdm_output_get_layer_count(output, &count);
+
+ for (i = 0; i < count; i++) {
+ tdm_layer *layer = tdm_output_get_layer(output, i, &error);
+ add_tdm_layer(pdev, layer, display, output);
+ }
+
+ /* Finally increase display count. */
+ pdev->display_count++;
+}
+
+static void
+display_fini(vk_display_t *display)
+{
+ if (display->built_in_modes)
+ free(display->built_in_modes);
+
+ if (display->custom_modes)
+ free(display->custom_modes);
+}
+