From: Jean-Philippe Bruyère Date: Tue, 24 Sep 2019 00:19:58 +0000 (+0200) Subject: wip X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=84a5cb501428c5d24dd1be5ffd44a6ce2d71842d;p=jp%2Fvkvg.git wip --- diff --git a/shaders/vkvg_main_lcd.frag b/shaders/vkvg_main_lcd.frag index bbd441c..bbc2d1e 100644 --- a/shaders/vkvg_main_lcd.frag +++ b/shaders/vkvg_main_lcd.frag @@ -24,14 +24,14 @@ #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable -//layout (set=0, binding = 0) uniform sampler2DArray fontMap; layout (set=0, binding = 0) uniform sampler2D source; -/*layout (set=0, binding = 2) uniform _uboGrad { +layout (set=0, binding = 1) uniform sampler2DArray fontMap; +layout (set=0, binding = 2) uniform _uboGrad { vec4 cp[3]; vec4 colors[16]; vec4 stops[16]; uint count; -}uboGrad;*/ +}uboGrad; layout (location = 0) in vec3 inFontUV; //if it is a text drawing, inFontUV.z hold fontMap layer layout (location = 1) in vec4 inSrc; //source bounds or color depending on pattern type @@ -58,7 +58,7 @@ void main() c = inSrc; break; case SURFACE: - if (inFontUV.z < -1.0){ + /*if (inFontUV.z < -1.0){ //pattern is drawn with a full screen quad with no tex coord //so we have to transform pixel vec2 p = (gl_FragCoord.xy - textureSize(source,0)); @@ -66,12 +66,12 @@ void main() inMat[0][0] * p.x + inMat[1][0] * p.y + inMat[2][0], inMat[0][1] * p.x + inMat[1][1] * p.y + inMat[2][1]); c = texture (source, uv); - }else + }else*/ c = texture (source, inFontUV.xy); break; case LINEAR: //credit to Nikita Rokotyan for linear grad - /*float alpha = atan( -uboGrad.cp[1].y + uboGrad.cp[0].y, uboGrad.cp[1].x - uboGrad.cp[0].x ); + float alpha = atan( -uboGrad.cp[1].y + uboGrad.cp[0].y, uboGrad.cp[1].x - uboGrad.cp[0].x ); float gradientStartPosRotatedX = uboGrad.cp[0].x*cos(alpha) - uboGrad.cp[0].y*sin(alpha); float gradientEndPosRotatedX = uboGrad.cp[1].x*cos(alpha) - uboGrad.cp[1].y*sin(alpha); float d = gradientEndPosRotatedX - gradientStartPosRotatedX; @@ -82,7 +82,7 @@ void main() c = mix(uboGrad.colors[0], uboGrad.colors[1], smoothstep( gradientStartPosRotatedX + uboGrad.stops[0].r*d, gradientStartPosRotatedX + uboGrad.stops[1].r*d, xLocRotated ) ); for ( int i=1; idescFontTex; + wds.pImageInfo = &ctx->descSrcTex; ctx->wds[0] = wds; ctx->descSrcTex = vkh_image_get_descriptor (ctx->pSurf->dev->emptyImg, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); wds.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; wds.dstSet = 0; - wds.dstBinding = 0; + wds.dstBinding = 1; wds.descriptorCount = 1; wds.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - wds.pImageInfo = &ctx->descSrcTex; + wds.pImageInfo = &ctx->descFontTex; ctx->wds[1] = wds; wds.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; @@ -550,7 +550,12 @@ void _start_cmd_for_render_pass (VkvgContext ctx) { CmdSetScissor(ctx->cmd, 0, 1, &ctx->bounds); if (CmdPushDescriptorSet) { - CmdPushDescriptorSet(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLayout, 0, 1, &ctx->wds[1]); + if (ctx->pattern){ + if (ctx->pattern->type == VKVG_PATTERN_TYPE_SURFACE) + CmdPushDescriptorSet(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLayout, 0, 1, &ctx->wds[0]); + else if (ctx->pattern->type != VKVG_PATTERN_TYPE_SOLID) + CmdPushDescriptorSet(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLayout, 0, 1, &ctx->wds[2]); + } }else{ CmdBindDescriptorSets(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLayout, 0, 1, &ctx->dsSrc, 0, NULL); @@ -624,7 +629,7 @@ void _update_cur_pattern (VkvgContext ctx, VkvgPattern pat) { vkh_image_set_layout (ctx->cmd, surf->img, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); - CmdPushDescriptorSet(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLayout, 0, 1, &ctx->wds[1]); + CmdPushDescriptorSet(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLayout, 0, 1, &ctx->wds[0]); } } //flush ctx in two steps to add the src transitioning in the cmd buff @@ -669,11 +674,12 @@ void _update_cur_pattern (VkvgContext ctx, VkvgPattern pat) { case VKVG_PATTERN_TYPE_LINEAR: _flush_cmd_buff (ctx); - if (lastPat && lastPat->type == VKVG_PATTERN_TYPE_SURFACE) - _update_descriptor_set (ctx, ctx->pSurf->dev->emptyImg, ctx->dsSrc,1); + //if (lastPat && lastPat->type == VKVG_PATTERN_TYPE_SURFACE) + // _update_descriptor_set (ctx, ctx->pSurf->dev->emptyImg, ctx->dsSrc,1); - vec4 bounds = {ctx->pSurf->width, ctx->pSurf->height, 0, 0};//store img bounds in unused source field - ctx->pushConsts.source = bounds; + ctx->pushConsts.source = (vec4){ctx->pSurf->width, ctx->pSurf->height, 0, 0};//store img bounds in unused source field + ctx->pushConsts.patternType = pat->type; + ctx->pushCstDirty = true; //transform control point with current ctx matrix vkvg_gradient_t grad = {}; @@ -685,7 +691,8 @@ void _update_cur_pattern (VkvgContext ctx, VkvgPattern pat) { memcpy(ctx->uboGrad.allocInfo.pMappedData , &grad, sizeof(vkvg_gradient_t)); - //_init_cmd_buff (ctx); + if (CmdPushDescriptorSet != VK_NULL_HANDLE && ctx->cmdStarted) + CmdPushDescriptorSet(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLayout, 0, 1, &ctx->wds[2]); break; } diff --git a/src/vkvg_device_internal.c b/src/vkvg_device_internal.c index 8bc4023..0404c4b 100644 --- a/src/vkvg_device_internal.c +++ b/src/vkvg_device_internal.c @@ -366,7 +366,6 @@ void _createDescriptorSetLayout (VkvgDevice dev) { VkPushConstantRange pushConstantRange[] = { {VK_SHADER_STAGE_VERTEX_BIT,0,sizeof(push_constants)}, - //{VK_SHADER_STAGE_FRAGMENT_BIT,0,sizeof(push_constants)} }; //VkDescriptorSetLayout dsls[] = {dev->dslFont,dev->dslSrc,dev->dslGrad}; diff --git a/tests/curve2.c b/tests/curve2.c index 683c29b..76a115d 100644 --- a/tests/curve2.c +++ b/tests/curve2.c @@ -14,7 +14,9 @@ void test(){ vkvg_set_source_rgba (ctx, 1,0,0,1); vkvg_set_line_width(ctx, 40); - vkvg_stroke(ctx); + vkvg_stroke_preserve(ctx); + vkvg_set_source_rgba (ctx, 1,1,0,1); + vkvg_fill(ctx); vkvg_destroy(ctx); } diff --git a/tests/gradient_transform.c b/tests/gradient_transform.c index 196fe9e..917a366 100644 --- a/tests/gradient_transform.c +++ b/tests/gradient_transform.c @@ -8,16 +8,18 @@ void test(){ vkvg_translate(ctx,100,100); vkvg_rotate(ctx,0.5); - vkvg_scale(ctx,2,2); + //vkvg_scale(ctx,2,2); VkvgPattern pat = vkvg_pattern_create_linear(0,0,200,0); + vkvg_pattern_set_extend(pat, VKVG_EXTEND_REPEAT); vkvg_set_line_width(ctx, 20); vkvg_pattern_add_color_stop(pat, 0, 1, 0, 0, 1); vkvg_pattern_add_color_stop(pat, 0.5, 0, 1, 0, 1); vkvg_pattern_add_color_stop(pat, 1, 0, 0, 1, 1); vkvg_set_source (ctx, pat); - vkvg_rectangle(ctx,0,0,200,200); - vkvg_fill (ctx); + //vkvg_rectangle(ctx,0,0,200,200); + //vkvg_fill (ctx); //vkvg_stroke (ctx); + vkvg_paint(ctx); vkvg_pattern_destroy (pat); vkvg_destroy(ctx); diff --git a/tests/svg.c b/tests/svg.c index 3e3428b..4fa620e 100644 --- a/tests/svg.c +++ b/tests/svg.c @@ -58,7 +58,7 @@ void test_svg () { vkvg_matrix_translate(&mat,-512,-400); VkvgContext ctx = vkvg_create(surf); - vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_EVEN_ODD); + vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_NON_ZERO); vkvg_set_source_rgba(ctx,1.0,1.0,1.0,1); vkvg_paint(ctx);