Fix "tpl_surface_get_swapchain_buffers() returns only one buffer" problem 41/66141/1
authorMun, Gwan-gyeong <kk.moon@samsung.com>
Fri, 15 Apr 2016 10:29:10 +0000 (19:29 +0900)
committerMun, Gwan-gyeong <kk.moon@samsung.com>
Fri, 15 Apr 2016 10:29:10 +0000 (19:29 +0900)
Change-Id: I74aadeecdabc2b1fe13927e5b2812dc1c3efd968

src/tpl_wayland_vk_wsi.c

index 544f19f..7334d46 100644 (file)
@@ -421,7 +421,7 @@ __tpl_wayland_vk_wsi_surface_get_swapchain_buffers(tpl_surface_t *surface,
        tbm_surface_h *swapchain_buffers = NULL;
        tpl_wayland_vk_wsi_surface_t *wayland_vk_wsi_surface = NULL;
        tbm_surface_queue_error_e tsq_err;
-       int i;
+       int i, dequeue_count;
 
        TPL_ASSERT(surface);
        TPL_ASSERT(surface->backend.data);
@@ -442,14 +442,18 @@ __tpl_wayland_vk_wsi_surface_get_swapchain_buffers(tpl_surface_t *surface,
                if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) {
                        TPL_ERR("Failed to get tbm_surface from tbm_surface_queue | tsq_err = %d",
                                tsq_err);
+                       dequeue_count = i;
                        goto get_buffer_fail;
                }
-               tsq_err = tbm_surface_queue_release(wayland_vk_wsi_surface->tbm_queue, buffer);
+               swapchain_buffers[i] = buffer;
+       }
+
+       for (i = 0 ; i < wayland_vk_wsi_surface->buffer_count ; i++) {
+               tsq_err = tbm_surface_queue_release(wayland_vk_wsi_surface->tbm_queue, swapchain_buffers[i]);
                if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) {
                        TPL_ERR("Failed to release tbm_surface. | tsq_err = %d", tsq_err);
-                       goto get_buffer_fail;
+                       goto release_buffer_fail;
                }
-               swapchain_buffers[i] = buffer;
        }
 
        *buffers = swapchain_buffers;
@@ -457,6 +461,15 @@ __tpl_wayland_vk_wsi_surface_get_swapchain_buffers(tpl_surface_t *surface,
        return TPL_ERROR_NONE;
 
 get_buffer_fail:
+       for (i = 0 ; i < dequeue_count ; i++) {
+               tsq_err = tbm_surface_queue_release(wayland_vk_wsi_surface->tbm_queue, swapchain_buffers[i]);
+               if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) {
+                       TPL_ERR("Failed to release tbm_surface. | tsq_err = %d", tsq_err);
+                       goto release_buffer_fail;
+               }
+       }
+
+release_buffer_fail:
        free(swapchain_buffers);
        return TPL_ERROR_INVALID_OPERATION;
 }