}
_clear_context (ctx);
+ _vkvg_device_destroy_fence (ctx->pSurf->dev, ctx->flushFence);
- vkDestroyFence (ctx->dev->vkDev, ctx->flushFence,NULL);
vkFreeCommandBuffers(dev, ctx->cmdPool, 2, ctx->cmdBuffers);
vkDestroyCommandPool(dev, ctx->cmdPool, NULL);
ctx->status = VKVG_STATUS_TIMEOUT;
return false;
}
-void _reset_flush_fence (VkvgContext ctx) {
- LOG(VKVG_LOG_INFO, "CTX: _reset_flush_fence\n");
- ResetFences (ctx->dev->vkDev, 1, &ctx->flushFence);
-}
bool _wait_and_submit_cmd (VkvgContext ctx){
if (!ctx->cmdStarted)//current cmd buff is empty, be aware that wait is also canceled!!
return true;
if (!_wait_flush_fence (ctx))
return false;
- _reset_flush_fence(ctx);
-
- _submit_cmd (ctx->dev, &ctx->cmd, ctx->flushFence);
+ _vkvg_device_reset_fence(ctx->pSurf->dev, ctx->flushFence);
+ _submit_cmd (ctx->pSurf->dev, &ctx->cmd, ctx->flushFence);
if (ctx->cmd == ctx->cmdBuffers[0])
ctx->cmd = ctx->cmdBuffers[1];
void _emit_draw_cmd_undrawn_vertices(VkvgContext ctx);
void _flush_cmd_until_vx_base (VkvgContext ctx);
bool _wait_flush_fence (VkvgContext ctx);
-void _reset_flush_fence (VkvgContext ctx);
bool _wait_and_submit_cmd (VkvgContext ctx);
void _update_push_constants (VkvgContext ctx);
void _update_cur_pattern (VkvgContext ctx, VkvgPattern pat);
*vdpy = dev->vdpi;
}
void vkvg_device_set_queue_guards (VkvgDevice dev, vkvg_queue_guard before_submit, vkvg_queue_guard after_submit, void* user_data) {
- dev->gQBeforeSubmitGuard = before_submit;
- dev->gQAfterSubmitGuard = after_submit;
+ dev->gQLockGuard = before_submit;
+ dev->gQUnlockGuard = after_submit;
dev->gQGuardUserData = user_data;
}
#if VKVG_DBG_STATS
}
void _wait_and_reset_device_fence (VkvgDevice dev) {
vkWaitForFences (dev->vkDev, 1, &dev->fence, VK_TRUE, UINT64_MAX);
- vkResetFences (dev->vkDev, 1, &dev->fence);
+ _vkvg_device_reset_fence(dev, dev->fence);
+}
+
+void _vkvg_device_destroy_fence (VkvgDevice dev, VkFence fence) {
+ if (dev->gQLockGuard)
+ dev->gQLockGuard (dev->gQGuardUserData);
+
+ if (dev->gQLastFence == fence)
+ dev->gQLastFence = VK_NULL_HANDLE;
+
+ vkDestroyFence (dev->vkDev, fence, NULL);
+
+ if (dev->gQUnlockGuard)
+ dev->gQUnlockGuard (dev->gQGuardUserData);
+}
+void _vkvg_device_reset_fence (VkvgDevice dev, VkFence fence){
+ if (dev->gQLockGuard)
+ dev->gQLockGuard (dev->gQGuardUserData);
+
+ if (dev->gQLastFence == fence)
+ dev->gQLastFence = VK_NULL_HANDLE;
+
+ ResetFences (dev->vkDev, 1, &fence);
+
+ if (dev->gQUnlockGuard)
+ dev->gQUnlockGuard (dev->gQGuardUserData);
+}
+void _vkvg_device_wait_fence (VkvgDevice dev, VkFence fence){
+
+}
+void _vkvg_device_wait_and_reset_fence (VkvgDevice dev, VkFence fence){
+
}
void _submit_cmd (VkvgDevice dev, VkCommandBuffer* cmd, VkFence fence) {
- if (dev->gQBeforeSubmitGuard)
- dev->gQBeforeSubmitGuard (dev->gQGuardUserData);
+ if (dev->gQLockGuard)
+ dev->gQLockGuard (dev->gQGuardUserData);
+ if (dev->gQLastFence != VK_NULL_HANDLE)
+ WaitForFences (dev->vkDev, 1, &dev->gQLastFence, VK_TRUE, VKVG_FENCE_TIMEOUT);
vkh_cmd_submit (dev->gQueue, cmd, fence);
- if (dev->gQAfterSubmitGuard)
- dev->gQAfterSubmitGuard (dev->gQGuardUserData);
+ dev->gQLastFence = fence;
+ if (dev->gQUnlockGuard)
+ dev->gQUnlockGuard (dev->gQGuardUserData);
}
bool _init_function_pointers (VkvgDevice dev) {
VkFormat pngStagFormat; /**< Supported vulkan image format png write staging img */
VkImageTiling pngStagTiling; /**< tiling for the blit operation */
- vkvg_queue_guard gQBeforeSubmitGuard;
- vkvg_queue_guard gQAfterSubmitGuard;
+ vkvg_queue_guard gQLockGuard;
+ vkvg_queue_guard gQUnlockGuard;
void* gQGuardUserData;
VkhQueue gQueue; /**< Vulkan Queue with Graphic flag */
+ VkFence gQLastFence;
VkRenderPass renderPass; /**< Vulkan render pass, common for all surfaces */
VkRenderPass renderPass_ClearStencil;/**< Vulkan render pass for first draw with context, stencil has to be cleared */
void _wait_idle (VkvgDevice dev);
void _wait_and_reset_device_fence (VkvgDevice dev);
void _submit_cmd (VkvgDevice dev, VkCommandBuffer* cmd, VkFence fence);
+
+void _vkvg_device_destroy_fence (VkvgDevice dev, VkFence fence);
+void _vkvg_device_reset_fence (VkvgDevice dev, VkFence fence);
+void _vkvg_device_wait_fence (VkvgDevice dev, VkFence fence);
+void _vkvg_device_wait_and_reset_fence (VkvgDevice dev, VkFence fence);
#endif
_font_cache_t* cache = dev->fontCache;
vkWaitForFences (dev->vkDev, 1, &cache->uploadFence, VK_TRUE, UINT64_MAX);
+ _vkvg_device_reset_fence (dev, cache->uploadFence);
+
vkResetCommandBuffer(cache->cmd, 0);
- vkResetFences (dev->vkDev, 1, &cache->uploadFence);
uint8_t newSize = cache->texLength + FONT_CACHE_INIT_LAYERS;
VkhImage newImg = vkh_tex2d_array_create ((VkhDevice)dev, cache->texFormat, FONT_PAGE_SIZE, FONT_PAGE_SIZE,
LOG(VKVG_LOG_INFO, "_flush_chars_to_tex pen(%d, %d)\n",f->curLine.penX, f->curLine.penY);
vkWaitForFences (dev->vkDev,1,&cache->uploadFence,VK_TRUE,UINT64_MAX);
+ _vkvg_device_reset_fence (dev, cache->uploadFence);
vkResetCommandBuffer(cache->cmd,0);
- vkResetFences (dev->vkDev,1,&cache->uploadFence);
memcpy(cache->buff.allocInfo.pMappedData, cache->hostBuff, (uint64_t)f->curLine.height * FONT_PAGE_SIZE * cache->texPixelSize);
#ifdef VKVG_TEST_DIRECT_DRAW
for (uint32_t i=0; i<r->imgCount;i++)
vkvg_surface_destroy (surfaces[i]);
-
free (surfaces);
#else
vkvg_surface_destroy (surf);
#include "test.h"
#include "tinycthread.h"
-#define THREAD_COUNT 2
+#define THREAD_COUNT 8
static int finishedThreadCount = 0;
-static mtx_t mutex;
+static mtx_t* pmutex;
void drawRandomRect (VkvgContext ctx, float s) {
float w = (float)test_width;
}
int drawRectsThread () {
- mtx_t gQMutex;
- mtx_init (&gQMutex, mtx_plain);
- vkvg_device_set_queue_guards (device, _before_submit, _after_submit, &gQMutex);
VkvgSurface s = vkvg_surface_create(device, test_width, test_height);
VkvgContext ctx = vkvg_create(s);
}
vkvg_destroy(ctx);
- mtx_lock(&mutex);
-
- finishedThreadCount++;
+ mtx_lock(pmutex);
ctx = vkvg_create(surf);
vkvg_set_source_surface (ctx, s, 0, 0);
vkvg_paint(ctx);
vkvg_destroy(ctx);
- mtx_unlock(&mutex);
+ finishedThreadCount++;
+ mtx_unlock(pmutex);
vkvg_surface_destroy (s);
- vkvg_device_set_queue_guards (device, NULL, NULL, NULL);
- mtx_destroy (&gQMutex);
return 0;
}
void fixedSizeRects(){
+ mtx_t gQMutex, mutex;
+ mtx_t* pgQMutex = &gQMutex;
+ pmutex = &mutex;
+
+ mtx_init (pgQMutex, mtx_plain);
+ vkvg_device_set_queue_guards (device, _before_submit, _after_submit, pgQMutex);
+
thrd_t threads[THREAD_COUNT];
+
finishedThreadCount = 0;
- mtx_init (&mutex,mtx_plain);
+ mtx_init (pmutex, mtx_plain);
for (uint32_t i=0; i<THREAD_COUNT; i++) {
thrd_create (&threads[i], drawRectsThread, NULL);
}
while (finishedThreadCount < THREAD_COUNT)
thrd_sleep(&ts, NULL);
- mtx_destroy(&mutex);
+ mtx_lock(pmutex);
+ mtx_unlock(pmutex);
+ mtx_destroy (pmutex);
+ pmutex = NULL;
+
+ vkvg_device_set_queue_guards (device, NULL, NULL, NULL);
+ mtx_destroy (pgQMutex);
+ pgQMutex = NULL;
}
int main(int argc, char *argv[]) {