tbm_surface_h **buffers, int *buffer_count);
/**
- * Get the buffer count capability of the given TPL surface.
- *
- * @paran surface surface to get the buffer count capability
- * @paran min pointer to receive min buffer count value.
- * @paran max pointer to receive max buffer count value.
- */
-tpl_result_t
-tpl_surface_query_supported_buffer_count(tpl_surface_t *surface, int *min,
- int *max);
-
-/**
* Query information on the given native window.
*
* @param display display used for query.
tpl_display_get_native_pixmap_info(tpl_display_t *display, tpl_handle_t pixmap,
int *width, int *height, tbm_format *format);
+
+/**
+ * Get the buffer count capability of the given native window.
+ *
+ * @param display display used for query.
+ * @param window window used for query the buffer count capability
+ * @paran min pointer to receive min buffer count value.
+ * @paran max pointer to receive max buffer count value.
+ * @return TPL_ERROR_NONE if this function is supported and the window is valid, TPL_ERROR otherwise.
+ */
+tpl_result_t
+tpl_display_query_supported_buffer_count_from_native_window(tpl_display_t *display,
+ tpl_handle_t window,
+ int *min, int *max);
+
/**
* Get native buffer from the given native pixmap.
*
return display->backend.get_pixmap_info(display, pixmap, width, height, format);
}
+tpl_result_t
+tpl_display_query_supported_buffer_count_from_native_window(tpl_display_t *display,
+ tpl_handle_t window,
+ int *min, int *max)
+{
+ if (!display->backend.query_window_supported_buffer_count) {
+ TPL_ERR("Backend for display has not been initialized!");
+ return TPL_ERROR_INVALID_OPERATION;
+ }
+
+ return display->backend.query_window_supported_buffer_count(display,
+ window, min,
+ max);
+}
+
tbm_surface_h
tpl_display_get_buffer_from_native_pixmap(tpl_display_t *display,
tpl_handle_t pixmap)
goto error;
}
- surface->capabilities.min_buffer =
- tbm_surface_queue_get_size(tpl_gbm_surface->tbm_queue);
- surface->capabilities.max_buffer =
- tbm_surface_queue_get_size(tpl_gbm_surface->tbm_queue);
-
TPL_LOG(3, "window(%p, %p) %dx%d", surface, surface->native_handle,
surface->width, surface->height);
return TPL_ERROR_NONE;
TPL_ERR("Failed to get native pixmap info.");
goto error;
}
- surface->capabilities.min_buffer = surface->capabilities.max_buffer = 1;
return TPL_ERROR_NONE;
}
tpl_handle_t pixmap, int *width,
int *height, tbm_format *format);
tbm_surface_h (*get_buffer_from_native_pixmap)(tpl_handle_t pixmap);
+ tpl_result_t (*query_window_supported_buffer_count)(tpl_display_t *display,
+ tpl_handle_t window,
+ int *min, int *max);
};
struct _tpl_surface_backend {
int width, height;
int post_interval;
int dump_count;
- struct {
- int min_buffer;
- int max_buffer;
- } capabilities;
tpl_surface_backend_t backend;
};
}
tpl_result_t
-tpl_surface_query_supported_buffer_count(tpl_surface_t *surface, int *min,
- int *max)
-{
- if (!surface || (surface->type != TPL_SURFACE_TYPE_WINDOW)) {
- TPL_ERR("Invalid surface!");
- return TPL_ERROR_INVALID_PARAMETER;
- }
-
- if (min) *min = surface->capabilities.min_buffer;
- if (max) *max = surface->capabilities.max_buffer;
-
- return TPL_ERROR_NONE;
-
-}
-
-tpl_result_t
tpl_surface_get_swapchain_buffers(tpl_surface_t *surface,
tbm_surface_h **buffers, int *buffer_count)
{
return TPL_ERROR_INVALID_PARAMETER;
}
- if ((buffer_count < surface->capabilities.min_buffer)
- || (buffer_count > surface->capabilities.max_buffer)) {
- TPL_ERR("Invalid buffer_count!");
- return TPL_ERROR_INVALID_PARAMETER;
- }
-
if (!surface->backend.create_swapchain) {
TPL_ERR("Backend does not support!");
return TPL_ERROR_INVALID_OPERATION;
goto error;
}
- surface->capabilities.min_buffer =
- tbm_surface_queue_get_size((tbm_surface_queue_h)surface->native_handle);
- surface->capabilities.max_buffer =
- tbm_surface_queue_get_size((tbm_surface_queue_h)surface->native_handle);
-
tbm_surface_queue_add_destroy_cb((tbm_surface_queue_h)surface->native_handle,
__tpl_tbm_surface_queue_notify_cb,
surface);
goto error;
}
- surface->capabilities.min_buffer = surface->capabilities.max_buffer = 1;
tbm_surface_internal_ref((tbm_surface_h)surface->native_handle);
surface->width = wl_egl_window->width;
surface->height = wl_egl_window->height;
- surface->capabilities.min_buffer =
- tbm_surface_queue_get_size(wayland_egl_surface->tbm_queue);
- surface->capabilities.max_buffer =
- tbm_surface_queue_get_size(wayland_egl_surface->tbm_queue);
wl_egl_window->private = surface;
wl_egl_window->resize_callback = (void *)__cb_client_window_resize_callback;
struct _tpl_wayland_vk_wsi_display {
struct wayland_tbm_client *wl_tbm_client;
+ struct {
+ int min_buffer;
+ int max_buffer;
+ } surface_capabilities;
};
struct _tpl_wayland_vk_wsi_surface {
return TPL_ERROR_INVALID_OPERATION;
}
+ wayland_vk_wsi_display->surface_capabilities.min_buffer = 2;
+ wayland_vk_wsi_display->surface_capabilities.max_buffer = CLIENT_QUEUE_SIZE;;
+
display->backend.data = wayland_vk_wsi_display;
if (__tpl_wayland_vk_wsi_display_is_wl_display(display->native_handle)) {
}
static tpl_result_t
+__tpl_wayland_vk_wsi_display_query_window_supported_buffer_count(tpl_display_t *display,
+ tpl_handle_t window, int *min, int *max)
+{
+ tpl_wayland_vk_wsi_display_t *wayland_vk_wsi_display = NULL;
+
+ TPL_ASSERT(display);
+ TPL_ASSERT(window);
+
+ wayland_vk_wsi_display = (tpl_wayland_vk_wsi_display_t *)display->backend.data;
+
+ if (!wayland_vk_wsi_display) return TPL_ERROR_INVALID_OPERATION;
+
+ if (min) *min = wayland_vk_wsi_display->surface_capabilities.min_buffer;
+ if (max) *max = wayland_vk_wsi_display->surface_capabilities.max_buffer;
+
+ return TPL_ERROR_NONE;
+}
+
+
+static tpl_result_t
__tpl_wayland_vk_wsi_surface_init(tpl_surface_t *surface)
{
tpl_wayland_vk_wsi_surface_t *wayland_vk_wsi_surface = NULL;
surface->backend.data = (void *)wayland_vk_wsi_surface;
wayland_vk_wsi_surface->tbm_queue = NULL;
- surface->capabilities.min_buffer = 2;
- surface->capabilities.max_buffer = CLIENT_QUEUE_SIZE;
-
TPL_LOG(3, "window(%p, %p) %dx%d", surface, surface->native_handle,
surface->width, surface->height);
int height, int buffer_count)
{
tpl_wayland_vk_wsi_surface_t *wayland_vk_wsi_surface = NULL;
+ tpl_wayland_vk_wsi_display_t *wayland_vk_wsi_display = NULL;
TPL_ASSERT(surface);
TPL_ASSERT(surface->backend.data);
wayland_vk_wsi_surface = (tpl_wayland_vk_wsi_surface_t *) surface->backend.data;
TPL_ASSERT(wayland_vk_wsi_surface);
+ wayland_vk_wsi_display = (tpl_wayland_vk_wsi_display_t *)
+ surface->display->backend.data;
+ TPL_ASSERT(wayland_vk_wsi_display);
+
+ if ((buffer_count < wayland_vk_wsi_display->surface_capabilities.min_buffer)
+ || (buffer_count > wayland_vk_wsi_display->surface_capabilities.max_buffer)) {
+ TPL_ERR("Invalid buffer_count!");
+ return TPL_ERROR_INVALID_PARAMETER;
+ }
+
wayland_vk_wsi_surface->tbm_queue = tbm_surface_queue_create(buffer_count,
width,
height,
backend->fini = __tpl_wayland_vk_wsi_display_fini;
backend->query_config = __tpl_wayland_vk_wsi_display_query_config;
backend->filter_config = __tpl_wayland_vk_wsi_display_filter_config;
+ backend->query_window_supported_buffer_count = __tpl_wayland_vk_wsi_display_query_window_supported_buffer_count;
}
void