typedef struct _vkvg_device_t* VkvgDevice;
typedef struct _vkvg_pattern_t* VkvgPattern;
-VkvgDevice vkvg_device_create (VkPhysicalDevice phy, VkDevice vkdev, uint32_t qFamIdx, uint32_t qIndex);
+VkvgDevice vkvg_device_create (VkInstance inst, VkPhysicalDevice phy, VkDevice vkdev, uint32_t qFamIdx, uint32_t qIndex);
void vkvg_device_destroy (VkvgDevice dev);
VkvgDevice vkvg_device_reference (VkvgDevice dev);
uint32_t vkvg_device_get_reference_count (VkvgDevice dev);
j+=2;
}
dlpCount = 0;
- vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLineList);
- vkCmdDrawIndexed(ctx->cmd, ctx->indCount-ctx->curIndStart, 1, ctx->curIndStart, 0, 1);
+ CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLineList);
+ CmdDrawIndexed(ctx->cmd, ctx->indCount-ctx->curIndStart, 1, ctx->curIndStart, 0, 1);
_flush_cmd_buff(ctx);
#endif
*/
_clear_path(ctx);
}
void _poly_fill (VkvgContext ctx){
- vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelinePolyFill);
+ CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelinePolyFill);
uint32_t ptrPath = 0;;
Vertex v = {};
}
LOG(LOG_INFO_PATH, "\tpoly fill: point count = %d; 1st vert = %d; vert count = %d\n", pathPointCount, firstVertIdx, ctx->vertCount - firstVertIdx);
- vkCmdDraw (ctx->cmd, pathPointCount, 1, firstVertIdx ,0);
+ CmdDraw (ctx->cmd, pathPointCount, 1, firstVertIdx ,0);
ptrPath+=2;
}
_check_cmd_buff_state(ctx);
_poly_fill (ctx);
- vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineClipping);
- vkCmdDrawIndexed (ctx->cmd,6,1,0,0,0);
+ CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineClipping);
+ CmdDrawIndexed (ctx->cmd,6,1,0,0,0);
//should test current operator to bind correct pipeline
_bind_draw_pipeline (ctx);
- vkCmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
+ CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
}
void vkvg_fill_preserve (VkvgContext ctx){
if (ctx->pathPtr == 0) //nothing to fill
_poly_fill (ctx);
_bind_draw_pipeline (ctx);
- vkCmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_FILL_BIT);
- vkCmdDrawIndexed (ctx->cmd,6,1,0,0,0);
- vkCmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
+ CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_FILL_BIT);
+ CmdDrawIndexed (ctx->cmd,6,1,0,0,0);
+ CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
}
void vkvg_stroke_preserve (VkvgContext ctx)
{
}
void vkvg_paint (VkvgContext ctx){
_check_cmd_buff_state(ctx);
- vkCmdDrawIndexed (ctx->cmd,6,1,0,0,0);
+ CmdDrawIndexed (ctx->cmd,6,1,0,0,0);
}
inline void vkvg_set_source_rgb (VkvgContext ctx, float r, float g, float b) {
vkvg_set_source_rgba (ctx, r, g, b, 1);
if (ctx->indCount == ctx->curIndStart)
return;
_check_cmd_buff_state(ctx);
- vkCmdDrawIndexed(ctx->cmd, ctx->indCount - ctx->curIndStart, 1, ctx->curIndStart, 0, 1);
+ CmdDrawIndexed(ctx->cmd, ctx->indCount - ctx->curIndStart, 1, ctx->curIndStart, 0, 1);
//DEBUG
- /*vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineWired);
- vkCmdDrawIndexed(ctx->cmd, ctx->indCount - ctx->curIndStart, 1, ctx->curIndStart, 0, 1);
- vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_OVER);*/
+ /*CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineWired);
+ CmdDrawIndexed(ctx->cmd, ctx->indCount - ctx->curIndStart, 1, ctx->curIndStart, 0, 1);
+ CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_OVER);*/
//////////
ctx->curIndStart = ctx->indCount;
void _end_render_pass (VkvgContext ctx) {
LOG(LOG_INFO, "FLUSH Context: ctx = %lu; vert cpt = %d; ind cpt = %d\n", ctx, ctx->vertCount -4, ctx->indCount - 6);
_record_draw_cmd (ctx);
- vkCmdEndRenderPass (ctx->cmd);
+ CmdEndRenderPass (ctx->cmd);
}
void _flush_cmd_buff (VkvgContext ctx){
if (!ctx->cmdStarted)
void _bind_draw_pipeline (VkvgContext ctx) {
switch (ctx->curOperator) {
case VKVG_OPERATOR_OVER:
- vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_OVER);
+ CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_OVER);
break;
case VKVG_OPERATOR_CLEAR:
vkvg_set_source_rgba(ctx,0,0,0,0);
- vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_CLEAR);
+ CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_CLEAR);
break;
default:
- vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_OVER);
+ CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_OVER);
break;
}
}
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
}
- vkCmdBeginRenderPass (ctx->cmd, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+ CmdBeginRenderPass (ctx->cmd, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
VkViewport viewport = {0,0,ctx->pSurf->width,ctx->pSurf->height,0,1};
- vkCmdSetViewport(ctx->cmd, 0, 1, &viewport);
+ CmdSetViewport(ctx->cmd, 0, 1, &viewport);
VkRect2D scissor = {{0,0},{ctx->pSurf->width,ctx->pSurf->height}};
- vkCmdSetScissor(ctx->cmd, 0, 1, &scissor);
+ CmdSetScissor(ctx->cmd, 0, 1, &scissor);
VkDescriptorSet dss[] = {ctx->dsFont,ctx->dsSrc,ctx->dsGrad};
- vkCmdBindDescriptorSets(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLayout,
+ CmdBindDescriptorSets(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLayout,
0, 3, dss, 0, NULL);
VkDeviceSize offsets[1] = { 0 };
- vkCmdBindVertexBuffers(ctx->cmd, 0, 1, &ctx->vertices.buffer, offsets);
- vkCmdBindIndexBuffer(ctx->cmd, ctx->indices.buffer, 0, VK_INDEX_TYPE_UINT32);
+ CmdBindVertexBuffers(ctx->cmd, 0, 1, &ctx->vertices.buffer, offsets);
+ CmdBindIndexBuffer(ctx->cmd, ctx->indices.buffer, 0, VK_INDEX_TYPE_UINT32);
_bind_draw_pipeline (ctx);
- vkCmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
+ CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
_update_push_constants (ctx);
ctx->cmdStarted = true;
ctx->pushCstDirty = true;
}
inline void _update_push_constants (VkvgContext ctx) {
- vkCmdPushConstants(ctx->cmd, ctx->pSurf->dev->pipelineLayout,
+ CmdPushConstants(ctx->cmd, ctx->pSurf->dev->pipelineLayout,
VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(push_constants),&ctx->pushConsts);
ctx->pushCstDirty = false;
}
#include "vkh_phyinfo.h"
#include "vk_mem_alloc.h"
-VkvgDevice vkvg_device_create(VkPhysicalDevice phy, VkDevice vkdev, uint32_t qFamIdx, uint32_t qIndex)
+VkvgDevice vkvg_device_create(VkInstance inst, VkPhysicalDevice phy, VkDevice vkdev, uint32_t qFamIdx, uint32_t qIndex)
{
LOG(LOG_INFO, "CREATE Device: qFam = %d; qIdx = %d\n", qFamIdx, qIndex);
VkvgDevice dev = (vkvg_device*)malloc(sizeof(vkvg_device));
+ dev->instance = inst;
dev->hdpi = 72;
dev->vdpi = 72;
dev->vkDev = vkdev;
dev->phy = phy;
+ CmdBindPipeline = vkGetInstanceProcAddr(inst, "vkCmdBindPipeline");
+ CmdBindDescriptorSets = vkGetInstanceProcAddr(inst, "vkCmdBindDescriptorSets");
+ CmdBindIndexBuffer = vkGetInstanceProcAddr(inst, "vkCmdBindIndexBuffer");
+ CmdBindVertexBuffers = vkGetInstanceProcAddr(inst, "vkCmdBindVertexBuffers");
+ CmdDrawIndexed = vkGetInstanceProcAddr(inst, "vkCmdDrawIndexed");
+ CmdDraw = vkGetInstanceProcAddr(inst, "vkCmdDraw");
+ CmdSetStencilCompareMask= vkGetInstanceProcAddr(inst, "vkCmdSetStencilCompareMask");
+ CmdBeginRenderPass = vkGetInstanceProcAddr(inst, "vkCmdBeginRenderPass");
+ CmdEndRenderPass = vkGetInstanceProcAddr(inst, "vkCmdEndRenderPass");
+ CmdSetViewport = vkGetInstanceProcAddr(inst, "vkCmdSetViewport");
+ CmdSetScissor = vkGetInstanceProcAddr(inst, "vkCmdSetScissor");
+ CmdPushConstants = vkGetInstanceProcAddr(inst, "vkCmdPushConstants");
+
VkhPhyInfo phyInfos = vkh_phyinfo_create (dev->phy, NULL);
dev->phyMemProps = phyInfos->memProps;
#define STENCIL_CLIP_BIT 0x2
#define STENCIL_ALL_BIT 0x3
+PFN_vkCmdBindPipeline CmdBindPipeline;
+PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets;
+PFN_vkCmdBindIndexBuffer CmdBindIndexBuffer;
+PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers;
+
+PFN_vkCmdDrawIndexed CmdDrawIndexed;
+PFN_vkCmdDraw CmdDraw;
+
+PFN_vkCmdSetStencilCompareMask CmdSetStencilCompareMask;
+PFN_vkCmdBeginRenderPass CmdBeginRenderPass;
+PFN_vkCmdEndRenderPass CmdEndRenderPass;
+PFN_vkCmdSetViewport CmdSetViewport;
+PFN_vkCmdSetScissor CmdSetScissor;
+
+PFN_vkCmdPushConstants CmdPushConstants;
+
+
typedef struct _vkvg_device_t{
VkDevice vkDev;
VkPhysicalDeviceMemoryProperties phyMemProps;
int hdpi,
vdpi;
+ VkInstance instance;
+
_font_cache_t* fontCache;
VkvgContext lastCtx; //double linked list last elmt
#include <stdint.h>
#include <stdbool.h>
#include "vectors.h"
+
#endif
VkhPresenter r = e->renderer;
vkengine_set_key_callback (e, key_callback);
- device = vkvg_device_create (r->dev->phy, r->dev->dev, r->qFam, 0);
+ device = vkvg_device_create (vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0);
surf = vkvg_surface_create(device, width, height);
//test_svg();