From a2fdea91c0963b212707bfde8624f68cd54699e5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Sat, 4 Aug 2018 18:04:26 +0200 Subject: [PATCH] USE_VALIDATION and VKVG_TILING_OPTIMAL cmake options, width and height as variables for engine and surface --- CMakeLists.txt | 33 +++++++++++++++++++++++++++---- include/vkvg.h | 6 ++++++ shaders/vkvg_main.frag | 2 +- src/vkvg_surface.c | 5 +++-- tests/test1.c | 44 ++++++++++++++++++++++++++++-------------- tests/vkengine.c | 15 +++++++------- vkh | 2 +- 7 files changed, 77 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eab64e3..bc0670d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,12 +9,17 @@ SET(CMAKE_EXE_LINKER_FLAGS "-lm") 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") @@ -23,11 +28,15 @@ if (VULKAN_SDK) 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) @@ -157,3 +166,19 @@ if (GLFW3_FOUND) 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") diff --git a/include/vkvg.h b/include/vkvg.h index b73f3ce..dd67a88 100644 --- a/include/vkvg.h +++ b/include/vkvg.h @@ -29,6 +29,12 @@ extern "C" { #include #include +#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 diff --git a/shaders/vkvg_main.frag b/shaders/vkvg_main.frag index 161296f..8a32090 100644 --- a/shaders/vkvg_main.frag +++ b/shaders/vkvg_main.frag @@ -34,7 +34,7 @@ layout (set=2, binding = 0) uniform _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 +layout (location = 1) in vec4 inSrc; //source bounds or color layout (location = 2) in flat int inPatType; layout (location = 3) in mat3x2 inMat; diff --git a/src/vkvg_surface.c b/src/vkvg_surface.c index 6e6baf5..0323d2a 100644 --- a/src/vkvg_surface.c +++ b/src/vkvg_surface.c @@ -75,7 +75,7 @@ void _clear_surface (VkvgSurface surf, VkImageAspectFlags aspect) 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); @@ -310,7 +310,7 @@ void vkvg_surface_write_to_png (VkvgSurface surf, const char* path){ 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); @@ -319,6 +319,7 @@ void vkvg_surface_write_to_png (VkvgSurface surf, const char* path){ vkh_image_unmap (stagImg); vkh_image_destroy (stagImg); } + /*VkhImage vkvg_surface_get_vkh_image(VkvgSurface surf) { return surf->img; diff --git a/tests/test1.c b/tests/test1.c index 4e119ca..12407f7 100644 --- a/tests/test1.c +++ b/tests/test1.c @@ -19,9 +19,10 @@ * 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" @@ -333,7 +334,7 @@ void test_img_surface () { 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); @@ -1061,10 +1062,14 @@ void simple_paint () { 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 () { @@ -1075,40 +1080,49 @@ 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); diff --git a/tests/vkengine.c b/tests/vkengine.c index e4f04fb..7dc0c3e 100644 --- a/tests/vkengine.c +++ b/tests/vkengine.c @@ -31,7 +31,7 @@ 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) @@ -146,15 +146,16 @@ vk_engine_t* vkengine_create (VkPhysicalDeviceType preferedGPU, uint32_t width, } 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, @@ -200,14 +201,14 @@ void vkengine_destroy (VkEngine e) { 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) { diff --git a/vkh b/vkh index b214df9..dbb60ff 160000 --- a/vkh +++ b/vkh @@ -1 +1 @@ -Subproject commit b214df90867efb46c8cf45146c1bbebe110df0c0 +Subproject commit dbb60ff40bb78e19391afbc7153a199a281a87e3 -- 2.47.3