typedef struct _vkvg_device_t* VkvgDevice;
typedef struct _vkvg_pattern_t* VkvgPattern;
-VkvgDevice vkvg_device_create (VkPhysicalDevice phy, VkDevice vkdev);
+VkvgDevice vkvg_device_create (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);
vkvg_line_cap_t vkvg_get_line_cap (VkvgContext ctx);
vkvg_line_join_t vkvg_get_line_join (VkvgContext ctx);
vkvg_operator_t vkvg_get_operator (VkvgContext ctx);
+VkvgPattern vkvg_get_source (VkvgContext ctx);
void vkvg_save (VkvgContext ctx);
void vkvg_restore (VkvgContext ctx);
_flush_cmd_buff(ctx);
+ if (ctx->pattern)
+ vkvg_pattern_destroy (ctx->pattern);
+
VkDevice dev = ctx->pSurf->dev->vkDev;
vkDestroyFence (dev, ctx->flushFence,NULL);
vkvg_operator_t vkvg_get_operator (VkvgContext ctx){
return ctx->curOperator;
}
+VkvgPattern vkvg_get_source (VkvgContext ctx){
+ vkvg_pattern_reference (ctx->pattern);
+ return ctx->pattern;
+}
void vkvg_select_font_face (VkvgContext ctx, const char* name){
_select_font_face (ctx, name);
vkh_cmd_begin (ctx->cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
vkh_image_set_layout (ctx->cmd, sav->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
VkImageCopy cregion = { .srcSubresource = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 0, 1},
.dstSubresource = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 0, 1},
1, &cregion);
vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT);
VK_CHECK_RESULT(vkEndCommandBuffer(ctx->cmd));
_submit_ctx_cmd(ctx);
vkh_cmd_begin (ctx->cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
vkh_image_set_layout (ctx->cmd, sav->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
VkImageCopy cregion = { .srcSubresource = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 0, 1},
.dstSubresource = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 0, 1},
vkh_image_get_vkimage (ctx->pSurf->stencilMS),VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1, &cregion);
vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT);
VK_CHECK_RESULT(vkEndCommandBuffer(ctx->cmd));
_submit_ctx_cmd(ctx);
}
void _explicit_ms_resolve (VkvgContext ctx){
vkh_image_set_layout (ctx->cmd, ctx->pSurf->imgMS, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
vkh_image_set_layout (ctx->cmd, ctx->pSurf->img, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
VkImageResolve re = {
.extent = {ctx->pSurf->width, ctx->pSurf->height,1},
vkh_image_get_vkimage (ctx->pSurf->img) ,VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1,&re);
vkh_image_set_layout (ctx->cmd, ctx->pSurf->imgMS, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL ,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
}
void _flush_cmd_buff (VkvgContext ctx){
vkh_cmd_begin (ctx->cmd,VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
vkh_image_set_layout (ctx->cmd, ctx->source, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
vkh_cmd_end (ctx->cmd);
_submit_wait_and_reset_cmd (ctx);
#include "vkh_queue.h"
#include "vkh_phyinfo.h"
-VkvgDevice vkvg_device_create(VkPhysicalDevice phy, VkDevice vkdev)
+VkvgDevice vkvg_device_create(VkPhysicalDevice phy, VkDevice vkdev, uint32_t qFamIdx, uint32_t qIndex)
{
VkvgDevice dev = (vkvg_device*)malloc(sizeof(vkvg_device));
VkhPhyInfo phyInfos = vkh_phyinfo_create (dev->phy, NULL);
dev->phyMemProps = phyInfos->memProps;
- dev->gQueue = vkh_queue_create (dev, phyInfos->gQueue, 0, phyInfos->queues[phyInfos->gQueue].queueFlags);
+ dev->gQueue = vkh_queue_create (dev, qFamIdx, qIndex, phyInfos->queues[qFamIdx].queueFlags);
vkh_phyinfo_destroy (phyInfos);
dev->cmd = vkh_cmd_buff_create (dev, dev->cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
dev->fence = vkh_fence_create_signaled (dev);
- _create_pipeline_cache (dev);
+ //_create_pipeline_cache (dev);
_init_fonts_cache (dev);
_setupRenderPass (dev);
_createDescriptorSetLayout (dev);
vkDestroyPipeline (dev->vkDev, dev->pipelineLineList, NULL);
vkDestroyPipelineLayout (dev->vkDev, dev->pipelineLayout, NULL);
- vkDestroyPipelineCache (dev->vkDev, dev->pipelineCache, NULL);
+ //vkDestroyPipelineCache (dev->vkDev, dev->pipelineCache, NULL);
vkDestroyRenderPass (dev->vkDev, dev->renderPass, NULL);
vkWaitForFences (dev->vkDev, 1, &dev->fence, VK_TRUE, UINT64_MAX);
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
- .finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
+ .initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ .finalLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL };
VkAttachmentDescription attColorResolve = {
.format = FB_COLOR_FORMAT,
.samples = VK_SAMPLE_COUNT_1_BIT,
- .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
- .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
+ .loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
- .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
- .finalLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL };
+ .initialLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ .finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
VkAttachmentDescription attDS = {
.format = VK_FORMAT_S8_UINT,
.samples = VKVG_SAMPLES,
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ .initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
/* VkAttachmentDescription attDSResolve = {
.format = VK_FORMAT_S8_UINT,
pipelineCreateInfo.layout = dev->pipelineLayout;
- VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipelinePolyFill));
+ VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, VK_NULL_HANDLE, 1, &pipelineCreateInfo, NULL, &dev->pipelinePolyFill));
inputAssemblyState.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
dsStateCreateInfo.back = dsStateCreateInfo.front = clipingOpState;
- VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipelineClipping));
+ VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, VK_NULL_HANDLE, 1, &pipelineCreateInfo, NULL, &dev->pipelineClipping));
dsStateCreateInfo.back = dsStateCreateInfo.front = stencilOpState;
blendAttachmentState.colorWriteMask=0xf;
dynamicState.dynamicStateCount = 3;
- VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipe_OVER));
+ VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, VK_NULL_HANDLE, 1, &pipelineCreateInfo, NULL, &dev->pipe_OVER));
blendAttachmentState.alphaBlendOp = blendAttachmentState.colorBlendOp = VK_BLEND_OP_SUBTRACT;
- VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipe_SUB));
+ VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, VK_NULL_HANDLE, 1, &pipelineCreateInfo, NULL, &dev->pipe_SUB));
blendAttachmentState.blendEnable = VK_FALSE;
//rasterizationState.polygonMode = VK_POLYGON_MODE_POINT;
//shaderStages[1].pName = "op_CLEAR";
- VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipe_CLEAR));
+ VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, VK_NULL_HANDLE, 1, &pipelineCreateInfo, NULL, &dev->pipe_CLEAR));
rasterizationState.polygonMode = VK_POLYGON_MODE_FILL;
inputAssemblyState.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
shaderStages[1].pName = "main";
- VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipelineLineList));
+ VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, VK_NULL_HANDLE, 1, &pipelineCreateInfo, NULL, &dev->pipelineLineList));
shaderStages[1].module = modFragWired;
//pipelineCreateInfo.pStages = shaderStages;
inputAssemblyState.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
rasterizationState.polygonMode = VK_POLYGON_MODE_LINE;
- VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipelineWired));
+ VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, VK_NULL_HANDLE, 1, &pipelineCreateInfo, NULL, &dev->pipelineWired));
vkDestroyShaderModule(dev->vkDev, modVert, NULL);
vkDestroyShaderModule(dev->vkDev, modFrag, NULL);
vkh_image_get_vkimage (newImg), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
vkh_image_set_layout_subres(cache->cmd, newImg, subresNew, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
VK_CHECK_RESULT(vkEndCommandBuffer(cache->cmd));
vkh_image_get_vkimage (cache->cacheTex), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &bufferCopyRegion);
vkh_image_set_layout_subres(cache->cmd, cache->cacheTex, subres, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
VK_CHECK_RESULT(vkEndCommandBuffer(cache->cmd));
VkImageSubresourceRange range = {VK_IMAGE_ASPECT_STENCIL_BIT,0,1,0,1};
vkh_image_set_layout (cmd, surf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
vkCmdClearDepthStencilImage (cmd, vkh_image_get_vkimage (surf->stencilMS),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,&clr,1,&range);
vkh_image_set_layout (cmd, surf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+ VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT);
vkh_cmd_end (cmd);
vkh_cmd_submit (dev->gQueue, &cmd, dev->fence);
_clear_stencil(surf);
}
+
+void vkvg_surface_test (VkvgSurface* pSurf, VkvgSurface surf) {
+ pSurf = &surf;
+}
VkvgSurface vkvg_surface_create(VkvgDevice dev, uint32_t width, uint32_t height){
VkvgSurface surf = (vkvg_surface*)calloc(1,sizeof(vkvg_surface));
return surf;
}
-
-VkvgSurface vkvg_surface_create_from_image (VkvgDevice dev, const char* filePath) {
- int w = 0,
- h = 0,
- channels = 0;
- unsigned char *img = stbi_load(filePath, &w, &h, &channels, 4);//force 4 components per pixel
- if (img == NULL){
- fprintf (stderr, "Could not load texture from %s, %s\n", filePath, stbi_failure_reason());
- return NULL;
- }
-
+VkvgSurface vkvg_surface_create_from_bitmap (VkvgDevice dev, unsigned char* img, uint32_t width, uint32_t height) {
VkvgSurface surf = (vkvg_surface*)calloc(1,sizeof(vkvg_surface));
surf->dev = dev;
- surf->width = w;
- surf->height = h;
+ surf->width = width;
+ surf->height = height;
_init_surface (surf);
- uint32_t imgSize = w * h * 4;
+ uint32_t imgSize = width * height * 4;
VkImageSubresourceLayers imgSubResLayers = {VK_IMAGE_ASPECT_COLOR_BIT,0,0,1};
//original format image
VkhImage stagImg= vkh_image_create (surf->dev,VK_FORMAT_R8G8B8A8_UNORM,surf->width,surf->height,VK_IMAGE_TILING_LINEAR,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT);
//bgra bliting target
VkhImage tmpImg = vkh_image_create (surf->dev,surf->format,surf->width,surf->height,VK_IMAGE_TILING_LINEAR,
VK_CHECK_RESULT (vkh_buffer_map (buff));
memcpy (vkh_buffer_get_mapped_pointer (buff), img, imgSize);
+ /*unsigned char* mapImg = vkh_image_map (stagImg);
+ memcpy (mapImg, img, imgSize);
+ vkh_image_unmap (stagImg);*/
+
VkCommandBuffer cmd = dev->cmd;
_wait_device_fence (dev);
vkh_cmd_begin (cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
vkh_image_set_layout (cmd, stagImg, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
VkBufferImageCopy bufferCopyRegion = { .imageSubresource = imgSubResLayers,
vkh_image_get_vkimage (stagImg), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &bufferCopyRegion);
vkh_image_set_layout (cmd, stagImg, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
+ VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
vkh_image_set_layout (cmd, tmpImg, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
vkh_image_get_vkimage (stagImg), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
vkh_image_get_vkimage (tmpImg), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit, VK_FILTER_LINEAR);
+ vkh_image_set_layout (cmd, tmpImg, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
+
vkh_cmd_end (cmd);
vkh_cmd_submit (dev->gQueue, &cmd, dev->fence);
//create tmp context with rendering pipeline to create the multisample img
VkvgContext ctx = vkvg_create (surf);
- VkClearAttachment ca = {VK_IMAGE_ASPECT_COLOR_BIT,0, { 0.0f, 0.0f, 0.0f, 0.0f }};
+/* VkClearAttachment ca = {VK_IMAGE_ASPECT_COLOR_BIT,0, { 0.0f, 0.0f, 0.0f, 0.0f }};
VkClearRect cr = {{{0,0},{surf->width,surf->height}},0,1};
- vkCmdClearAttachments(ctx->cmd, 1, &ca, 1, &cr);
+ vkCmdClearAttachments(ctx->cmd, 1, &ca, 1, &cr);*/
vec4 srcRect = {0,0,surf->width,surf->height};
ctx->pushConsts.source = srcRect;
return surf;
}
+VkvgSurface vkvg_surface_create_from_image (VkvgDevice dev, const char* filePath) {
+ int w = 0,
+ h = 0,
+ channels = 0;
+ unsigned char *img = stbi_load(filePath, &w, &h, &channels, 4);//force 4 components per pixel
+ if (img == NULL){
+ fprintf (stderr, "Could not load texture from %s, %s\n", filePath, stbi_failure_reason());
+ return NULL;
+ }
+
+ VkvgSurface surf = vkvg_surface_create_from_bitmap(dev, img, w, h);
+
+ stbi_image_free (img);
+
+ return surf;
+}
void vkvg_surface_destroy(VkvgSurface surf)
{
#define NANOSVG_IMPLEMENTATION // Expands implementation
#include "nanosvg.h"
#include "vkh_device.h"
+#include "vkh_presenter.h"
VkvgDevice device;
VkvgSurface surf = NULL;
imgSurf = vkvg_surface_create_from_image(device, "/mnt/data/images/miroir.jpg");
vkvg_set_source_surface(ctx, imgSurf, 0, 0);
vkvg_paint(ctx);
- vkvg_flush(ctx);
- vkvg_set_source_rgba(ctx,0,0,0,1);
+ //vkvg_flush(ctx);
+ vkvg_set_source_rgba(ctx,1,0,0,1);
vkvg_surface_destroy(imgSurf);
}
void test_line_caps (VkvgContext ctx) {
void multi_test1 () {
VkvgSurface surf2 = vkvg_surface_create (device,800,800);;
- VkvgContext ctx = vkvg_create(surf2);
+ VkvgContext ctx = vkvg_create (surf2);
vkvg_set_source_rgba(ctx,0.1,0.1,0.3,1.0);
vkvg_paint(ctx);
vkvg_paint(ctx);
vkvg_rotate(ctx,0.7);
vkvg_paint(ctx);
-
+ vkvg_pattern_destroy (pat);
vkvg_destroy(ctx);
vkvg_surface_destroy(surf2);
}
// cairo_test_clip(ctx);
// vkvg_reset_clip(ctx);
+ //test_img_surface (ctx);
cairo_print_arc(ctx);
vkvg_translate(ctx,250,0);
cairo_test_rounded_rect(ctx);
+
/*
vkvg_set_operator(ctx, VKVG_OPERATOR_CLEAR);
vkvg_rectangle(ctx,100,100,500,500);
vkvg_set_operator(ctx, VKVG_OPERATOR_OVER);
*/
+
vkvg_translate(ctx,-450,250);
cairo_test_fill_and_stroke2(ctx);
vkvg_destroy(ctx);
}
+void test_painting () {
+ VkvgSurface surf2 = vkvg_surface_create (device,400,400);;
+ VkvgContext ctx = vkvg_create (surf2);
+
+ vkvg_set_source_rgba(ctx,1.0,0.,0.,1.0);
+ vkvg_paint (ctx);
+
+ vkvg_destroy (ctx);
+ ctx = vkvg_create (surf);
+
+ vkvg_set_source_rgba(ctx,0.1,0.1,0.3,1.0);
+ vkvg_paint (ctx);
+
+ //vkvg_set_source_surface(ctx,surf2,0,0);
+
+ //VkvgPattern pat = vkvg_get_source (ctx);
+ VkvgPattern pat = vkvg_pattern_create_for_surface(surf2);
+ vkvg_pattern_set_extend (pat,VKVG_EXTEND_REFLECT);
+ vkvg_set_source(ctx,pat);
+ //vkvg_paint (ctx);
+ //vkvg_set_source_rgba(ctx,0,1,0,1.0);
+ vkvg_rectangle(ctx,100,100,200,200);
+ vkvg_fill(ctx);
+
+ vkvg_destroy (ctx);
+ vkvg_surface_destroy (surf2);
+ vkvg_pattern_destroy (pat);
+}
+
int main(int argc, char *argv[]) {
//dumpLayerExts();
- vk_engine_t* e = vke_create (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, 1024, 800);
+ vk_engine_t* e = vkengine_create (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, 1024, 800);
VkhPresenter r = e->renderer;
- vke_set_key_callback (e, key_callback);
+ vkengine_set_key_callback (e, key_callback);
- device = vkvg_device_create (e->dev->phy, e->dev->dev);
+ device = vkvg_device_create (r->dev->phy, r->dev->dev, r->qFam, 0);
surf = vkvg_surface_create(device, 1024, 800);
//test_svg();
- //multi_test1();
+ //
//test_grad_transforms();
vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf));
- while (!vke_should_close (e)) {
+ while (!vkengine_should_close (e)) {
glfwPollEvents();
cairo_tests();
+ //multi_test1();
+ //test_painting();
if (!vkh_presenter_draw (r))
vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf));
}
vkvg_surface_destroy (surf);
vkvg_device_destroy (device);
- vke_destroy (e);
+ vkengine_destroy (e);
return 0;
}
#include "vkh_image.h"
#include "vkh_device.h"
-
-bool vkeCheckPhyPropBlitSource (vk_engine_t *e) {
+bool vkeCheckPhyPropBlitSource (VkEngine e) {
VkFormatProperties formatProps;
vkGetPhysicalDeviceFormatProperties(e->dev->phy, e->renderer->format, &formatProps);
assert((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT) && "Format cannot be used as transfer source");
}
-
VkSampleCountFlagBits getMaxUsableSampleCount(VkSampleCountFlags counts)
{
if (counts & VK_SAMPLE_COUNT_64_BIT) { return VK_SAMPLE_COUNT_64_BIT; }
return VK_SAMPLE_COUNT_1_BIT;
}
-void vkengine_dump_Infos (vk_engine_t* e){
+void vkengine_dump_Infos (VkEngine e){
printf("max samples = %d\n", getMaxUsableSampleCount(e->gpu_props.limits.framebufferColorSampleCounts));
printf("max tex2d size = %d\n", e->gpu_props.limits.maxImageDimension2D);
printf("max tex array layers = %d\n", e->gpu_props.limits.maxImageArrayLayers);
printf("\n");
}
}
-vk_engine_t* vke_create (VkPhysicalDeviceType preferedGPU, uint32_t width, uint32_t height) {
+vk_engine_t* vkengine_create (VkPhysicalDeviceType preferedGPU, uint32_t width, uint32_t height) {
vk_engine_t* e = (vk_engine_t*)calloc(1,sizeof(vk_engine_t));
glfwInit();
vkh_app_free_phyinfos (phyCount, phys);
-
return e;
}
-void vke_destroy (vk_engine_t* e) {
+void vkengine_destroy (VkEngine e) {
vkDeviceWaitIdle(e->dev->dev);
- vkDestroySurfaceKHR (e->app->inst, e->renderer->surface, NULL);
+ VkSurfaceKHR surf = e->renderer->surface;
vkh_presenter_destroy (e->renderer);
+ vkDestroySurfaceKHR (e->app->inst, surf, NULL);
vkDestroyDevice (e->dev->dev, NULL);
free(e);
}
-
-static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
- if (action != GLFW_PRESS)
- return;
- switch (key) {
- case GLFW_KEY_ESCAPE :
- glfwSetWindowShouldClose(window, GLFW_TRUE);
- break;
+void vkengine_close (VkEngine e) {
+ glfwSetWindowShouldClose(e->window, GLFW_TRUE);
+}
+void vkengine_blitter_run (VkEngine e, VkImage img) {
+ VkhPresenter p = e->renderer;
+ vkh_presenter_build_blit_cmd (p, img);
+
+ while (!vkengine_should_close (e)) {
+ glfwPollEvents();
+ if (!vkh_presenter_draw (p))
+ vkh_presenter_build_blit_cmd (p, img);
}
}
-static void char_callback (GLFWwindow* window, uint32_t c){}
-static void mouse_move_callback(GLFWwindow* window, double x, double y){}
-static void mouse_button_callback(GLFWwindow* window, int but, int state, int modif){}
-
-inline bool vke_should_close (vk_engine_t* e) {
+inline bool vkengine_should_close (VkEngine e) {
return glfwWindowShouldClose (e->window);
}
-void vke_set_key_callback (vk_engine_t* e, GLFWkeyfun key_callback){
- glfwSetKeyCallback (e->window, key_callback);
+
+VkDevice vkengine_get_device (VkEngine e){
+ return e->dev->dev;
+}
+VkPhysicalDevice vkengine_get_physical_device (VkEngine e){
+ return e->dev->phy;
+}
+VkQueue vkengine_get_queue (VkEngine e){
+ return e->renderer->queue;
+}
+uint32_t vkengine_get_queue_fam_idx (VkEngine e){
+ return e->renderer->qFam;
}
+void vkengine_set_key_callback (VkEngine e, GLFWkeyfun key_callback){
+ glfwSetKeyCallback (e->window, key_callback);
+}
+void vkengine_set_mouse_but_callback (VkEngine e, GLFWmousebuttonfun onMouseBut){
+ glfwSetMouseButtonCallback(e->window, onMouseBut);
+}
+void vkengine_set_cursor_pos_callback (VkEngine e, GLFWcursorposfun onMouseMove){
+ glfwSetCursorPosCallback(e->window, onMouseMove);
+}
+void vkengine_set_scroll_callback (VkEngine e, GLFWscrollfun onScroll){
+ glfwSetScrollCallback(e->window, onScroll);
+}
+void vkengine_set_char_callback (VkEngine e, GLFWcharfun onChar){
+ glfwSetCharCallback(e->window, onChar);
+}
/* renderpass creation and pipeline creation. */
#define FENCE_TIMEOUT 100000000
+typedef struct _vk_engine_t* VkEngine;
typedef struct _vk_engine_t {
VkhApp app;
VkPhysicalDeviceProperties gpu_props;
VkhDevice dev;
GLFWwindow* window;
-
VkhPresenter renderer;
}vk_engine_t;
-vk_engine_t* vke_create (VkPhysicalDeviceType preferedGPU, uint32_t width, uint32_t height);
-void vke_destroy (vk_engine_t* e);
-
-void initPhySurface(VkhPresenter r, VkFormat preferedFormat, VkPresentModeKHR presentMode);
+vk_engine_t* vkengine_create (VkPhysicalDeviceType preferedGPU, uint32_t width, uint32_t height);
-VkSampleCountFlagBits getMaxUsableSampleCount(VkSampleCountFlags counts);
+void vkengine_destroy (VkEngine e);
+bool vkengine_should_close (VkEngine e);
+void vkengine_close (VkEngine e);
+void vkengine_dump_Infos (VkEngine e);
+VkDevice vkengine_get_device (VkEngine e);
+VkPhysicalDevice vkengine_get_physical_device(VkEngine e);
+VkQueue vkengine_get_queue (VkEngine e);
+uint32_t vkengine_get_queue_fam_idx (VkEngine e);
-void vkengine_dump_Infos (vk_engine_t* e);
void vkengine_get_queues_properties (vk_engine_t* e, VkQueueFamilyProperties** qFamProps, uint32_t* count);
-
-//void vke_init_blit_renderer (VkhPresenter r, VkImage blitSource);
-bool vke_should_close (vk_engine_t* e);
-
-//void submitCommandBuffer(VkQueue queue, VkCommandBuffer *pCmdBuff, VkSemaphore* pWaitSemaphore, VkSemaphore* pSignalSemaphore);
-//void draw(vk_engine_t* e, VkImage blitSource);
+void vkengine_set_key_callback (VkEngine e, GLFWkeyfun key_callback);
+void vkengine_set_mouse_but_callback (VkEngine e, GLFWmousebuttonfun onMouseBut);
+void vkengine_set_cursor_pos_callback (VkEngine e, GLFWcursorposfun onMouseMove);
+void vkengine_set_scroll_callback (VkEngine e, GLFWscrollfun onScroll);
+void vkengine_set_char_callback (VkEngine e, GLFWcharfun onChar);
#endif