surface, const
VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage);
+typedef VkResult (VKAPI_PTR *PFN_vkQueueSignalReleaseImageTIZEN)
+ (VkQueue queue, uint32_t waitSemaphoreCount,
+ const VkSemaphore *pWaitSemaphores,
+ VkImage image, int *pNativeFenceFd);
+typedef VkResult (VKAPI_PTR *PFN_vkAcquireImageTIZEN)
+ (VkDevice device, VkImage image, int nativeFenceFd,
+ VkSemaphore semaphore, VkFence fence);
+
#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageFromNativeBufferTIZEN(
VkDevice device,
const VkImageCreateInfo * pCreateInfo,
const VkAllocationCallbacks * pAllocator,
VkImage * pImage);
+VKAPI_PTR VkResult vkQueueSignalReleaseImageTIZEN(VkQueue queue, uint32_t waitSemaphoreCount,
+ const VkSemaphore *pWaitSemaphores,
+ VkImage image, int *pNativeFenceFd);
+VKAPI_PTR VkResult vkAcquireImageTIZEN(VkDevice device, VkImage image, int nativeFenceFd,
+ VkSemaphore semaphore, VkFence fence);
+
#endif
#endif /* VK_TIZEN_H */
/* Retrieve WSI-ICD interface functions. */
icd.create_presentable_image =
(void *)icd.get_proc_addr(NULL, "vkCreateImageFromNativeBufferTIZEN");
+ VK_DEBUG("icd.create_presentable_image: %p", icd.create_presentable_image);
+
+ icd.queue_signal_release_image =
+ (void *)icd.get_proc_addr(NULL, "vkQueueSignalReleaseImageTIZEN");
+ VK_DEBUG("icd.queue_signal_release_image: %p", icd.queue_signal_release_image);
+
+ icd.acquire_image =
+ (void *)icd.get_proc_addr(NULL, "vkAcquireImageTIZEN");
+ VK_DEBUG("icd.acquire_image: %p", icd.acquire_image);
/* Initialize instance extensions. */
enum_inst_exts = (void *)icd.get_proc_addr(NULL, "vkEnumerateInstanceExtensionProperties");
#include "wsi.h"
#include <string.h>
+#include <unistd.h>
+#include <tbm_sync.h>
#define TBM_FORMAT_0 0
uint32_t i;
tbm_surface_h next;
vk_swapchain_t *chain = (vk_swapchain_t *)(uintptr_t)swapchain;
-
- /* TODO: timeout */
-
- next = tpl_surface_dequeue_buffer(chain->tpl_surface);
- VK_CHECK(next, return VK_ERROR_SURFACE_LOST_KHR, "tpl_surface_dequeue_buffers() failed\n.");
+ int sync_fd = -1;
+ tbm_sync_fence_h sync_fence = NULL;
+ tbm_sync_error_e sync_err;
+
+ if (icd->acquire_image) {
+ next = tpl_surface_dequeue_buffer_with_sync(chain->tpl_surface, timeout, &sync_fence);
+
+ if (next == NULL)
+ return VK_TIMEOUT;
+
+ if (sync_fence) {
+ sync_fd = tbm_sync_fence_export(sync_fence, &sync_err);
+ VK_DEBUG("%s, tbm_surface: %p: fence_fd: %d\n", __func__, next, sync_fd);
+ if (sync_err != TBM_SYNC_ERROR_NONE)
+ sync_fd = -1;
+ tbm_sync_fence_destroy(sync_fence);
+ }
+ } else {
+ next = tpl_surface_dequeue_buffer(chain->tpl_surface);
+ VK_CHECK(next, return VK_ERROR_SURFACE_LOST_KHR, "tpl_surface_dequeue_buffers() failed\n.");
+ }
for (i = 0; i < chain->buffer_count; i++) {
if (next == chain->buffers[i].tbm) {
VK_DEBUG("%s, tbm_surface: %p, index: %d\n", __func__, next, i);
*image_index = i;
+ if (icd->acquire_image)
+ icd->acquire_image(device, chain->buffers[i].image, sync_fd, semaphore, fence);
/* TODO: We can do optimization here by returning buffer index immediatly despite the
* buffer is not released yet. The fence or semaphore will be signaled when
uint32_t i;
for (i = 0; i < info->swapchainCount; i++) {
+ int sync_fd = -1;
tpl_result_t res;
+ tbm_sync_fence_h sync_fence = NULL;
+ tbm_sync_error_e sync_err;
vk_swapchain_t *chain = (vk_swapchain_t *)(uintptr_t)info->pSwapchains[i];
- res = tpl_surface_enqueue_buffer(chain->tpl_surface,
- chain->buffers[info->pImageIndices[i]].tbm);
+ if (icd->queue_signal_release_image)
+ icd->queue_signal_release_image(queue, info->waitSemaphoreCount, info->pWaitSemaphores,
+ chain->buffers[info->pImageIndices[i]].image, &sync_fd);
+
+ if (sync_fd != -1) {
+ sync_fence = tbm_sync_fence_import(sync_fd, &sync_err);
+ close(sync_fd);
+ }
+
+ if (sync_fence)
+ res = tpl_surface_enqueue_buffer_with_damage_and_sync(chain->tpl_surface,
+ chain->buffers[info->pImageIndices[i]].tbm,
+ 0, NULL,
+ sync_fence);
+ else
+ res = tpl_surface_enqueue_buffer(chain->tpl_surface,
+ chain->buffers[info->pImageIndices[i]].tbm);
if (info->pResults != NULL)
info->pResults[i] = res == TPL_ERROR_NONE ? VK_SUCCESS : VK_ERROR_DEVICE_LOST;