IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE Debug)
ENDIF()
-MESSAGE(STATUS "${CMAKE_BUILD_TYPE} build.")
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
ADD_DEFINITIONS (-DDEBUG)
ENDIF()
+OPTION(VKVG_TILING_OPTIMAL "use VK_IMAGE_TILING_OPTIMAL for surface backend texture" OFF)
+IF (VKVG_TILING_OPTIMAL)
+ add_compile_options(-DVKVG_TILING_OPTIMAL)
+ ADD_DEFINITIONS (-DVKVG_TILING_OPTIMAL)
+ENDIF ()
+
OPTION(VKVG_BUILD_TESTS "build tests with glfw" ON)
set(VULKAN_SDK "$ENV{VULKAN_SDK}" CACHE STRING "LunarG Vulkan SDK path")
SET(ENV{VK_LAYER_PATH} "${VULKAN_SDK}/etc/explicit_layer.d")
endif ()
-MESSAGE(STATUS "VULKAN_SDK = $ENV{VULKAN_SDK}")
-MESSAGE(STATUS "VK_LAYER_PATH = $ENV{VK_LAYER_PATH}")
-
add_subdirectory (vkh)
+SET(ENABLE_VALIDATION OFF CACHE BOOL "Enable vulkan validation layer")
+
+IF (ENABLE_VALIDATION)
+ ADD_DEFINITIONS (-DVKVG_USE_VALIDATION)
+ENDIF ()
+
+
#be aware that system libraries have priority on SDK in the finding.
FIND_PACKAGE(Vulkan REQUIRED)
FIND_PACKAGE(GLFW3)
vkvg
)
endif ()
+
+MESSAGE(STATUS "\n\n--------------------------------------------------------------------------")
+ MESSAGE(STATUS "Build type\t\t= ${CMAKE_BUILD_TYPE}")
+ MESSAGE(STATUS "VULKAN_SDK\t\t= $ENV{VULKAN_SDK}")
+ MESSAGE(STATUS "VK_LAYER_PATH\t= $ENV{VK_LAYER_PATH}")
+IF (ENABLE_VALIDATION)
+ MESSAGE(STATUS "Validation\t\t= disabled.")
+ELSE ()
+ MESSAGE(STATUS "Validation\t\t= enabled.")
+ENDIF ()
+IF (VKVG_TILING_OPTIMAL)
+MESSAGE(STATUS "Surface tiling\t= VK_IMAGE_TILING_OPTIMAL.")
+ELSE ()
+MESSAGE(STATUS "Surface tiling\t= VK_IMAGE_TILING_LINEAR.")
+ENDIF ()
+MESSAGE(STATUS "---------------------------------------------------------------------------\n\n")
#include <vulkan/vulkan.h>
#include <math.h>
+#ifdef VKVG_TILING_OPTIMAL
+ #define VKVG_TILING VK_IMAGE_TILING_OPTIMAL
+#else
+ #define VKVG_TILING VK_IMAGE_TILING_LINEAR
+#endif
+
#define VKVG_SAMPLES 4
#define LOG_ERR 0x00
}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
+layout (location = 1) in vec4 inSrc; //source bounds or color
layout (location = 2) in flat int inPatType;
layout (location = 3) in mat3x2 inMat;
void _init_surface (VkvgSurface surf) {
surf->format = FB_COLOR_FORMAT;//force bgra internally
- surf->img = vkh_image_create(surf->dev,surf->format,surf->width,surf->height,VK_IMAGE_TILING_LINEAR,VMA_MEMORY_USAGE_GPU_ONLY,
+ surf->img = vkh_image_create(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);
surf->imgMS = vkh_image_ms_create(surf->dev,surf->format,VKVG_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);
vkh_cmd_end (cmd);
vkh_cmd_submit (dev->gQueue, &cmd, dev->fence);
- _wait_and_reset_device_fence (dev);
+ vkWaitForFences (dev->vkDev, 1, &dev->fence, VK_TRUE, UINT64_MAX);
void* img = vkh_image_map (stagImg);
vkh_image_unmap (stagImg);
vkh_image_destroy (stagImg);
}
+
/*VkhImage vkvg_surface_get_vkh_image(VkvgSurface surf)
{
return surf->img;
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-
#include "vkengine.h"
+
#include "vkvg.h"
+
#include "string.h" //for nanosvg
#define NANOSVG_IMPLEMENTATION // Expands implementation
#include "nanosvg.h"
vkvg_set_source_surface(ctx, imgSurf, 0, 0);
vkvg_paint(ctx);
//vkvg_flush(ctx);
- vkvg_set_source_rgba(ctx,1,0,0,1);
+ //vkvg_set_source_rgba(ctx,1,0,0,1);
vkvg_surface_destroy(imgSurf);
vkvg_destroy(ctx);
vkvg_destroy(ctx);
}
void simple_rectangle_fill () {
+ vkvg_surface_clear(surf);
VkvgContext ctx = vkvg_create(surf);
- vkvg_set_source_rgba(ctx,0,1,0,1);
+ vkvg_set_line_width(ctx,10);
+ vkvg_set_source_rgba(ctx,0,0,1,0.2);
vkvg_rectangle(ctx,100,100,200,200);
- vkvg_fill(ctx);
+ vkvg_fill_preserve(ctx);
+ vkvg_set_source_rgba(ctx,1,0,0,0.2);
+ vkvg_stroke(ctx);
vkvg_destroy(ctx);
}
void simple_rectangle_stroke () {
vkvg_stroke(ctx);
vkvg_destroy(ctx);
}
+void lines_stroke () {
+ VkvgContext ctx = vkvg_create(surf);
+ vkvg_set_source_rgba(ctx,1,1,1,1);
+ vkvg_paint(ctx);
+ vkvg_set_source_rgba(ctx,0,0,0,0.9f);
+ vkvg_set_line_width(ctx,10.f);
+ vkvg_move_to(ctx,50,50);
+ vkvg_line_to(ctx,300,250);
+ vkvg_stroke(ctx);
+ vkvg_destroy(ctx);
+}
int main(int argc, char *argv[]) {
-
//dumpLayerExts();
+ int width=1024, height=768;
- vk_engine_t* e = vkengine_create (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, 1024, 800);
+ vk_engine_t* e = vkengine_create (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, width, height);
VkhPresenter r = e->renderer;
vkengine_set_key_callback (e, key_callback);
device = vkvg_device_create (r->dev->phy, r->dev->dev, r->qFam, 0);
- surf = vkvg_surface_create(device, 1024, 800);
+ surf = vkvg_surface_create(device, width, height);
//test_svg();
- //
-
-
-
-
//test_grad_transforms();
//test_colinear();
- vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf));
+ vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf), width, height);
while (!vkengine_should_close (e)) {
glfwPollEvents();
- //test_1();
cairo_tests();
+ //test_1();
+ //vkvg_surface_clear(surf);
//simple_paint();
//simple_rectangle_stroke();
//simple_rectangle_fill();
//test_img_surface();
//multi_test1();
//test_painting();
+ //vkvg_surface_clear(surf);
+ //lines_stroke();
if (!vkh_presenter_draw (r))
- vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf));
+ vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf), width, height);
}
vkDeviceWaitIdle(e->dev->dev);
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");
+ assert((formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT) && "Format cannot be used as transfer source");
}
VkSampleCountFlagBits getMaxUsableSampleCount(VkSampleCountFlags counts)
}
char const * dex [] = {"VK_KHR_swapchain"};
-/*#if DEBUG
+#if VKVG_USE_VALIDATION
uint32_t dlayCpt = 1;
static char const * dlay [] = {"VK_LAYER_LUNARG_standard_validation"};
-#else*/
+#else
uint32_t dlayCpt = 0;
static char const * dlay [] = {};
-//#endif
+#endif
VkPhysicalDeviceFeatures enabledFeatures = {
.fillModeNonSolid = true,
+ .sampleRateShading = true
};
VkDeviceCreateInfo device_info = { .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
void vkengine_close (VkEngine e) {
glfwSetWindowShouldClose(e->window, GLFW_TRUE);
}
-void vkengine_blitter_run (VkEngine e, VkImage img) {
+void vkengine_blitter_run (VkEngine e, VkImage img, uint32_t width, uint32_t height) {
VkhPresenter p = e->renderer;
- vkh_presenter_build_blit_cmd (p, img);
+ vkh_presenter_build_blit_cmd (p, img, width, height);
while (!vkengine_should_close (e)) {
glfwPollEvents();
if (!vkh_presenter_draw (p))
- vkh_presenter_build_blit_cmd (p, img);
+ vkh_presenter_build_blit_cmd (p, img, width, height);
}
}
inline bool vkengine_should_close (VkEngine e) {
-Subproject commit b214df90867efb46c8cf45146c1bbebe110df0c0
+Subproject commit dbb60ff40bb78e19391afbc7153a199a281a87e3