vkh_cmd_end (dev->cmd);
_submit_cmd (dev, &dev->cmd, dev->fence);
}
+
+void _dump_image_format_properties (VkvgDevice dev) {
+ VkImageFormatProperties imgProps;
+ VK_CHECK_RESULT(vkGetPhysicalDeviceImageFormatProperties(dev->phy,
+ FB_COLOR_FORMAT, VK_IMAGE_TYPE_2D, VKVG_TILING,
+ VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+ 0, &imgProps));
+ printf ("tiling = %d\n", VKVG_TILING);
+ printf ("max extend = (%d, %d, %d)\n", imgProps.maxExtent.width, imgProps.maxExtent.height, imgProps.maxExtent.depth);
+ printf ("max mip levels = %d\n", imgProps.maxMipLevels);
+ printf ("max array layers = %d\n", imgProps.maxArrayLayers);
+ printf ("sample counts = ");
+ if (imgProps.sampleCounts & VK_SAMPLE_COUNT_1_BIT)
+ printf ("1,");
+ if (imgProps.sampleCounts & VK_SAMPLE_COUNT_2_BIT)
+ printf ("2,");
+ if (imgProps.sampleCounts & VK_SAMPLE_COUNT_4_BIT)
+ printf ("4,");
+ if (imgProps.sampleCounts & VK_SAMPLE_COUNT_8_BIT)
+ printf ("8,");
+ if (imgProps.sampleCounts & VK_SAMPLE_COUNT_16_BIT)
+ printf ("16,");
+ if (imgProps.sampleCounts & VK_SAMPLE_COUNT_32_BIT)
+ printf ("32,");
+ printf ("\n");
+ printf ("max resource size= %lu\n", imgProps.maxResourceSize);
+
+
+}
_submit_cmd (dev, &cmd, dev->fence);
}
-void _init_surface (VkvgSurface surf) {
- surf->format = FB_COLOR_FORMAT;//force bgra internally
+void _create_surface_main_image (VkvgSurface surf){
surf->img = vkh_image_create((VkhDevice)surf->dev,surf->format,surf->width,surf->height,VKVG_TILING,VMA_MEMORY_USAGE_GPU_ONLY,
VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+ vkh_image_create_descriptor(surf->img, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
+}
+void _create_surface_ms_images (VkvgSurface surf) {
surf->imgMS = vkh_image_ms_create((VkhDevice)surf->dev,surf->format,surf->dev->samples,surf->width,surf->height,VMA_MEMORY_USAGE_GPU_ONLY,
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
surf->stencilMS = vkh_image_ms_create((VkhDevice)surf->dev,VK_FORMAT_S8_UINT,surf->dev->samples,surf->width,surf->height,VMA_MEMORY_USAGE_GPU_ONLY,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
-
- vkh_image_create_descriptor(surf->img, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
vkh_image_create_descriptor(surf->imgMS, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
vkh_image_create_descriptor(surf->stencilMS, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_STENCIL_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
-
+}
+void _create_framebuffer (VkvgSurface surf) {
VkImageView attachments[] = {
vkh_image_get_view (surf->imgMS),
vkh_image_get_view (surf->img),
.height = surf->height,
.layers = 1 };
VK_CHECK_RESULT(vkCreateFramebuffer(surf->dev->vkDev, &frameBufferCreateInfo, NULL, &surf->fb));
+}
+void _init_surface (VkvgSurface surf) {
+ surf->format = FB_COLOR_FORMAT;//force bgra internally
+
+ _create_surface_main_image (surf);
+ _create_surface_ms_images (surf);
+ _create_framebuffer (surf);
- _clear_surface(surf, VK_IMAGE_ASPECT_STENCIL_BIT);
+ _clear_surface (surf, VK_IMAGE_ASPECT_STENCIL_BIT);
}
void vkvg_surface_clear (VkvgSurface surf) {
_clear_surface(surf, VK_IMAGE_ASPECT_STENCIL_BIT|VK_IMAGE_ASPECT_COLOR_BIT);
return surf;
}
+VkvgSurface vkvg_surface_create_for_VkhImage (VkvgDevice dev, void* vkhImg) {
+ VkhImage img = (VkhImage)vkhImg;
+ VkvgSurface surf = (vkvg_surface*)calloc(1,sizeof(vkvg_surface));
+
+ surf->format = FB_COLOR_FORMAT;//force bgra internally
+ surf->dev = dev;
+ surf->width = img->infos.extent.width;
+ surf->height= img->infos.extent.height;
+
+ surf->img = img;
+
+ vkh_image_create_sampler(img, VK_FILTER_NEAREST, VK_FILTER_NEAREST,
+ VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
+
+ _create_surface_ms_images (surf);
+ _create_framebuffer (surf);
+ _clear_surface (surf, VK_IMAGE_ASPECT_STENCIL_BIT);
+
+ surf->references = 1;
+ vkvg_device_reference (surf->dev);
+
+ return surf;
+}
//TODO: it would be better to blit in original size and create ms final image with dest surf dims
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));
if (surf->references > 0)
return;
vkDestroyFramebuffer(surf->dev->vkDev, surf->fb, NULL);
- vkh_image_destroy(surf->img);
+ if (!surf->img->imported)
+ vkh_image_destroy(surf->img);
vkh_image_destroy(surf->imgMS);
vkh_image_destroy(surf->stencilMS);
bool vkeCheckPhyPropBlitSource (VkEngine e) {
VkFormatProperties formatProps;
vkGetPhysicalDeviceFormatProperties(e->dev->phy, e->renderer->format, &formatProps);
+
+#if VKVG_TILING_OPTIMAL
assert((formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT) && "Format cannot be used as transfer source");
+#else
+ assert((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT) && "Format cannot be used as transfer source");
+#endif
}
VkSampleCountFlagBits getMaxUsableSampleCount(VkSampleCountFlags counts)
static char const * dlay [] = {"VK_LAYER_LUNARG_standard_validation"};
#else
uint32_t dlayCpt = 0;
- static char const * dlay [] = {};
+ static char const * dlay [] = {NULL};
#endif
VkPhysicalDeviceFeatures enabledFeatures = {
.fillModeNonSolid = true,
e->renderer = vkh_presenter_create
(e->dev, pi->pQueue, surf, width, height, VK_FORMAT_B8G8R8A8_UNORM, VK_PRESENT_MODE_MAILBOX_KHR);
-
vkh_app_free_phyinfos (phyCount, phys);
+ vkeCheckPhyPropBlitSource (e);
+
return e;
}