UNSET(ENABLE_VALIDATION CACHE)
UNSET(ENABLE_WIRED_FILL CACHE)
ENDIF()
-OPTION(VKVG_TEST_DIRECT_DRAW "Draw directly on backend surface, if off surface is blitted." ON)
+OPTION(VKVG_TEST_DIRECT_DRAW "(Experimental)Draw directly on backend surface, if off surface is blitted." OFF)
IF (VKVG_TEST_DIRECT_DRAW)
ADD_DEFINITIONS (-DVKVG_TEST_DIRECT_DRAW)
ENDIF ()
IF (ENABLE_VALIDATION)
ADD_DEFINITIONS (-DVKVG_USE_VALIDATION)
+ OPTION(ENABLE_RENDERDOC "enable renderdoc" OFF)
+ IF (ENABLE_RENDERDOC)
+ ADD_DEFINITIONS (-DVKVG_USE_RENDERDOC)
+ ENDIF ()
ENDIF ()
IF (ENABLE_WIRED_FILL)
ADD_DEFINITIONS (-DVKVG_WIRED_DEBUG)
ELSE ()
MESSAGE(STATUS "Validation\t\t= disabled.")
ENDIF ()
+IF (ENABLE_RENDERDOC)
+ MESSAGE(STATUS "Renderdoc\t\t= enabled.")
+ELSE ()
+ MESSAGE(STATUS "Renderdoc\t\t= disabled.")
+ENDIF ()
IF (VKVG_PREMULT_ALPHA)
MESSAGE(STATUS "Premult Alpha\t= enabled.")
ELSE ()
void vkvg_arc_negative (VkvgContext ctx, float xc, float yc, float radius, float a1, float a2);
void vkvg_curve_to (VkvgContext ctx, float x1, float y1, float x2, float y2, float x3, float y3);
void vkvg_rectangle (VkvgContext ctx, float x, float y, float w, float h);
+void vkvg_fill_rectangle (VkvgContext ctx, float x, float y, float w, float h);
void vkvg_stroke (VkvgContext ctx);
void vkvg_stroke_preserve (VkvgContext ctx);
void vkvg_fill (VkvgContext ctx);
if (pc.fullScreenQuad != 0) {
gl_Position = vec4(vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2) * 2.0f + -1.0f, 0.0f, 1.0f);
outUV = vec3(0,0,-1);
- //gl_Position = vec4(vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2) -1.0f, 0.0f, 1.0f);
return;
}
vec2 v = {cosf(a1)*radius + xc, sinf(a1)*radius + yc};
- float step = M_PIF/radius*0.5f;
+ float step = _get_arc_step(radius);
float a = a1;
if (_current_path_is_empty(ctx))
vec2 v = {cosf(a1)*radius + xc, sinf(a1)*radius + yc};
- float step = M_PIF/radius*1.5f;
+ float step = _get_arc_step(radius);
float a = a1;
if (_current_path_is_empty(ctx))
vec2 cp = _get_current_position(ctx);
vkvg_curve_to (ctx, cp.x + x1, cp.y + y1, cp.x + x2, cp.y + y2, cp.x + x3, cp.y + y3);
}
+void vkvg_fill_rectangle (VkvgContext ctx, float x, float y, float w, float h){
+ _vao_add_rectangle (ctx,x,y,w,h);
+ _record_draw_cmd(ctx);
+}
void vkvg_rectangle (VkvgContext ctx, float x, float y, float w, float h){
_finish_path (ctx);
LOG(LOG_INFO, "FILL: ctx = %lu; path cpt = %d;\n", ctx, ctx->pathPtr / 2);
- _check_cmd_buff_state (ctx);
-
if (ctx->curFillRule == VKVG_FILL_RULE_EVEN_ODD){
_poly_fill (ctx);
_bind_draw_pipeline (ctx);
_draw_full_screen_quad(ctx,true);
CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
}else{
+ _check_cmd_buff_state (ctx);
CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
_fill_ec(ctx);
}
}
float _normalizeAngle(float a)
{
- float res = ROUND_DOWN(fmod(a,2.0f*M_PIF),100);
+ float res = ROUND_DOWN(fmodf(a,2.0f*M_PIF),100);
if (res < 0.0f)
return res + 2.0f*M_PIF;
else
return res;
}
+inline float _get_arc_step (float radius) {
+ return M_PIF/sqrtf(radius)*0.35f;
+}
void _create_gradient_buff (VkvgContext ctx){
vkvg_buffer_create (ctx->pSurf->dev,
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
VMA_MEMORY_USAGE_CPU_TO_GPU,
ctx->sizeIBO * sizeof(VKVG_IBO_INDEX_TYPE), &ctx->indices);
}
-const vec3 blankuv = {};
+void _resize_vbo (VkvgContext ctx, size_t new_size) {
+ _wait_flush_fence (ctx);//wait previous cmd if not completed
+ ctx->sizeVBO = new_size;
+ ctx->sizeVBO += ctx->sizeVBO % VKVG_VBO_SIZE;
+ vkvg_buffer_destroy (&ctx->vertices);
+ vkvg_buffer_create (ctx->pSurf->dev,
+ VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
+ VMA_MEMORY_USAGE_CPU_TO_GPU,
+ ctx->sizeVBO * sizeof(Vertex), &ctx->vertices);
+}
+void _resize_ibo (VkvgContext ctx, size_t new_size) {
+ _wait_flush_fence (ctx);//wait previous cmd if not completed
+ ctx->sizeIBO = ctx->sizeIndices;
+ ctx->sizeIBO += ctx->sizeIBO % VKVG_IBO_SIZE;
+ vkvg_buffer_destroy (&ctx->indices);
+ vkvg_buffer_create (ctx->pSurf->dev,
+ VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
+ VMA_MEMORY_USAGE_CPU_TO_GPU,
+ ctx->sizeIBO * sizeof(VKVG_IBO_INDEX_TYPE), &ctx->indices);
+}
void _add_vertexf (VkvgContext ctx, float x, float y){
Vertex* pVert = &ctx->vertexCache[ctx->vertCount];
pVert->pos.x = x;
pVert->pos.y = y;
- pVert->uv = blankuv;
+ pVert->uv = (vec3){0};
ctx->vertCount++;
_check_vbo_size(ctx);
{{x+width,y}, {0,0,-1}},
{{x+width,y+height},{0,0,-1}}
};
- VKVG_IBO_INDEX_TYPE firstIdx = ctx->vertCount;
+ VKVG_IBO_INDEX_TYPE firstIdx = ctx->vertCount - ctx->curVertOffset;
Vertex* pVert = &ctx->vertexCache[ctx->vertCount];
memcpy (pVert,v,4*sizeof(Vertex));
ctx->vertCount+=4;
vkh_cmd_end (ctx->cmd);
_wait_and_submit_cmd (ctx);
//we could resize here
+ _resize_vbo(ctx, ctx->sizeVertices);
+ _resize_ibo(ctx, ctx->sizeIndices);
}else{
//should resize vbo here
- _wait_flush_fence (ctx);
- ctx->sizeVBO = ctx->sizeVertices;
- ctx->sizeIBO = ctx->sizeIndices;
- vkvg_buffer_destroy (&ctx->indices);
- vkvg_buffer_destroy (&ctx->vertices);
- _create_vertices_buff (ctx);
+ _resize_vbo(ctx, ctx->sizeVertices);
+ _resize_ibo(ctx, ctx->sizeIndices);
}
}
//we anticipate the check for vbo buffer size
if (ctx->vertCount + ctx->pointCount > ctx->sizeVBO) {
if (ctx->cmdStarted) {
- _end_render_pass (ctx);
- _flush_vertices_caches (ctx);
- vkh_cmd_end (ctx->cmd);
- _wait_and_submit_cmd (ctx);
- //we could resize here after a wait fence
- }else{
- _wait_flush_fence (ctx);//wait previous cmd if not completed
- ctx->sizeVBO = ctx->vertCount + ctx->pointCount;
- vkvg_buffer_destroy (&ctx->vertices);
- vkvg_buffer_create (ctx->pSurf->dev,
- VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
- VMA_MEMORY_USAGE_CPU_TO_GPU,
- ctx->sizeVBO * sizeof(Vertex), &ctx->vertices);
- }
+ _end_render_pass(ctx);
+ _flush_vertices_caches(ctx);
+ vkh_cmd_end(ctx->cmd);
+ _wait_and_submit_cmd(ctx);
+ if (ctx->vertCount + ctx->pointCount > ctx->sizeVBO)
+ _resize_vbo(ctx, ctx->vertCount + ctx->pointCount);
+ }else
+ _resize_vbo(ctx, ctx->vertCount + ctx->pointCount);
+
_start_cmd_for_render_pass(ctx);
- }
+ }else
+ _check_cmd_buff_state(ctx);
CmdBindPipeline (ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelinePolyFill);
for (uint i = 0; i < pathPointCount; i++) {
v.pos = ctx->points [i+firstPtIdx];
- _add_vertex (ctx, v);
+ ctx->vertexCache[ctx->vertCount] = v;
+ ctx->vertCount++;
}
LOG(LOG_INFO_PATH, "\tpoly fill: point count = %d; 1st vert = %d; vert count = %d\n", pathPointCount, firstVertIdx, ctx->vertCount - firstVertIdx);
bool _path_has_curves (VkvgContext ctx, uint ptrPath);
float _normalizeAngle (float a);
+float _get_arc_step (float radius);
vec2 _get_current_position (VkvgContext ctx);
void _add_point (VkvgContext ctx, float x, float y);
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
- .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
+ .initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
VkAttachmentDescription attDS = {
.format = FB_STENCIL_FORMAT,
.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
.stencilLoadOp = stencilLoadOp,
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE,
- .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
+ .initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
VkAttachmentDescription attachments[] = {attColor,attDS};
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
- .initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
VkAttachmentDescription attDS = {
.format = FB_STENCIL_FORMAT,
#define PATH_HAS_CURVES_BIT 0x40000000 /* 2d most significant bit of path elmts start = true if curve data are present,
stored to avoid emiting join in curves */
#define PATH_IS_CURVE_BIT 0x80000000 /* most significant bit of path elmts end mark curves data in path array */
-
+#define PATH_IS_CONCAVE_BIT 0x40000000 /* 2d most significant bit of path elmts end = true if path is simple concave
+ triangulation for fill may be simplified*/
#define PATH_ELT_MASK 0x3FFFFFFF /* Bit mask for fetching path element value */
#define ROUNDF(f, c) (((float)((int)((f) * (c))) / (c)))
VkvgDevice device = NULL;
VkvgSurface surf = NULL;
-uint test_size = 250; // items drawn in one run, or complexity
-int iterations = 100; // repeat test n times
+uint test_size = 100; // items drawn in one run, or complexity
+int iterations = 500; // repeat test n times
static bool paused = false;
+static VkSampleCountFlags samples = VK_SAMPLE_COUNT_4_BIT;
static vk_engine_t* e;
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
(float)rand()/RAND_MAX,
(float)rand()/RAND_MAX,
(float)rand()/RAND_MAX,
- 0.5f//0.8f*rand()/RAND_MAX + 0.2f
+ (float)rand()/RAND_MAX
);
}
/* from caskbench */
bool deferredResolve = false;
- device = vkvg_device_create_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, VK_SAMPLE_COUNT_1_BIT, deferredResolve);
+ device = vkvg_device_create_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, samples, deferredResolve);
vkvg_device_set_dpy(device, 96, 96);
bool deferredResolve = false;
- device = vkvg_device_create_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, VK_SAMPLE_COUNT_1_BIT, deferredResolve);
+ device = vkvg_device_create_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, samples, deferredResolve);
vkvg_device_set_dpy(device, 96, 96);
vkDeviceWaitIdle(e->dev->dev);
+ if (paused)
+ continue;
+
stop_time = get_tick();
run_time = stop_time - start_time;
run_time_values[i] = run_time;
for (uint i=0;i<enabledExtsCount;i++)
enabledExts[i] = gflwExts[i];
-
-#if defined (VKVG_USE_VALIDATION)
+#ifdef VKVG_USE_RENDERDOC
const uint32_t enabledLayersCount = 2;
const char* enabledLayers[] = {"VK_LAYER_KHRONOS_validation", "VK_LAYER_RENDERDOC_Capture"};
+#elif defined (VKVG_USE_VALIDATION)
+ const uint32_t enabledLayersCount = 1;
+ const char* enabledLayers[] = {"VK_LAYER_KHRONOS_validation"};
#else
const uint32_t enabledLayersCount = 0;
const char* enabledLayers[] = {NULL};
#endif
-#if defined (DEBUG)
+#ifdef DEBUG
enabledExts[enabledExtsCount] = "VK_EXT_debug_report";
enabledExtsCount++;
enabledExts[enabledExtsCount] = "VK_EXT_debug_utils";
.pEnabledFeatures = &enabledFeatures
};
- VkDevice dev;
- VK_CHECK_RESULT(vkCreateDevice (pi->phy, &device_info, NULL, &dev));
- e->dev = vkh_device_create(vkh_app_get_inst (e->app), pi->phy, dev);
+ e->dev = vkh_device_create(e->app, pi, &device_info);
#if DEBUG
dbgReport = vkh_device_create_debug_report (e->dev,
const float w = 800.f;
VkvgContext ctx = vkvg_create(surf);
- vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_NON_ZERO);
+ vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_EVEN_ODD);
vkvg_set_line_width(ctx, 1.0f);
//vkvg_set_line_join(ctx,VKVG_LINE_JOIN_BEVEL);
for (uint i=0; i<test_size; i++) {
randomize_color(ctx);
- float r = 0.2f*w*rand()/RAND_MAX;
- float x = truncf(0.9f * w*rand()/RAND_MAX + r);
- float y = truncf(0.9f * w*rand()/RAND_MAX + r);
+ float r = 0.5f*w*rand()/RAND_MAX;
+ float x = truncf(0.5f * w*rand()/RAND_MAX + r);
+ float y = truncf(0.5f * w*rand()/RAND_MAX + r);
vkvg_arc(ctx, x, y, r, 0, M_PI * 2.0f);
- //vkvg_stroke(ctx);
vkvg_fill(ctx);
-
- /*if (i%50==0)
- vkvg_flush(ctx);*/
}
vkvg_destroy(ctx);
}
gettimeofday(¤tTime, NULL);
srand((unsigned) currentTime.tv_usec);
- const float w = 1024.f;
+ const float w = 800.f;
- VkvgContext ctx = vkvg_create(surf);
- vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_NON_ZERO);
- vkvg_set_line_width(ctx, 2.0f);
+ vkvg_surface_clear(surf);
- vkvg_clear(ctx);
- //vkvg_set_line_join(ctx,VKVG_LINE_JOIN_BEVEL);
+ VkvgContext ctx = vkvg_create(surf);
+ vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_EVEN_ODD);
for (uint i=0; i<test_size; i++) {
randomize_color(ctx);
- float x = truncf(0.8f*w*rand()/RAND_MAX);
- float y = truncf(0.8f*w*rand()/RAND_MAX);
- float z = truncf((0.2f*w*rand()/RAND_MAX)+1.f);
- float v = truncf((0.2f*w*rand()/RAND_MAX)+1.f);
+ float x = truncf(0.5f*w*rand()/RAND_MAX);
+ float y = truncf(0.5f*w*rand()/RAND_MAX);
+ float z = truncf((0.5f*w*rand()/RAND_MAX)+1.f);
+ float v = truncf((0.5f*w*rand()/RAND_MAX)+1.f);
vkvg_rectangle(ctx, x, y, z, v);
- //vkvg_stroke(ctx);
vkvg_fill(ctx);
-
- /*if (i%250==0)
- vkvg_flush(ctx);*/
}
vkvg_destroy(ctx);
}
-Subproject commit dd13cd6f6dcf94420f0919a2ca2837739cb46ea1
+Subproject commit 1e7702d2b18dbe7c777bb8f3bdef60720fb24028