From 5f85e21f95a3c782641c0033ecb4df34d496299c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Mon, 25 Nov 2024 14:54:54 +0100 Subject: [PATCH] gunit tests + error handling improvments --- CMakeLists.txt | 28 ++- doc/design/error_handling.md | 13 ++ gunit_tests/CMakeLists.txt | 36 +++ gunit_tests/context.cpp | 72 ++++++ gunit_tests/device.cpp | 49 ++++ gunit_tests/main.cpp | 6 + gunit_tests/main2.cpp | 11 + gunit_tests/surface.cpp | 67 ++++++ include/vkvg.h | 50 +++-- shaders/vkvg_main.frag | 2 +- src/cross_os.h | 5 +- src/shaders.h | 213 +++++++++--------- src/vkvg_context.c | 233 ++++++++++---------- src/vkvg_context_internal.c | 31 ++- src/vkvg_device.c | 128 ++++++----- src/vkvg_device_internal.c | 4 +- src/vkvg_device_internal.h | 2 +- src/vkvg_fonts.c | 14 +- src/vkvg_internal.h | 11 +- src/vkvg_pattern.c | 27 ++- src/vkvg_surface.c | 70 +++--- src/vkvg_surface_internal.c | 103 ++++++--- src/vkvg_surface_internal.h | 11 +- tests/common/test.c | 5 +- tests/data/blender_icons16.png | Bin 0 -> 240844 bytes tests/multithreading/multithreaded.c | 4 - tests/multithreading/multithreaded2.c | 4 - tests/multithreading/threaded_create_surf.c | 4 - tests/multithreading/threaded_text.c | 4 - tests/pattern_transforms.c | 41 +++- 30 files changed, 791 insertions(+), 457 deletions(-) create mode 100644 doc/design/error_handling.md create mode 100644 gunit_tests/CMakeLists.txt create mode 100644 gunit_tests/context.cpp create mode 100644 gunit_tests/device.cpp create mode 100644 gunit_tests/main.cpp create mode 100644 gunit_tests/main2.cpp create mode 100644 gunit_tests/surface.cpp create mode 100644 tests/data/blender_icons16.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f79c29..1723646 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,9 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug") OPTION(VKVG_WIRED_FILL "enable wired polygon draw to check vertices and primitives" OFF) IF (UNIX) ADD_COMPILE_OPTIONS(-Wall -Wno-extra -Wno-unknown-pragmas -Wno-missing-braces -Wno-unused-variable -Wno-switch -Wno-unused-value) + IF (CMAKE_C_COMPILER_ID STREQUAL "GNU") + ADD_COMPILE_OPTIONS(-g3) # include macro info in debug + ENDIF() ELSEIF(MSVC) ADD_COMPILE_OPTIONS(/TC /W4 /wd4201 /wd4204 /wd4221 /wd4100) # c11 compliant ENDIF() @@ -59,22 +62,27 @@ ELSE() IF (ANDROID) ADD_COMPILE_OPTIONS(-O3 -w -pedantic) ELSEIF (UNIX) - #ADD_COMPILE_OPTIONS(-O3 -w -pedantic -fvisibility=hidden -fno-rtti) - #ADD_COMPILE_OPTIONS(-flto -pthread -lpthread -Wl,--no-as-needed) + #ADD_COMPILE_OPTIONS(-O3 -w -pedantic -fvisibility=hidden -fno-rtti) + #ADD_COMPILE_OPTIONS(-flto -pthread -lpthread -Wl,--no-as-needed) ELSEIF(MSVC) ADD_COMPILE_OPTIONS(/O2 /TC /W0 /Od) ENDIF() ENDIF() OPTION(ENABLE_PROFILING "compile with the -pg options..." OFF) +OPTION(ENABLE_GTESTS "enable google unit tests" ON) + +IF(ENABLE_GTESTS) + ADD_SUBDIRECTORY (gunit_tests) +ENDIF() IF (ENABLE_PROFILING) - ADD_COMPILE_OPTIONS( - -pg -fno-reorder-functions -fno-inline - -O1 - -fthread-jumps - -falign-functions -falign-jumps - -falign-loops -falign-labels) + ADD_COMPILE_OPTIONS( + -pg -fno-reorder-functions -fno-inline + -O1 + -fthread-jumps + -falign-functions -falign-jumps + -falign-loops -falign-labels) ENDIF() OPTION(VKVG_RECORDING "enable experimental recording functions" OFF) @@ -87,7 +95,7 @@ ENDIF () OPTION(VKVG_DBG_STATS "record contexts statistics in the device" OFF) IF (VKVG_DBG_STATS) - ADD_DEFINITIONS (-DVKVG_DBG_STATS) + ADD_DEFINITIONS (-DVKVG_DBG_STATS) ENDIF () OPTION(VKVG_USE_GLUTESS "Fill non-zero with glu tesselator" ON) @@ -95,7 +103,7 @@ OPTION(VKVG_USE_GLUTESS "Fill non-zero with glu tesselator" ON) CMAKE_DEPENDENT_OPTION(VKVG_SVG "render svg with vkvg-svg library" OFF "UNIX" OFF) IF (NOT TARGET vkh) - ADD_SUBDIRECTORY (vkh) + ADD_SUBDIRECTORY (vkh) ENDIF() #use c++ vulkan memory allocator library (https://gpuopen.com/vulkan-memory-allocator/) diff --git a/doc/design/error_handling.md b/doc/design/error_handling.md new file mode 100644 index 0000000..9334434 --- /dev/null +++ b/doc/design/error_handling.md @@ -0,0 +1,13 @@ +# Error handling strategy + +API calls must be safe, even if rendering failed. This means that any call to any api command with any parameter should not result in a program halt. Only current status should be affected by errors. + +## Per object status. + +Internally, statuses are first checked for each function calls. If objects are in error, api calls will safely return without performing any action. +The Status field in each vkvg structure being the first member, even a memory allocation failure may return a safe pointer holding only a pointer to VKVG_STATUS_NO_MEMORY static value. + +Client applications may check current statuses at anytime, even on a null pointer, to ensure normal operations. + + + diff --git a/gunit_tests/CMakeLists.txt b/gunit_tests/CMakeLists.txt new file mode 100644 index 0000000..d497d5c --- /dev/null +++ b/gunit_tests/CMakeLists.txt @@ -0,0 +1,36 @@ +cmake_minimum_required(VERSION 3.14) +project(unit_tests) + +# GoogleTest requires at least C++14 +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +include(FetchContent) + +FetchContent_Declare( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG b514bdc898e2951020cbdca1304b75f5950d1f59 #v1.15.2 +) + +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + +FetchContent_MakeAvailable(googletest) + +add_executable("${PROJECT_NAME}" + main.cpp + device.cpp + surface.cpp + context.cpp +) +target_include_directories("${PROJECT_NAME}" PUBLIC + "${CMAKE_SOURCE_DIR}/include" +) +target_link_libraries( + "${PROJECT_NAME}" + GTest::gtest_main + vkvg +) + +include(GoogleTest) +gtest_discover_tests("${PROJECT_NAME}") diff --git a/gunit_tests/context.cpp b/gunit_tests/context.cpp new file mode 100644 index 0000000..e44a3d7 --- /dev/null +++ b/gunit_tests/context.cpp @@ -0,0 +1,72 @@ +#include "vkvg.h" +#include + +// The fixture for testing class Foo. +class ContextTest : public testing::Test { + public: + VkvgDevice dev; + VkvgSurface surf; + + protected: + // You can remove any or all of the following functions if their bodies would + // be empty. + + ContextTest() { + vkvg_device_create_info_t info{}; + dev = vkvg_device_create(&info); + surf = vkvg_surface_create(dev, 512, 512); + } + + ~ContextTest() override { + vkvg_surface_destroy(surf); + vkvg_device_destroy(dev); + } + + void SetUp() override {} + + void TearDown() override {} +}; + +TEST_F(ContextTest, CtxCreate) { + EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_status(NULL)); + + VkvgContext ctx = vkvg_create(NULL); + EXPECT_EQ(VKVG_STATUS_INVALID_SURFACE, vkvg_status(ctx)); + vkvg_destroy(ctx); + + ctx = vkvg_create(surf); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_status(ctx)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); + + vkvg_destroy(ctx); +} + +TEST_F(ContextTest, CtxReference) { + EXPECT_EQ(0, vkvg_get_reference_count(NULL)); + + VkvgContext ctx = vkvg_create(NULL); + EXPECT_EQ(0, vkvg_get_reference_count(ctx)); + + ctx = vkvg_create(surf); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_status(ctx)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); + + EXPECT_EQ(1, vkvg_get_reference_count(ctx)); + EXPECT_EQ(2, vkvg_surface_get_reference_count(surf)); + EXPECT_EQ(2, vkvg_device_get_reference_count(dev)); + + vkvg_reference(ctx); + EXPECT_EQ(2, vkvg_get_reference_count(ctx)); + + vkvg_destroy(ctx); + EXPECT_EQ(1, vkvg_get_reference_count(ctx)); + + vkvg_destroy(ctx); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); + EXPECT_EQ(0, vkvg_get_reference_count(ctx)); + EXPECT_EQ(1, vkvg_surface_get_reference_count(surf)); + EXPECT_EQ(2, vkvg_device_get_reference_count(dev)); +} diff --git a/gunit_tests/device.cpp b/gunit_tests/device.cpp new file mode 100644 index 0000000..bce3fea --- /dev/null +++ b/gunit_tests/device.cpp @@ -0,0 +1,49 @@ +#include "vkvg.h" +#include + +TEST(Device, CreateNullInfo) { + EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_device_status(NULL)); + + VkvgDevice dev = vkvg_device_create(NULL); + EXPECT_EQ(VKVG_STATUS_INVALID_DEVICE_CREATE_INFO, vkvg_device_status(dev)); + vkvg_device_destroy(dev); +} +TEST(Device, CreateEmpty) { + vkvg_device_create_info_t info{}; + VkvgDevice dev = vkvg_device_create(&info); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + vkvg_device_destroy(dev); +} + +TEST(Device, Reference) { + VkvgDevice dev = vkvg_device_create(NULL); + EXPECT_EQ(0, vkvg_device_get_reference_count(dev)); + vkvg_device_reference(dev); + + vkvg_device_create_info_t info{}; + dev = vkvg_device_create(&info); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + EXPECT_EQ(1, vkvg_device_get_reference_count(dev)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + + vkvg_device_reference(dev); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + EXPECT_EQ(2, vkvg_device_get_reference_count(dev)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + + vkvg_device_destroy(dev); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + EXPECT_EQ(1, vkvg_device_get_reference_count(dev)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + + vkvg_device_destroy(dev); + EXPECT_EQ(0, vkvg_device_get_reference_count(dev)); +} + +/*TEST(Device, GetVulkanRequirements) +{ + + vkvg_public void vkvg_get_required_instance_extensions(const char **pExtensions, uint32_t *pExtCount); + vkvg_public vkvg_status_t vkvg_get_required_device_extensions(VkPhysicalDevice phy, const char **pExtensions, + vkvg_public const void *vkvg_get_device_requirements(VkPhysicalDeviceFeatures *pEnabledFeatures); +}*/ diff --git a/gunit_tests/main.cpp b/gunit_tests/main.cpp new file mode 100644 index 0000000..64becff --- /dev/null +++ b/gunit_tests/main.cpp @@ -0,0 +1,6 @@ +#include + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/gunit_tests/main2.cpp b/gunit_tests/main2.cpp new file mode 100644 index 0000000..82ceaab --- /dev/null +++ b/gunit_tests/main2.cpp @@ -0,0 +1,11 @@ +#include + +// Demonstrate some basic assertions. +TEST(HelloTest, BasicAssertions) { + // Expect two strings not to be equal. + EXPECT_STRNE("hello", "world"); + // Expect equality. + EXPECT_EQ(7 * 6, 42); +} + + diff --git a/gunit_tests/surface.cpp b/gunit_tests/surface.cpp new file mode 100644 index 0000000..f4284d7 --- /dev/null +++ b/gunit_tests/surface.cpp @@ -0,0 +1,67 @@ +#include "vkvg.h" +#include + +// The fixture for testing class Foo. +class SurfaceTest : public testing::Test { + public: + VkvgDevice dev; + + protected: + // You can remove any or all of the following functions if their bodies would + // be empty. + + SurfaceTest() { + vkvg_device_create_info_t info{}; + dev = vkvg_device_create(&info); + } + + ~SurfaceTest() override { vkvg_device_destroy(dev); } + + void SetUp() override {} + + void TearDown() override {} +}; + +TEST_F(SurfaceTest, SurfCreate) { + EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_surface_status(NULL)); + + VkvgSurface surf = vkvg_surface_create(NULL, 0, 0); + + EXPECT_EQ(VKVG_STATUS_DEVICE_ERROR, vkvg_surface_status(surf)); + + surf = vkvg_surface_create(dev, 512, 512); + + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); + + vkvg_surface_destroy(surf); +} + +TEST_F(SurfaceTest, SurfReference) { + VkvgSurface surf = vkvg_surface_create(NULL, 0, 0); + EXPECT_EQ(0, vkvg_surface_get_reference_count(surf)); + vkvg_surface_reference(surf); + + EXPECT_EQ(VKVG_STATUS_DEVICE_ERROR, vkvg_surface_status(surf)); + + surf = vkvg_surface_create(dev, 512, 512); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); + EXPECT_EQ(2, vkvg_device_get_reference_count(dev)); + EXPECT_EQ(1, vkvg_surface_get_reference_count(surf)); + + vkvg_surface_reference(surf); + + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); + EXPECT_EQ(2, vkvg_surface_get_reference_count(surf)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); + + vkvg_surface_destroy(surf); + + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); + EXPECT_EQ(1, vkvg_surface_get_reference_count(surf)); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); + + vkvg_surface_destroy(surf); + EXPECT_EQ(0, vkvg_surface_get_reference_count(surf)); +} diff --git a/include/vkvg.h b/include/vkvg.h index 132aaba..1de905c 100644 --- a/include/vkvg.h +++ b/include/vkvg.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020 Jean-Philippe Bruyère + * Copyright (c) 2018-2025 Jean-Philippe Bruyère * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -43,11 +43,13 @@ extern "C" { */ /*! @file vkvg.h - * @brief The header of the VKVG library. + * @brief Main header of the VKVG library. * * This is the header file of the VKVG library. It defines all its types and * declares all its functions. * + * To start drawing with vkvg, simply include this header. + * */ /*! @defgroup surface Surface * @brief Functions and types related to VKVG surface. @@ -123,12 +125,12 @@ extern vkvg_wired_debug_mode vkvg_wired_debug; typedef enum { VKVG_STATUS_SUCCESS = 0, /*!< no error occurred.*/ VKVG_STATUS_NO_MEMORY, /*!< out of memory*/ + VKVG_STATUS_NULL_POINTER, /*!< NULL pointer*/ VKVG_STATUS_INVALID_RESTORE, /*!< call to #vkvg_restore without matching call to #vkvg_save*/ VKVG_STATUS_NO_CURRENT_POINT, /*!< path command expecting a current point to be defined failed*/ VKVG_STATUS_INVALID_MATRIX, /*!< invalid matrix (not invertible)*/ VKVG_STATUS_INVALID_STATUS, /*!< */ VKVG_STATUS_INVALID_INDEX, /*!< */ - VKVG_STATUS_NULL_POINTER, /*!< NULL pointer*/ VKVG_STATUS_WRITE_ERROR, /*!< */ VKVG_STATUS_PATTERN_TYPE_MISMATCH, /*!< */ VKVG_STATUS_PATTERN_INVALID_GRADIENT, /*!< occurs when stops count is zero */ @@ -136,11 +138,14 @@ typedef enum { VKVG_STATUS_FILE_NOT_FOUND, /*!< */ VKVG_STATUS_INVALID_DASH, /*!< invalid value for a dash setting */ VKVG_STATUS_INVALID_RECT, /*!< rectangle with height or width equal to 0. */ - VKVG_STATUS_TIMEOUT, /*!< waiting for a vulkan operation to finish resulted in a fence timeout (5 seconds)*/ - VKVG_STATUS_DEVICE_ERROR, /*!< vkvg device initialization error */ - VKVG_STATUS_INVALID_IMAGE, /*!< */ - VKVG_STATUS_INVALID_SURFACE, /*!< */ - VKVG_STATUS_INVALID_FONT, /*!< Unresolved font name*/ + VKVG_STATUS_TIMEOUT, /*!< waiting for a vulkan operation to finish resulted in a fence timeout (5 seconds)*/ + VKVG_STATUS_DEVICE_ERROR, /*!< vkvg device initialization error */ + VKVG_STATUS_INVALID_DEVICE_CREATE_INFO, /*!< vkvg device initialization error */ + VKVG_STATUS_INVALID_IMAGE, /*!< */ + VKVG_STATUS_INVALID_SURFACE, /*!< */ + VKVG_STATUS_INVALID_FONT, /*!< Unresolved font name*/ + VKVG_STATUS_IN_CACHE, /*!< This is not an error, context is stored in cache, not usable until recovered for another + context creation. */ VKVG_STATUS_ENUM_MAX = 0x7FFFFFFF } vkvg_status_t; @@ -329,6 +334,7 @@ typedef struct _vkvg_pattern_t *VkvgPattern; * * @ingroup device */ +#define VKVG_HAS_DBG_STATS /*!< If defined, #vkvg_device_get_stats and #vkvg_device_reset_stats are available.*/ typedef struct { uint32_t sizePoints; /**< maximum point array size */ uint32_t sizePathes; /**< maximum path array size */ @@ -339,7 +345,7 @@ typedef struct { } vkvg_debug_stats_t; vkvg_debug_stats_t vkvg_device_get_stats(VkvgDevice dev); -vkvg_debug_stats_t vkvg_device_reset_stats(VkvgDevice dev); +void vkvg_device_reset_stats(VkvgDevice dev); #endif /** @@ -554,20 +560,9 @@ typedef struct { VkDevice vkdev; uint32_t qFamIdx; uint32_t qIndex; + bool threadAware; /**< if true, mutex is created and guard device queue and caches access */ } vkvg_device_create_info_t; -/** - * @brief Set device ready for multithreading. - * - * If thread aware mode is set to true, - * - * This method should be called only once on device creation. If this method is called while some surfaces or patterns - * are in use, this could have unexpected results. - * - * - * @param dev - * @param thread_awayre - */ -vkvg_public void vkvg_device_set_thread_aware(VkvgDevice dev, uint32_t thread_awayre); + vkvg_public /** * @brief Set maximum cached context count. @@ -590,6 +585,7 @@ vkvg_public * one of the following: * - VKVG_STATUS_INVALID_FORMAT: the combination of image format and tiling is not supported * - VKVG_STATUS_NULL_POINTER: vulkan function pointer fetching failed. + * - VKVG_STATUS_NO_MEMORY: either info parameter was null or memory allocation for device structure failed. * * @param samples The sample count that will be setup for the surfaces created by this device. * @param deferredResolve If true, the final simple sampled image of the surface will only be resolved on demand with a @@ -630,7 +626,7 @@ vkvg_public VkvgDevice vkvg_device_create(vkvg_device_create_info_t *info); * @param samples The sample count that will be setup for the surfaces created by this device. * @return The handle of the created vkvg device, or null if an error occured. - + */ /** * @brief Decrement the reference count of the device by 1. Release all its resources if count reaches 0. @@ -755,6 +751,14 @@ vkvg_public VkvgSurface vkvg_surface_create_for_VkhImage(VkvgDevice dev, void *v */ vkvg_public VkvgSurface vkvg_surface_create_from_bitmap(VkvgDevice dev, unsigned char *img, uint32_t width, uint32_t height); +/** + * @brief Get the current status of the surface. + * + * Query current status of surface. See @ref vkvg_status_t for more informations. + * @param surf a valid vkvg surface pointer. If null, VKVG_STATUS_NO_MEMORY is return; + * @return current state. + */ +vkvg_public vkvg_status_t vkvg_surface_status(VkvgSurface surf); /** * @brief Increment reference count on the surface by one. * @param The vkvg surface to increment the reference count for. diff --git a/shaders/vkvg_main.frag b/shaders/vkvg_main.frag index 5b43765..beb7078 100644 --- a/shaders/vkvg_main.frag +++ b/shaders/vkvg_main.frag @@ -143,7 +143,7 @@ void main() } if (inFontUV.z >= 0.0) - c *= texture(fontMap, inFontUV).r; + c *= texture(fontMap, inFontUV).r; #ifdef VKVG_PREMULT_ALPHA c *= inOpacity; diff --git a/src/cross_os.h b/src/cross_os.h index e047ba8..3fee0f4 100644 --- a/src/cross_os.h +++ b/src/cross_os.h @@ -19,8 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#ifndef CROSS_OS_H -#define CROSS_OS_H +#pragma once // cross platform os helpers #if defined(_WIN32) || defined(_WIN64) @@ -53,5 +52,3 @@ void _linux_register_error_handler(); #endif const char *getUserDir(); - -#endif // CROSS_OS_H diff --git a/src/shaders.h b/src/shaders.h index 9e48365..9808c5e 100644 --- a/src/shaders.h +++ b/src/shaders.h @@ -1,5 +1,5 @@ unsigned char shader_comp_spv[] = { - 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, @@ -23,9 +23,9 @@ unsigned char shader_comp_spv[] = { 0x00, 0x05, 0x00, 0x03, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x84, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x97, 0x00, 0x00, 0x00, 0x62, 0x75, 0x66, 0x00, 0x47, 0x00, 0x04, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x97, 0x00, 0x00, - 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x97, 0x00, 0x00, 0x00, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x97, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x47, + 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x97, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x97, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x97, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -190,7 +190,7 @@ unsigned char shader_comp_spv[] = { 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00}; unsigned int shader_comp_spv_len = 3580; unsigned char shader2_comp_spv[] = { - 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, @@ -218,10 +218,10 @@ unsigned char shader2_comp_spv[] = { 0x61, 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x54, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x55, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x59, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, - 0x61, 0x00, 0x00, 0x00, 0x62, 0x75, 0x66, 0x00, 0x47, 0x00, 0x04, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, - 0x00, 0x1c, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x61, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x61, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, - 0x00, 0x03, 0x00, 0x61, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x6b, 0x00, 0x00, 0x00, + 0x5e, 0x00, 0x00, 0x00, 0x62, 0x75, 0x66, 0x00, 0x47, 0x00, 0x04, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x47, 0x00, + 0x04, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x5e, + 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x68, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, @@ -246,14 +246,14 @@ unsigned char shader2_comp_spv[] = { 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x6f, 0x12, 0x03, 0x3b, 0x17, 0x00, 0x04, 0x00, 0x57, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x09, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x09, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x04, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x63, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x66, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x67, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x28, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2c, - 0x00, 0x06, 0x00, 0x29, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x5d, + 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x63, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x64, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x28, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2c, + 0x00, 0x06, 0x00, 0x29, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4a, @@ -292,45 +292,42 @@ unsigned char shader2_comp_spv[] = { 0x00, 0x00, 0x00, 0x39, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5b, - 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, - 0x4a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x07, 0x00, 0x57, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5b, 0x00, - 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x59, 0x00, 0x00, 0x00, 0x5e, - 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x29, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x07, - 0x00, 0x63, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x04, 0x00, 0x67, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x65, - 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x57, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, - 0x63, 0x00, 0x04, 0x00, 0x62, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, - 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x37, - 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3b, 0x00, - 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x00, 0x16, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x83, 0x00, - 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, - 0x1a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1c, 0x00, - 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x23, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, 0x24, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, - 0x00}; -unsigned int shader2_comp_spv_len = 2604; + 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x57, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x59, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x5c, 0x00, 0x00, + 0x00, 0x5f, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x29, 0x00, 0x00, 0x00, 0x61, 0x00, + 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x07, 0x00, 0x60, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x61, + 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x04, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x57, 0x00, 0x00, + 0x00, 0x66, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x63, 0x00, 0x04, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x65, 0x00, + 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x37, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x83, 0x00, + 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x19, + 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, + 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x88, 0x00, + 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0xfe, 0x00, + 0x02, 0x00, 0x24, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00}; +unsigned int shader2_comp_spv_len = 2556; unsigned char vkvg_main_frag_spv[] = { - 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, @@ -386,19 +383,19 @@ unsigned char vkvg_main_frag_spv[] = { 0x00, 0x47, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x21, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x4a, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x56, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x56, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x57, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, - 0x00, 0x04, 0x00, 0x59, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x48, 0x00, - 0x05, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x48, - 0x00, 0x05, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, - 0x47, 0x00, 0x03, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x5c, 0x00, 0x00, - 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x88, 0x01, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x47, 0x00, 0x04, 0x00, 0x88, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, + 0x00, 0x04, 0x00, 0x59, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x5a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x5c, 0x00, 0x00, + 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x88, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x04, 0x00, 0x88, 0x01, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x8f, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x8f, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x94, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x96, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -834,7 +831,7 @@ unsigned char vkvg_main_frag_spv[] = { 0x00, 0x95, 0x01, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00}; unsigned int vkvg_main_frag_spv_len = 9532; unsigned char vkvg_main_vert_spv[] = { - 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, @@ -874,27 +871,27 @@ unsigned char vkvg_main_vert_spv[] = { 0x00, 0x05, 0x00, 0x04, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x55, 0x56, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x51, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x55, 0x56, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x54, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x47, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, - 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, - 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x48, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x48, 0x00, - 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x48, - 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x48, 0x00, - 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x47, - 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x48, 0x00, 0x04, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x48, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x27, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x2f, - 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x3e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x3e, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x3e, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x3e, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x3e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x42, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x42, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x51, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, @@ -1031,7 +1028,7 @@ unsigned char vkvg_main_vert_spv[] = { 0x03, 0x00, 0x84, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00}; unsigned int vkvg_main_vert_spv_len = 3704; unsigned char vkvg_main_lcd_frag_spv[] = { - 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, @@ -1077,19 +1074,19 @@ unsigned char vkvg_main_lcd_frag_spv[] = { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x25, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x47, 0x00, - 0x04, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x4e, - 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x4e, + 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x59, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, - 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, - 0x00, 0x04, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, - 0x5e, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xdc, 0x00, 0x00, - 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x22, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x5c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x48, 0x00, 0x05, + 0x00, 0x5c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x48, 0x00, + 0x05, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x47, + 0x00, 0x04, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x5e, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xdc, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x21, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xec, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xee, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, @@ -1338,7 +1335,7 @@ unsigned char vkvg_main_lcd_frag_spv[] = { 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00}; unsigned int vkvg_main_lcd_frag_spv_len = 5784; unsigned char wired_frag_spv[] = { - 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, @@ -1371,18 +1368,18 @@ unsigned char wired_frag_spv[] = { 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x4d, 0x61, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x4d, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x53, 0x00, 0x47, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x19, 0x00, - 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x1a, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x1a, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, + 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x23, + 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x21, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, diff --git a/src/vkvg_context.c b/src/vkvg_context.c index 877afb8..de3151d 100644 --- a/src/vkvg_context.c +++ b/src/vkvg_context.c @@ -51,10 +51,7 @@ void _init_ctx(VkvgContext ctx) { vkvg_surface_reference(ctx->pSurf); - if (ctx->dev->samples == VK_SAMPLE_COUNT_1_BIT) - ctx->renderPassBeginInfo.clearValueCount = 2; - else - ctx->renderPassBeginInfo.clearValueCount = 3; + ctx->renderPassBeginInfo.clearValueCount = ctx->dev->samples == VK_SAMPLE_COUNT_1_BIT ? 2 : 3; ctx->selectedCharSize = 10 << 6; ctx->currentFont = NULL; @@ -70,38 +67,37 @@ void _init_ctx(VkvgContext ctx) { } VkvgContext vkvg_create(VkvgSurface surf) { + LOG(VKVG_LOG_INFO, "CREATE Context\n"); + if (vkvg_surface_status(surf)) { + LOG(VKVG_LOG_ERR, "CREATE Context failed, invalid surface\n"); + return (VkvgContext)&_vkvg_status_invalid_surface; + } VkvgDevice dev = surf->dev; + if (vkvg_device_status(dev)) { + LOG(VKVG_LOG_ERR, "CREATE Context failed, invalid device\n"); + return (VkvgContext)&_vkvg_status_device_error; + } VkvgContext ctx = NULL; if (_device_try_get_cached_context(dev, &ctx)) { ctx->pSurf = surf; - - if (!surf || surf->status) { - ctx->status = VKVG_STATUS_INVALID_SURFACE; - return ctx; - } - + ctx->status = VKVG_STATUS_SUCCESS; _init_ctx(ctx); _update_descriptor_set(ctx, surf->dev->emptyImg, ctx->dsSrc); _clear_path(ctx); - ctx->cmd = ctx->cmdBuffers[0]; // current recording buffer - ctx->status = VKVG_STATUS_SUCCESS; + ctx->cmd = ctx->cmdBuffers[0]; // current recording buffer return ctx; } ctx = (vkvg_context *)calloc(1, sizeof(vkvg_context)); - LOG(VKVG_LOG_INFO, "CREATE Context: ctx = %p; surf = %p\n", ctx, surf); - - if (!ctx) - return (VkvgContext)&_no_mem_status; + if (!ctx) { + LOG(VKVG_LOG_ERR, "CREATE context failed, no memory\n"); + return (VkvgContext)&_vkvg_status_no_memory; + } + LOG(VKVG_LOG_INFO, "CREATE Context: ctx = %p; surf = %p\n", ctx, surf); ctx->pSurf = surf; - if (!surf || surf->status) { - ctx->status = VKVG_STATUS_INVALID_SURFACE; - return ctx; - } - ctx->sizePoints = VKVG_PTS_SIZE; ctx->sizeVertices = ctx->sizeVBO = VKVG_VBO_SIZE; ctx->sizeIndices = ctx->sizeIBO = VKVG_IBO_SIZE; @@ -110,15 +106,12 @@ VkvgContext vkvg_create(VkvgSurface surf) { ctx->dev = surf->dev; - _init_ctx(ctx); - ctx->points = (vec2 *)malloc(VKVG_VBO_SIZE * sizeof(vec2)); ctx->pathes = (uint32_t *)malloc(VKVG_PATHES_SIZE * sizeof(uint32_t)); ctx->vertexCache = (Vertex *)malloc(ctx->sizeVertices * sizeof(Vertex)); ctx->indexCache = (VKVG_IBO_INDEX_TYPE *)malloc(ctx->sizeIndices * sizeof(VKVG_IBO_INDEX_TYPE)); if (!ctx->points || !ctx->pathes || !ctx->vertexCache || !ctx->indexCache) { - dev->status = VKVG_STATUS_NO_MEMORY; if (ctx->points) free(ctx->points); if (ctx->pathes) @@ -127,15 +120,18 @@ VkvgContext vkvg_create(VkvgSurface surf) { free(ctx->vertexCache); if (ctx->indexCache) free(ctx->indexCache); - return NULL; + LOG(VKVG_LOG_ERR, "CREATE context failed, no memory\n"); + return (VkvgContext)&_vkvg_status_no_memory; } + _init_ctx(ctx); + + VkhDevice vkhd = (VkhDevice)&dev->vkDev; // for context to be thread safe, command pool and descriptor pool have to be created in the thread of the context. - ctx->cmdPool = - vkh_cmd_pool_create((VkhDevice)dev, dev->gQueue->familyIndex, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); + ctx->cmdPool = vkh_cmd_pool_create(vkhd, dev->gQueue->familyIndex, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); #ifndef VKVG_ENABLE_VK_TIMELINE_SEMAPHORE - ctx->flushFence = vkh_fence_create_signaled((VkhDevice)ctx->dev); + ctx->flushFence = vkh_fence_create_signaled((VkhDevice)&ctx->dev->vkDev); #endif _create_vertices_buff(ctx); @@ -159,32 +155,26 @@ VkvgContext vkvg_create(VkvgSurface surf) { ctx->sizeIBO); #if defined(DEBUG) && defined(VKVG_DBG_UTILS) - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_COMMAND_POOL, (uint64_t)ctx->cmdPool, "CTX Cmd Pool"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)ctx->cmdBuffers[0], - "CTX Cmd Buff A"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)ctx->cmdBuffers[1], - "CTX Cmd Buff B"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_COMMAND_POOL, (uint64_t)ctx->cmdPool, "CTX Cmd Pool"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)ctx->cmdBuffers[0], "CTX Cmd Buff A"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)ctx->cmdBuffers[1], "CTX Cmd Buff B"); #ifndef VKVG_ENABLE_VK_TIMELINE_SEMAPHORE - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_FENCE, (uint64_t)ctx->flushFence, "CTX Flush Fence"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_FENCE, (uint64_t)ctx->flushFence, "CTX Flush Fence"); #endif - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t)ctx->descriptorPool, + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t)ctx->descriptorPool, "CTX Descriptor Pool"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)ctx->dsSrc, - "CTX DescSet SOURCE"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)ctx->dsFont, - "CTX DescSet FONT"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)ctx->dsGrad, - "CTX DescSet GRADIENT"); - - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_BUFFER, (uint64_t)ctx->indices.buffer, "CTX Index Buff"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_BUFFER, (uint64_t)ctx->vertices.buffer, - "CTX Vertex Buff"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)ctx->dsSrc, "CTX DescSet SOURCE"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)ctx->dsFont, "CTX DescSet FONT"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)ctx->dsGrad, "CTX DescSet GRADIENT"); + + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_BUFFER, (uint64_t)ctx->indices.buffer, "CTX Index Buff"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_BUFFER, (uint64_t)ctx->vertices.buffer, "CTX Vertex Buff"); #endif return ctx; } void vkvg_flush(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; _flush_cmd_buff(ctx); _wait_ctx_flush_end(ctx); @@ -250,7 +240,7 @@ void _clear_context(VkvgContext ctx) { } void vkvg_destroy(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; ctx->references--; @@ -300,13 +290,14 @@ void vkvg_destroy(VkvgContext ctx) { if (!ctx->status && ctx->dev->cachedContextCount < VKVG_MAX_CACHED_CONTEXT_COUNT) { _device_store_context(ctx); + ctx->status = VKVG_STATUS_IN_CACHE; return; } _release_context_ressources(ctx); } void vkvg_set_opacity(VkvgContext ctx, float opacity) { - if (ctx->status) + if (vkvg_status(ctx)) return; if (EQUF(ctx->pushConsts.opacity, opacity)) @@ -317,23 +308,23 @@ void vkvg_set_opacity(VkvgContext ctx, float opacity) { ctx->pushCstDirty = true; } float vkvg_get_opacity(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return 0; return ctx->pushConsts.opacity; } -vkvg_status_t vkvg_status(VkvgContext ctx) { return ctx->status; } +vkvg_status_t vkvg_status(VkvgContext ctx) { return !ctx ? VKVG_STATUS_NULL_POINTER : ctx->status; } VkvgContext vkvg_reference(VkvgContext ctx) { if (!ctx->status) ctx->references++; return ctx; } uint32_t vkvg_get_reference_count(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return 0; return ctx->references; } void vkvg_new_sub_path(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_NEW_SUB_PATH); @@ -342,7 +333,7 @@ void vkvg_new_sub_path(VkvgContext ctx) { _finish_path(ctx); } void vkvg_new_path(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; LOG(VKVG_LOG_INFO_CMD, "\tCMD: new_path:\n"); @@ -351,7 +342,7 @@ void vkvg_new_path(VkvgContext ctx) { RECORD(ctx, VKVG_CMD_NEW_PATH); } void vkvg_close_path(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_CLOSE_PATH); @@ -375,7 +366,7 @@ void vkvg_close_path(VkvgContext ctx) { _finish_path(ctx); } void vkvg_rel_line_to(VkvgContext ctx, float dx, float dy) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_REL_LINE_TO, dx, dy); @@ -387,7 +378,7 @@ void vkvg_rel_line_to(VkvgContext ctx, float dx, float dy) { _line_to(ctx, cp.x + dx, cp.y + dy); } void vkvg_line_to(VkvgContext ctx, float x, float y) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_LINE_TO, x, y); @@ -395,7 +386,7 @@ void vkvg_line_to(VkvgContext ctx, float x, float y) { _line_to(ctx, x, y); } void vkvg_arc(VkvgContext ctx, float xc, float yc, float radius, float a1, float a2) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_ARC, xc, yc, radius, a1, a2); @@ -451,7 +442,7 @@ void vkvg_arc(VkvgContext ctx, float xc, float yc, float radius, float a1, float _set_curve_end(ctx); } void vkvg_arc_negative(VkvgContext ctx, float xc, float yc, float radius, float a1, float a2) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_ARC_NEG, xc, yc, radius, a1, a2); LOG(VKVG_LOG_INFO_CMD, "\tCMD: %f,%f %f %f %f\n", xc, yc, radius, a1, a2); @@ -505,7 +496,7 @@ void vkvg_arc_negative(VkvgContext ctx, float xc, float yc, float radius, float _set_curve_end(ctx); } void vkvg_rel_move_to(VkvgContext ctx, float x, float y) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_REL_MOVE_TO, x, y); LOG(VKVG_LOG_INFO_CMD, "\tCMD: rel_mote_to: %f, %f\n", x, y); @@ -516,7 +507,7 @@ void vkvg_rel_move_to(VkvgContext ctx, float x, float y) { _add_point(ctx, cp.x + x, cp.y + y); } void vkvg_move_to(VkvgContext ctx, float x, float y) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_MOVE_TO, x, y); LOG(VKVG_LOG_INFO_CMD, "\tCMD: move_to: %f,%f\n", x, y); @@ -524,7 +515,7 @@ void vkvg_move_to(VkvgContext ctx, float x, float y) { _add_point(ctx, x, y); } bool vkvg_has_current_point(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return false; return !_current_path_is_empty(ctx); } @@ -575,14 +566,14 @@ void _quadratic_to(VkvgContext ctx, float x1, float y1, float x2, float y2 + (y1 - y2) * quadraticFact, x2, y2); } void vkvg_quadratic_to(VkvgContext ctx, float x1, float y1, float x2, float y2) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_QUADRATIC_TO, x1, y1, x2, y2); LOG(VKVG_LOG_INFO_CMD, "\tCMD: quadratic_to: %f, %f, %f, %f\n", x1, y1, x2, y2); _quadratic_to(ctx, x1, y1, x2, y2); } void vkvg_rel_quadratic_to(VkvgContext ctx, float x1, float y1, float x2, float y2) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_REL_QUADRATIC_TO, x1, y1, x2, y2); LOG(VKVG_LOG_INFO_CMD, "\tCMD: rel_quadratic_to: %f, %f, %f, %f\n", x1, y1, x2, y2); @@ -590,14 +581,14 @@ void vkvg_rel_quadratic_to(VkvgContext ctx, float x1, float y1, float x2, float _quadratic_to(ctx, cp.x + x1, cp.y + y1, cp.x + x2, cp.y + y2); } void vkvg_curve_to(VkvgContext ctx, float x1, float y1, float x2, float y2, float x3, float y3) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_CURVE_TO, x1, y1, x2, y2, x3, y3); LOG(VKVG_LOG_INFO_CMD, "\tCMD: curve_to %f,%f %f,%f %f,%f:\n", x1, y1, x2, y2, x3, y3); _curve_to(ctx, x1, y1, x2, y2, x3, y3); } void vkvg_rel_curve_to(VkvgContext ctx, float x1, float y1, float x2, float y2, float x3, float y3) { - if (ctx->status) + if (vkvg_status(ctx)) return; if (_current_path_is_empty(ctx)) { ctx->status = VKVG_STATUS_NO_CURRENT_POINT; @@ -609,7 +600,7 @@ void vkvg_rel_curve_to(VkvgContext ctx, float x1, float y1, float x2, float y2, _curve_to(ctx, cp.x + x1, cp.y + y1, cp.x + x2, cp.y + y2, cp.x + x3, cp.y + y3); } void vkvg_fill_rectangle(VkvgContext ctx, float x, float y, float w, float h) { - if (ctx->status) + if (vkvg_status(ctx)) return; LOG(VKVG_LOG_INFO_CMD, "\tCMD: fill_rectangle:\n"); _vao_add_rectangle(ctx, x, y, w, h); @@ -617,7 +608,7 @@ void vkvg_fill_rectangle(VkvgContext ctx, float x, float y, float w, float h) { } vkvg_status_t vkvg_rectangle(VkvgContext ctx, float x, float y, float w, float h) { - if (ctx->status) + if (vkvg_status(ctx)) return ctx->status; RECORD2(ctx, VKVG_CMD_RECTANGLE, x, y, w, h); LOG(VKVG_LOG_INFO_CMD, "\tCMD: rectangle: %f,%f,%f,%f\n", x, y, w, h); @@ -637,7 +628,7 @@ vkvg_status_t vkvg_rectangle(VkvgContext ctx, float x, float y, float w, float h return VKVG_STATUS_SUCCESS; } vkvg_status_t vkvg_rounded_rectangle(VkvgContext ctx, float x, float y, float w, float h, float radius) { - if (ctx->status) + if (vkvg_status(ctx)) return ctx->status; LOG(VKVG_LOG_INFO_CMD, "CMD: rounded_rectangle:\n"); _finish_path(ctx); @@ -662,7 +653,7 @@ vkvg_status_t vkvg_rounded_rectangle(VkvgContext ctx, float x, float y, float w, return VKVG_STATUS_SUCCESS; } void vkvg_rounded_rectangle2(VkvgContext ctx, float x, float y, float w, float h, float rx, float ry) { - if (ctx->status) + if (vkvg_status(ctx)) return; LOG(VKVG_LOG_INFO_CMD, "CMD: rounded_rectangle2:\n"); vkvg_move_to(ctx, x + rx, y); @@ -681,7 +672,7 @@ void vkvg_rounded_rectangle2(VkvgContext ctx, float x, float y, float w, float h vkvg_close_path(ctx); } void vkvg_path_extents(VkvgContext ctx, float *x1, float *y1, float *x2, float *y2) { - if (ctx->status) + if (vkvg_status(ctx)) return; _finish_path(ctx); @@ -716,7 +707,7 @@ void _reset_clip(VkvgContext ctx) { } void vkvg_reset_clip(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_RESET_CLIP); @@ -731,7 +722,7 @@ void vkvg_reset_clip(VkvgContext ctx) { _reset_clip(ctx); } void vkvg_clear(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_CLEAR); @@ -947,47 +938,47 @@ void _stroke_preserve(VkvgContext ctx) { } void vkvg_clip(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_CLIP); _clip_preserve(ctx); _clear_path(ctx); } void vkvg_stroke(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_STROKE); _stroke_preserve(ctx); _clear_path(ctx); } void vkvg_fill(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_FILL); _fill_preserve(ctx); _clear_path(ctx); } void vkvg_clip_preserve(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_CLIP_PRESERVE); _clip_preserve(ctx); } void vkvg_fill_preserve(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_FILL_PRESERVE); _fill_preserve(ctx); } void vkvg_stroke_preserve(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_STROKE_PRESERVE); _stroke_preserve(ctx); } void vkvg_paint(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_PAINT); _finish_path(ctx); @@ -1001,21 +992,21 @@ void vkvg_paint(VkvgContext ctx) { _draw_full_screen_quad(ctx, NULL); } void vkvg_set_source_color(VkvgContext ctx, uint32_t c) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_SOURCE_COLOR, c); ctx->curColor = c; _update_cur_pattern(ctx, NULL); } void vkvg_set_source_rgb(VkvgContext ctx, float r, float g, float b) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_SOURCE_RGB, r, g, b); ctx->curColor = CreateRgbaf(r, g, b, 1); _update_cur_pattern(ctx, NULL); } void vkvg_set_source_rgba(VkvgContext ctx, float r, float g, float b, float a) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_SOURCE_RGBA, r, g, b, a); ctx->curColor = CreateRgbaf(r, g, b, a); @@ -1038,31 +1029,31 @@ void vkvg_set_source(VkvgContext ctx, VkvgPattern pat) { vkvg_pattern_reference(pat); } void vkvg_set_line_width(VkvgContext ctx, float width) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_LINE_WIDTH, width); ctx->lineWidth = width; } void vkvg_set_miter_limit(VkvgContext ctx, float limit) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_LINE_WIDTH, limit); ctx->miterLimit = limit; } void vkvg_set_line_cap(VkvgContext ctx, vkvg_line_cap_t cap) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_LINE_CAP, cap); ctx->lineCap = cap; } void vkvg_set_line_join(VkvgContext ctx, vkvg_line_join_t join) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_LINE_JOIN, join); ctx->lineJoin = join; } void vkvg_set_operator(VkvgContext ctx, vkvg_operator_t op) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_OPERATOR, op); if (op == ctx->curOperator) @@ -1077,7 +1068,7 @@ void vkvg_set_operator(VkvgContext ctx, vkvg_operator_t op) { _bind_draw_pipeline(ctx); } void vkvg_set_fill_rule(VkvgContext ctx, vkvg_fill_rule_t fr) { - if (ctx->status) + if (vkvg_status(ctx)) return; #ifndef __APPLE__ RECORD(ctx, VKVG_CMD_SET_FILL_RULE, fr); @@ -1085,17 +1076,17 @@ void vkvg_set_fill_rule(VkvgContext ctx, vkvg_fill_rule_t fr) { #endif } vkvg_fill_rule_t vkvg_get_fill_rule(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return VKVG_FILL_RULE_NON_ZERO; return ctx->curFillRule; } float vkvg_get_line_width(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return 0; return ctx->lineWidth; } void vkvg_set_dash(VkvgContext ctx, const float *dashes, uint32_t num_dashes, float offset) { - if (ctx->status) + if (vkvg_status(ctx)) return; if (ctx->dashCount > 0) free(ctx->dashes); @@ -1108,7 +1099,7 @@ void vkvg_set_dash(VkvgContext ctx, const float *dashes, uint32_t num_dashes, fl memcpy(ctx->dashes, dashes, sizeof(float) * ctx->dashCount); } void vkvg_get_dash(VkvgContext ctx, const float *dashes, uint32_t *num_dashes, float *offset) { - if (ctx->status) + if (vkvg_status(ctx)) return; *num_dashes = ctx->dashCount; *offset = ctx->dashOffset; @@ -1118,35 +1109,35 @@ void vkvg_get_dash(VkvgContext ctx, const float *dashes, uint32_t *num_dashes, f } vkvg_line_cap_t vkvg_get_line_cap(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return (vkvg_line_cap_t)0; return ctx->lineCap; } vkvg_line_join_t vkvg_get_line_join(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return (vkvg_line_join_t)0; return ctx->lineJoin; } vkvg_operator_t vkvg_get_operator(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return (vkvg_operator_t)0; return ctx->curOperator; } VkvgPattern vkvg_get_source(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return NULL; vkvg_pattern_reference(ctx->pattern); return ctx->pattern; } void vkvg_select_font_face(VkvgContext ctx, const char *name) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_FONT_FACE, name); _select_font_face(ctx, name); } void vkvg_load_font_from_path(VkvgContext ctx, const char *path, const char *name) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_FONT_PATH, name); _vkvg_font_identity_t *fid = _font_cache_add_font_identity(ctx, path, name); @@ -1157,7 +1148,7 @@ void vkvg_load_font_from_path(VkvgContext ctx, const char *path, const char *nam _select_font_face(ctx, name); } void vkvg_load_font_from_memory(VkvgContext ctx, unsigned char *fontBuffer, long fontBufferByteSize, const char *name) { - if (ctx->status) + if (vkvg_status(ctx)) return; // RECORD(ctx, VKVG_CMD_SET_FONT_PATH, name); _vkvg_font_identity_t *fid = _font_cache_add_font_identity(ctx, NULL, name); @@ -1167,7 +1158,7 @@ void vkvg_load_font_from_memory(VkvgContext ctx, unsigned char *fontBuffer, long _select_font_face(ctx, name); } void vkvg_set_font_size(VkvgContext ctx, uint32_t size) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_FONT_SIZE, size); #ifdef VKVG_USE_FREETYPE @@ -1185,7 +1176,7 @@ void vkvg_set_font_size(VkvgContext ctx, uint32_t size) { void vkvg_set_text_direction(vkvg_context *ctx, vkvg_direction_t direction) {} void vkvg_show_text(VkvgContext ctx, const char *text) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SHOW_TEXT, text); LOG(VKVG_LOG_INFO_CMD, "CMD: show_text:\n"); @@ -1195,14 +1186,14 @@ void vkvg_show_text(VkvgContext ctx, const char *text) { } VkvgText vkvg_text_run_create(VkvgContext ctx, const char *text) { - if (ctx->status) + if (vkvg_status(ctx)) return NULL; VkvgText tr = (vkvg_text_run_t *)calloc(1, sizeof(vkvg_text_run_t)); _font_cache_create_text_run(ctx, text, -1, tr); return tr; } VkvgText vkvg_text_run_create_with_length(VkvgContext ctx, const char *text, uint32_t length) { - if (ctx->status) + if (vkvg_status(ctx)) return NULL; VkvgText tr = (vkvg_text_run_t *)calloc(1, sizeof(vkvg_text_run_t)); _font_cache_create_text_run(ctx, text, length, tr); @@ -1225,25 +1216,25 @@ void vkvg_text_run_destroy(VkvgText textRun) { free(textRun); } void vkvg_show_text_run(VkvgContext ctx, VkvgText textRun) { - if (ctx->status) + if (vkvg_status(ctx)) return; _font_cache_show_text_run(ctx, textRun); } void vkvg_text_run_get_extents(VkvgText textRun, vkvg_text_extents_t *extents) { *extents = textRun->extents; } void vkvg_text_extents(VkvgContext ctx, const char *text, vkvg_text_extents_t *extents) { - if (ctx->status) + if (vkvg_status(ctx)) return; _font_cache_text_extents(ctx, text, -1, extents); } void vkvg_font_extents(VkvgContext ctx, vkvg_font_extents_t *extents) { - if (ctx->status) + if (vkvg_status(ctx)) return; _font_cache_font_extents(ctx, extents); } void vkvg_save(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SAVE); LOG(VKVG_LOG_INFO, "SAVE CONTEXT: ctx = %p\n", ctx); @@ -1275,7 +1266,7 @@ void vkvg_save(VkvgContext ctx) { } ctx->savedStencils = savedStencilsPtr; VkhImage savStencil = vkh_image_ms_create( - (VkhDevice)dev, dev->stencilFormat, dev->samples, ctx->pSurf->width, ctx->pSurf->height, + (VkhDevice)&ctx->dev->vkDev, dev->stencilFormat, dev->samples, ctx->pSurf->width, ctx->pSurf->height, VKH_MEMORY_USAGE_GPU_ONLY, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); ctx->savedStencils[curSaveStencil - 1] = savStencil; @@ -1368,7 +1359,7 @@ void vkvg_save(VkvgContext ctx) { ctx->pSavedCtxs = sav; } void vkvg_restore(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_RESTORE); @@ -1506,7 +1497,7 @@ void vkvg_restore(VkvgContext ctx) { } void vkvg_translate(VkvgContext ctx, float dx, float dy) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_TRANSLATE, dx, dy); LOG(VKVG_LOG_INFO_CMD, "CMD: translate: %f, %f\n", dx, dy); @@ -1515,7 +1506,7 @@ void vkvg_translate(VkvgContext ctx, float dx, float dy) { _set_mat_inv_and_vkCmdPush(ctx); } void vkvg_scale(VkvgContext ctx, float sx, float sy) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SCALE, sx, sy); LOG(VKVG_LOG_INFO_CMD, "CMD: scale: %f, %f\n", sx, sy); @@ -1524,7 +1515,7 @@ void vkvg_scale(VkvgContext ctx, float sx, float sy) { _set_mat_inv_and_vkCmdPush(ctx); } void vkvg_rotate(VkvgContext ctx, float radians) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_ROTATE, radians); LOG(VKVG_LOG_INFO_CMD, "CMD: rotate: %f\n", radians); @@ -1533,7 +1524,7 @@ void vkvg_rotate(VkvgContext ctx, float radians) { _set_mat_inv_and_vkCmdPush(ctx); } void vkvg_transform(VkvgContext ctx, const vkvg_matrix_t *matrix) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_TRANSFORM, matrix); LOG(VKVG_LOG_INFO_CMD, "CMD: transform: %f, %f, %f, %f, %f, %f\n", matrix->xx, matrix->yx, matrix->xy, matrix->yy, @@ -1545,7 +1536,7 @@ void vkvg_transform(VkvgContext ctx, const vkvg_matrix_t *matrix) { _set_mat_inv_and_vkCmdPush(ctx); } void vkvg_identity_matrix(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_IDENTITY_MATRIX); LOG(VKVG_LOG_INFO_CMD, "CMD: identity_matrix:\n"); @@ -1555,7 +1546,7 @@ void vkvg_identity_matrix(VkvgContext ctx) { _set_mat_inv_and_vkCmdPush(ctx); } void vkvg_set_matrix(VkvgContext ctx, const vkvg_matrix_t *matrix) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_SET_MATRIX, matrix); LOG(VKVG_LOG_INFO_CMD, "CMD: set_matrix: %f, %f, %f, %f, %f, %f\n", matrix->xx, matrix->yx, matrix->xy, matrix->yy, @@ -1568,7 +1559,7 @@ void vkvg_get_matrix(VkvgContext ctx, vkvg_matrix_t *const matrix) { *matrix = c void vkvg_elliptic_arc_to(VkvgContext ctx, float x2, float y2, bool largeArc, bool sweepFlag, float rx, float ry, float phi) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_ELLIPTICAL_ARC_TO, x2, y2, rx, ry, phi, largeArc, sweepFlag); LOG(VKVG_LOG_INFO_CMD, @@ -1580,7 +1571,7 @@ void vkvg_elliptic_arc_to(VkvgContext ctx, float x2, float y2, bool largeArc, bo } void vkvg_rel_elliptic_arc_to(VkvgContext ctx, float x2, float y2, bool largeArc, bool sweepFlag, float rx, float ry, float phi) { - if (ctx->status) + if (vkvg_status(ctx)) return; RECORD(ctx, VKVG_CMD_REL_ELLIPTICAL_ARC_TO, x2, y2, rx, ry, phi, largeArc, sweepFlag); LOG(VKVG_LOG_INFO_CMD, @@ -1593,7 +1584,7 @@ void vkvg_rel_elliptic_arc_to(VkvgContext ctx, float x2, float y2, bool largeArc } void vkvg_ellipse(VkvgContext ctx, float radiusX, float radiusY, float x, float y, float rotationAngle) { - if (ctx->status) + if (vkvg_status(ctx)) return; LOG(VKVG_LOG_INFO_CMD, "CMD: ellipse:\n"); @@ -1629,7 +1620,7 @@ void vkvg_ellipse(VkvgContext ctx, float radiusX, float radiusY, float x, float } VkvgSurface vkvg_get_target(VkvgContext ctx) { - if (ctx->status) + if (vkvg_status(ctx)) return NULL; return ctx->pSurf; } @@ -1638,8 +1629,8 @@ const char *vkvg_status_to_string(vkvg_status_t status) { switch (status) { case VKVG_STATUS_SUCCESS: return "no error has occurred"; - case VKVG_STATUS_NO_MEMORY: - return "out of memory"; + /*case VKVG_STATUS_NO_MEMORY: + return "out of memory";*/ case VKVG_STATUS_INVALID_RESTORE: return "vkvg_restore() without matching vkvg_save()"; case VKVG_STATUS_NO_CURRENT_POINT: diff --git a/src/vkvg_context_internal.c b/src/vkvg_context_internal.c index ce68947..7b549cd 100644 --- a/src/vkvg_context_internal.c +++ b/src/vkvg_context_internal.c @@ -251,13 +251,13 @@ float _get_arc_step(VkvgContext ctx, float radius) { return fminf(M_PIF / 3.f, M_PIF / (r * 0.4f)); } void _create_gradient_buff(VkvgContext ctx) { - vkh_buffer_init((VkhDevice)ctx->dev, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VKH_MEMORY_USAGE_CPU_TO_GPU, + vkh_buffer_init((VkhDevice)&ctx->dev->vkDev, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VKH_MEMORY_USAGE_CPU_TO_GPU, sizeof(vkvg_gradient_t), &ctx->uboGrad, true); } void _create_vertices_buff(VkvgContext ctx) { - vkh_buffer_init((VkhDevice)ctx->dev, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VKH_MEMORY_USAGE_CPU_TO_GPU, + vkh_buffer_init((VkhDevice)&ctx->dev->vkDev, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VKH_MEMORY_USAGE_CPU_TO_GPU, ctx->sizeVBO * sizeof(Vertex), &ctx->vertices, true); - vkh_buffer_init((VkhDevice)ctx->dev, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VKH_MEMORY_USAGE_CPU_TO_GPU, + vkh_buffer_init((VkhDevice)&ctx->dev->vkDev, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VKH_MEMORY_USAGE_CPU_TO_GPU, ctx->sizeIBO * sizeof(VKVG_IBO_INDEX_TYPE), &ctx->indices, true); } void _resize_vbo(VkvgContext ctx, uint32_t new_size) { @@ -395,9 +395,10 @@ void _ensure_renderpass_is_started(VkvgContext ctx) { _update_push_constants(ctx); } void _create_cmd_buff(VkvgContext ctx) { - vkh_cmd_buffs_create((VkhDevice)ctx->dev, ctx->cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 2, ctx->cmdBuffers); + vkh_cmd_buffs_create((VkhDevice)&ctx->dev->vkDev, ctx->cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 2, + ctx->cmdBuffers); #if defined(DEBUG) && defined(ENABLE_VALIDATION) - vkh_device_set_object_name((VkhDevice)ctx->pSurf->dev, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + vkh_device_set_object_name((VkhDevice)&ctx->pSurf->dev->vkDev, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, (uint64_t)ctx->cmd, "vkvgCtxCmd"); #endif } @@ -406,7 +407,7 @@ void _clear_attachment(VkvgContext ctx) {} bool _wait_ctx_flush_end(VkvgContext ctx) { LOG(VKVG_LOG_INFO, "CTX: _wait_flush_fence\n"); #ifdef VKVG_ENABLE_VK_TIMELINE_SEMAPHORE - if (vkh_timeline_wait((VkhDevice)ctx->dev, ctx->pSurf->timeline, ctx->timelineStep) == VK_SUCCESS) + if (vkh_timeline_wait((VkhDevice)&ctx->dev->vkDev, ctx->pSurf->timeline, ctx->timelineStep) == VK_SUCCESS) return true; #else if (WaitForFences(ctx->dev->vkDev, 1, &ctx->flushFence, VK_TRUE, VKVG_FENCE_TIMEOUT) == VK_SUCCESS) @@ -426,7 +427,7 @@ bool _wait_and_submit_cmd(VkvgContext ctx) { #ifdef VKVG_ENABLE_VK_TIMELINE_SEMAPHORE VkvgSurface surf = ctx->pSurf; VkvgDevice dev = surf->dev; - // vkh_timeline_wait ((VkhDevice)dev, surf->timeline, ct->timelineStep); + // vkh_timeline_wait ((VkhDevice)&dev->vkDev, surf->timeline, ct->timelineStep); if (ctx->pattern && ctx->pattern->type == VKVG_PATTERN_TYPE_SURFACE) { // add source surface timeline sync. VkvgSurface source = (VkvgSurface)ctx->pattern->data; @@ -755,11 +756,19 @@ void _update_cur_pattern(VkvgContext ctx, VkvgPattern pat) { _update_descriptor_set(ctx, surf->img, ctx->dsSrc); + ctx->pushConsts.source.width = (float)surf->width; + ctx->pushConsts.source.height = (float)surf->height; + + vkvg_matrix_t mat; if (pat->hasMatrix) { + vkvg_pattern_get_matrix(pat, &mat); + // if (vkvg_matrix_invert(&mat) != VKVG_STATUS_SUCCESS) + // mat = VKVG_IDENTITY_MATRIX; + // vkvg_matrix_transform_point(&mat, &ctx->pushConsts.source.x, &ctx->pushConsts.source.y); + // vkvg_matrix_transform_distance(&mat, &ctx->pushConsts.source.width, &ctx->pushConsts.source.height); + vkvg_matrix_multiply(&ctx->pushConsts.matInv, &ctx->pushConsts.matInv, &mat); } - ctx->pushConsts.source.width = (float)surf->width; - ctx->pushConsts.source.height = (float)surf->height; break; } case VKVG_PATTERN_TYPE_LINEAR: @@ -784,15 +793,15 @@ void _update_cur_pattern(VkvgContext ctx, VkvgPattern pat) { ctx->status = VKVG_STATUS_PATTERN_INVALID_GRADIENT; return; } + vkvg_matrix_t mat; if (pat->hasMatrix) { vkvg_pattern_get_matrix(pat, &mat); if (vkvg_matrix_invert(&mat) != VKVG_STATUS_SUCCESS) mat = VKVG_IDENTITY_MATRIX; + vkvg_matrix_transform_point(&mat, &grad.cp[0].x, &grad.cp[0].y); } - if (pat->hasMatrix) - vkvg_matrix_transform_point(&mat, &grad.cp[0].x, &grad.cp[0].y); vkvg_matrix_transform_point(&ctx->pushConsts.mat, &grad.cp[0].x, &grad.cp[0].y); if (pat->type == VKVG_PATTERN_TYPE_LINEAR) { if (pat->hasMatrix) diff --git a/src/vkvg_device.c b/src/vkvg_device.c index ad54fea..d45a28e 100644 --- a/src/vkvg_device.c +++ b/src/vkvg_device.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2022 Jean-Philippe Bruyère + * Copyright (c) 2018-2025 Jean-Philippe Bruyère * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -71,6 +71,8 @@ void _device_init(VkvgDevice dev, const vkvg_device_create_info_t *info) { if (dev->status != VKVG_STATUS_SUCCESS) return; + VkhDevice vkhd = (VkhDevice)&dev->vkDev; + if (!_device_init_function_pointers(dev)) { dev->status = VKVG_STATUS_NULL_POINTER; return; @@ -79,7 +81,7 @@ void _device_init(VkvgDevice dev, const vkvg_device_create_info_t *info) { VkhPhyInfo phyInfos = vkh_phyinfo_create(dev->phy, NULL); dev->phyMemProps = phyInfos->memProps; - dev->gQueue = vkh_queue_create((VkhDevice)dev, info->qFamIdx, info->qIndex); + dev->gQueue = vkh_queue_create(vkhd, info->qFamIdx, info->qIndex); // mtx_init (&dev->gQMutex, mtx_plain); vkh_phyinfo_destroy(phyInfos); @@ -89,10 +91,9 @@ void _device_init(VkvgDevice dev, const vkvg_device_create_info_t *info) { vmaCreateAllocator(&allocatorInfo, (VmaAllocator *)&dev->allocator); #endif - dev->cmdPool = - vkh_cmd_pool_create((VkhDevice)dev, dev->gQueue->familyIndex, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); - dev->cmd = vkh_cmd_buff_create((VkhDevice)dev, dev->cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); - dev->fence = vkh_fence_create_signaled((VkhDevice)dev); + dev->cmdPool = vkh_cmd_pool_create(vkhd, dev->gQueue->familyIndex, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); + dev->cmd = vkh_cmd_buff_create(vkhd, dev->cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); + dev->fence = vkh_fence_create_signaled(vkhd); _device_create_pipeline_cache(dev); _fonts_cache_create(dev); @@ -120,38 +121,31 @@ void _device_init(VkvgDevice dev, const vkvg_device_create_info_t *info) { _linux_register_error_handler(); #endif #ifdef VKVG_DBG_UTILS - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_COMMAND_POOL, (uint64_t)dev->cmdPool, "Device Cmd Pool"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)dev->cmd, "Device Cmd Buff"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_FENCE, (uint64_t)dev->fence, "Device Fence"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_RENDER_PASS, (uint64_t)dev->renderPass, - "RP load img/stencil"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_RENDER_PASS, (uint64_t)dev->renderPass_ClearStencil, + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_COMMAND_POOL, (uint64_t)dev->cmdPool, "Device Cmd Pool"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)dev->cmd, "Device Cmd Buff"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_FENCE, (uint64_t)dev->fence, "Device Fence"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_RENDER_PASS, (uint64_t)dev->renderPass, "RP load img/stencil"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_RENDER_PASS, (uint64_t)dev->renderPass_ClearStencil, "RP clear stencil"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_RENDER_PASS, (uint64_t)dev->renderPass_ClearAll, - "RP clear all"); - - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t)dev->dslSrc, - "DSLayout SOURCE"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t)dev->dslFont, - "DSLayout FONT"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t)dev->dslGrad, - "DSLayout GRADIENT"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_PIPELINE_LAYOUT, (uint64_t)dev->pipelineLayout, - "PLLayout dev"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_RENDER_PASS, (uint64_t)dev->renderPass_ClearAll, "RP clear all"); + + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t)dev->dslSrc, "DSLayout SOURCE"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t)dev->dslFont, "DSLayout FONT"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, (uint64_t)dev->dslGrad, "DSLayout GRADIENT"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_PIPELINE_LAYOUT, (uint64_t)dev->pipelineLayout, "PLLayout dev"); #ifndef __APPLE__ - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_PIPELINE, (uint64_t)dev->pipelinePolyFill, - "PL Poly fill"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_PIPELINE, (uint64_t)dev->pipelinePolyFill, "PL Poly fill"); #endif - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_PIPELINE, (uint64_t)dev->pipelineClipping, "PL Clipping"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_PIPELINE, (uint64_t)dev->pipe_OVER, "PL draw Over"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_PIPELINE, (uint64_t)dev->pipe_SUB, "PL draw Substract"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_PIPELINE, (uint64_t)dev->pipe_CLEAR, "PL draw Clear"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_PIPELINE, (uint64_t)dev->pipelineClipping, "PL Clipping"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_PIPELINE, (uint64_t)dev->pipe_OVER, "PL draw Over"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_PIPELINE, (uint64_t)dev->pipe_SUB, "PL draw Substract"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_PIPELINE, (uint64_t)dev->pipe_CLEAR, "PL draw Clear"); vkh_image_set_name(dev->emptyImg, "empty IMG"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(dev->emptyImg), + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(dev->emptyImg), "empty IMG VIEW"); - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(dev->emptyImg), + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(dev->emptyImg), "empty IMG SAMPLER"); #endif #endif @@ -286,14 +280,25 @@ const void *vkvg_get_device_requirements(VkPhysicalDeviceFeatures *pEnabledFeatu VkvgDevice vkvg_device_create(vkvg_device_create_info_t *info) { LOG(VKVG_LOG_INFO, "CREATE Device\n"); + if (!info) { + LOG(VKVG_LOG_ERR, "CREATE Device failed, provided vkvg_device_create_info_t is null\n"); + return (VkvgDevice)&_vkvg_status_invalid_dev_ci; + } VkvgDevice dev = (vkvg_device *)calloc(1, sizeof(vkvg_device)); if (!dev) { LOG(VKVG_LOG_ERR, "CREATE Device failed, no memory\n"); - exit(-1); + return (VkvgDevice)&_vkvg_status_no_memory; } dev->references = 1; + dev->threadAware = info->threadAware; + if (dev->threadAware) { + mtx_init(&dev->mutex, mtx_plain); + mtx_init(&dev->fontCache->mutex, mtx_plain); + dev->threadAware = true; + } + if (!info->vkdev) { const char *enabledExts[10]; const char *enabledLayers[10]; @@ -337,6 +342,9 @@ VkvgDevice vkvg_device_create(vkvg_device_create_info_t *info) { if (!_device_try_get_phyinfo(phys, phyCount, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU, &pi)) pi = phys[0]; + if (!info->samples) // if not set, default to 1 sample + info->samples = VK_SAMPLE_COUNT_1_BIT; + if (!(pi->properties.limits.framebufferColorSampleCounts & info->samples)) { LOG(VKVG_LOG_ERR, "CREATE Device failed: sample count not supported: %d\n", info->samples); dev->status = VKVG_STATUS_DEVICE_ERROR; @@ -388,6 +396,10 @@ VkvgDevice vkvg_device_create(vkvg_device_create_info_t *info) { } void vkvg_device_destroy(VkvgDevice dev) { + if (vkvg_device_status(dev)) { + LOG(VKVG_LOG_ERR, "DESTROY Device failed, see Status for info"); + return; + } LOCK_DEVICE dev->references--; if (dev->references > 0) { @@ -396,9 +408,13 @@ void vkvg_device_destroy(VkvgDevice dev) { } UNLOCK_DEVICE + LOG(VKVG_LOG_INFO, "DESTROY Device\n"); + if (dev->cachedContextCount > 0) { _cached_ctx *cur = dev->cachedContextLast; while (cur) { + assert(cur->ctx->status == VKVG_STATUS_IN_CACHE); + cur->ctx->status = VKVG_STATUS_SUCCESS; _release_context_ressources(cur->ctx); _cached_ctx *prev = cur; cur = cur->pNext; @@ -406,8 +422,6 @@ void vkvg_device_destroy(VkvgDevice dev) { } } - LOG(VKVG_LOG_INFO, "DESTROY Device\n"); - vkDeviceWaitIdle(dev->vkDev); vkh_image_destroy(dev->emptyImg); @@ -449,8 +463,10 @@ void vkvg_device_destroy(VkvgDevice dev) { vmaDestroyAllocator(dev->allocator); #endif - if (dev->threadAware) + if (dev->threadAware) { mtx_destroy(&dev->mutex); + mtx_destroy(&dev->fontCache->mutex); + } if (dev->vkhDev) { VkhApp app = vkh_device_get_app(dev->vkhDev); @@ -461,38 +477,38 @@ void vkvg_device_destroy(VkvgDevice dev) { free(dev); } -vkvg_status_t vkvg_device_status(VkvgDevice dev) { return dev->status; } +vkvg_status_t vkvg_device_status(VkvgDevice dev) { return !dev ? VKVG_STATUS_NULL_POINTER : dev->status; } VkvgDevice vkvg_device_reference(VkvgDevice dev) { - LOCK_DEVICE - dev->references++; - UNLOCK_DEVICE + if (!vkvg_device_status(dev)) { + LOCK_DEVICE + dev->references++; + UNLOCK_DEVICE + } return dev; } -uint32_t vkvg_device_get_reference_count(VkvgDevice dev) { return dev->references; } -void vkvg_device_set_dpy(VkvgDevice dev, int hdpy, int vdpy) { +uint32_t vkvg_device_get_reference_count(VkvgDevice dev) { return vkvg_device_status(dev) ? 0 : dev->references; } +// TODO dpy reorganisation +void vkvg_device_set_dpy(VkvgDevice dev, int hdpy, int vdpy) { + if (vkvg_device_status(dev)) + return; dev->hdpi = hdpy; dev->vdpi = vdpy; // TODO: reset font cache } void vkvg_device_get_dpy(VkvgDevice dev, int *hdpy, int *vdpy) { + if (vkvg_device_status(dev)) + return; *hdpy = dev->hdpi; *vdpy = dev->vdpi; } -void vkvg_device_set_thread_aware(VkvgDevice dev, uint32_t thread_aware) { - if (thread_aware) { - if (dev->threadAware) - return; - mtx_init(&dev->mutex, mtx_plain); - mtx_init(&dev->fontCache->mutex, mtx_plain); - dev->threadAware = true; - } else if (dev->threadAware) { - mtx_destroy(&dev->mutex); - mtx_destroy(&dev->fontCache->mutex); - dev->threadAware = false; - } -} #if VKVG_DBG_STATS -vkvg_debug_stats_t vkvg_device_get_stats(VkvgDevice dev) { return dev->debug_stats; } -vkvg_debug_stats_t vkvg_device_reset_stats(VkvgDevice dev) { dev->debug_stats = (vkvg_debug_stats_t){0}; } +vkvg_debug_stats_t vkvg_device_get_stats(VkvgDevice dev) { + return vkvg_device_status(dev) ? (vkvg_debug_stats_t){0} : dev->debug_stats; +} +void vkvg_device_reset_stats(VkvgDevice dev) { + if (vkvg_device_status(dev)) + return; + dev->debug_stats = (vkvg_debug_stats_t){0}; +} #endif diff --git a/src/vkvg_device_internal.c b/src/vkvg_device_internal.c index 1264d2f..928b5b8 100644 --- a/src/vkvg_device_internal.c +++ b/src/vkvg_device_internal.c @@ -495,7 +495,7 @@ bool _device_init_function_pointers(VkvgDevice dev) { LOG(VKVG_LOG_ERR, "vkvg create device failed: 'VK_EXT_debug_utils' has to be loaded for Debug build\n"); return false; } - vkh_device_init_debug_utils((VkhDevice)dev); + vkh_device_init_debug_utils((VkhDevice)&dev->vkDev); #endif CmdBindPipeline = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdBindPipeline); CmdBindDescriptorSets = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdBindDescriptorSets); @@ -519,7 +519,7 @@ bool _device_init_function_pointers(VkvgDevice dev) { void _device_create_empty_texture(VkvgDevice dev, VkFormat format, VkImageTiling tiling) { // create empty image to bind to context source descriptor when not in use - dev->emptyImg = vkh_image_create((VkhDevice)dev, format, 16, 16, tiling, VKH_MEMORY_USAGE_GPU_ONLY, + dev->emptyImg = vkh_image_create((VkhDevice)&dev->vkDev, format, 16, 16, tiling, VKH_MEMORY_USAGE_GPU_ONLY, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); vkh_image_create_descriptor(dev->emptyImg, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST, diff --git a/src/vkvg_device_internal.h b/src/vkvg_device_internal.h index d17eae1..aeddd29 100644 --- a/src/vkvg_device_internal.h +++ b/src/vkvg_device_internal.h @@ -59,6 +59,7 @@ typedef struct _cached_ctx { } _cached_ctx; typedef struct _vkvg_device_t { + vkvg_status_t status; /**< Current status of device, affected by last operation */ VkDevice vkDev; /**< Vulkan Logical Device */ VkPhysicalDeviceMemoryProperties phyMemProps; /**< Vulkan Physical device memory properties */ VkPhysicalDevice phy; /**< Vulkan Physical device */ @@ -109,7 +110,6 @@ typedef struct _vkvg_device_t { VkhImage emptyImg; /**< prevent unbound descriptor to trigger Validation error 61 */ VkSampleCountFlags samples; /**< samples count common to all surfaces */ bool deferredResolve; /**< if true, resolve only on context destruction and set as source */ - vkvg_status_t status; /**< Current status of device, affected by last operation */ _font_cache_t *fontCache; /**< Store everything relative to common font caching system */ diff --git a/src/vkvg_fonts.c b/src/vkvg_fonts.c index 868f42b..ba3b687 100644 --- a/src/vkvg_fonts.c +++ b/src/vkvg_fonts.c @@ -67,22 +67,24 @@ void _fonts_cache_create(VkvgDevice dev) { cache->texPixelSize = 1; #endif + VkhDevice vkhd = (VkhDevice)&dev->vkDev; + cache->texLength = FONT_CACHE_INIT_LAYERS; cache->texture = vkh_tex2d_array_create( - (VkhDevice)dev, cache->texFormat, FONT_PAGE_SIZE, FONT_PAGE_SIZE, cache->texLength, VKH_MEMORY_USAGE_GPU_ONLY, + vkhd, cache->texFormat, FONT_PAGE_SIZE, FONT_PAGE_SIZE, cache->texLength, VKH_MEMORY_USAGE_GPU_ONLY, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT); vkh_image_create_descriptor(cache->texture, VK_IMAGE_VIEW_TYPE_2D_ARRAY, VK_IMAGE_ASPECT_COLOR_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER); - cache->uploadFence = vkh_fence_create((VkhDevice)dev); + cache->uploadFence = vkh_fence_create(vkhd); const uint32_t buffLength = FONT_PAGE_SIZE * FONT_PAGE_SIZE * cache->texPixelSize; - vkh_buffer_init((VkhDevice)dev, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VKH_MEMORY_USAGE_CPU_TO_GPU, buffLength, - &cache->buff, true); + vkh_buffer_init(vkhd, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VKH_MEMORY_USAGE_CPU_TO_GPU, buffLength, &cache->buff, + true); - cache->cmd = vkh_cmd_buff_create((VkhDevice)dev, dev->cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); + cache->cmd = vkh_cmd_buff_create(vkhd, dev->cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); // Set texture cache initial layout to shaderReadOnly to prevent error msg if cache is not fill const VkImageSubresourceRange subres = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, cache->texLength}; @@ -111,7 +113,7 @@ void _increase_font_tex_array(VkvgDevice dev) { uint8_t newSize = cache->texLength + FONT_CACHE_INIT_LAYERS; VkhImage newImg = vkh_tex2d_array_create( - (VkhDevice)dev, cache->texFormat, FONT_PAGE_SIZE, FONT_PAGE_SIZE, newSize, VKH_MEMORY_USAGE_GPU_ONLY, + (VkhDevice)&dev->vkDev, cache->texFormat, FONT_PAGE_SIZE, FONT_PAGE_SIZE, newSize, VKH_MEMORY_USAGE_GPU_ONLY, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT); vkh_image_create_descriptor(newImg, VK_IMAGE_VIEW_TYPE_2D_ARRAY, VK_IMAGE_ASPECT_COLOR_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST, diff --git a/src/vkvg_internal.h b/src/vkvg_internal.h index 3afbe43..bceecdb 100644 --- a/src/vkvg_internal.h +++ b/src/vkvg_internal.h @@ -33,6 +33,10 @@ #include #include +// should be supported by c11 +// #include +// #include + #define _USE_MATH_DEFINES #include @@ -98,6 +102,11 @@ vkvg_status_t status; } _vkvg_no_mem_struct;*/ -static vkvg_status_t _no_mem_status = VKVG_STATUS_NO_MEMORY; +// static error value whose address is returned instead of vkvg object pointers to avoid null pointers. +static vkvg_status_t _vkvg_status_no_memory = VKVG_STATUS_NO_MEMORY; +static vkvg_status_t _vkvg_status_null_pointer = VKVG_STATUS_NULL_POINTER; +static vkvg_status_t _vkvg_status_invalid_dev_ci = VKVG_STATUS_INVALID_DEVICE_CREATE_INFO; +static vkvg_status_t _vkvg_status_device_error = VKVG_STATUS_DEVICE_ERROR; +static vkvg_status_t _vkvg_status_invalid_surface = VKVG_STATUS_INVALID_SURFACE; #endif diff --git a/src/vkvg_pattern.c b/src/vkvg_pattern.c index 2aad091..451f6e1 100644 --- a/src/vkvg_pattern.c +++ b/src/vkvg_pattern.c @@ -26,9 +26,15 @@ #include "vkvg_pattern.h" VkvgPattern vkvg_pattern_create_for_surface(VkvgSurface surf) { + if (!surf) { + LOG(VKVG_LOG_ERR, "CREATE Pattern failed, invalid surface\n"); + return (VkvgPattern)&_vkvg_status_null_pointer; + } VkvgPattern pat = (vkvg_pattern_t *)calloc(1, sizeof(vkvg_pattern_t)); - if (!pat) - return (VkvgPattern)&_no_mem_status; + if (!pat) { + LOG(VKVG_LOG_ERR, "CREATE Pattern failed, no memory\n"); + return (VkvgPattern)&_vkvg_status_null_pointer; + } pat->type = VKVG_PATTERN_TYPE_SURFACE; pat->extend = VKVG_EXTEND_NONE; @@ -68,8 +74,10 @@ vkvg_status_t vkvg_pattern_edit_linear(VkvgPattern pat, float x0, float y0, floa } VkvgPattern vkvg_pattern_create_linear(float x0, float y0, float x1, float y1) { VkvgPattern pat = (vkvg_pattern_t *)calloc(1, sizeof(vkvg_pattern_t)); - if (!pat) - return (VkvgPattern)&_no_mem_status; + if (!pat) { + LOG(VKVG_LOG_ERR, "CREATE Pattern failed, no memory\n"); + return (VkvgPattern)&_vkvg_status_null_pointer; + } pat->type = VKVG_PATTERN_TYPE_LINEAR; pat->extend = VKVG_EXTEND_NONE; @@ -78,8 +86,9 @@ VkvgPattern vkvg_pattern_create_linear(float x0, float y0, float x1, float y1) { if (pat->data) { vkvg_pattern_edit_linear(pat, x0, y0, x1, y1); pat->references = 1; - } else - pat->status = VKVG_STATUS_NO_MEMORY; + } else { + pat->status = VKVG_STATUS_PATTERN_INVALID_GRADIENT; + } return pat; } @@ -110,8 +119,10 @@ vkvg_status_t vkvg_pattern_edit_radial(VkvgPattern pat, float cx0, float cy0, fl } VkvgPattern vkvg_pattern_create_radial(float cx0, float cy0, float radius0, float cx1, float cy1, float radius1) { VkvgPattern pat = (vkvg_pattern_t *)calloc(1, sizeof(vkvg_pattern_t)); - if (!pat) - return (VkvgPattern)&_no_mem_status; + if (!pat) { + LOG(VKVG_LOG_ERR, "CREATE Pattern failed, no memory\n"); + return (VkvgPattern)&_vkvg_status_null_pointer; + } pat->type = VKVG_PATTERN_TYPE_RADIAL; pat->extend = VKVG_EXTEND_NONE; diff --git a/src/vkvg_surface.c b/src/vkvg_surface.c index fc28175..c52e722 100644 --- a/src/vkvg_surface.c +++ b/src/vkvg_surface.c @@ -29,34 +29,8 @@ #include "stb_image_write.h" #include "vkh_image.h" -#define max(x, y) -void _transition_surf_images(VkvgSurface surf) { - LOCK_SURFACE(surf) - VkvgDevice dev = surf->dev; - - //_surface_wait_cmd (surf); - - vkh_cmd_begin(surf->cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - VkhImage imgMs = surf->imgMS; - if (imgMs != NULL) - vkh_image_set_layout(surf->cmd, imgMs, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); - - vkh_image_set_layout(surf->cmd, surf->img, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); - vkh_image_set_layout(surf->cmd, surf->stencil, dev->stencilAspectFlag, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT); - vkh_cmd_end(surf->cmd); - - _surface_submit_cmd(surf); - - UNLOCK_SURFACE(surf) -} void vkvg_surface_clear(VkvgSurface surf) { - if (surf->status) + if (vkvg_surface_status(surf)) return; _clear_surface(surf, VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT); } @@ -70,11 +44,9 @@ VkvgSurface vkvg_surface_create(VkvgDevice dev, uint32_t width, uint32_t height) surf->newSurf = true; // used to clear all attacments on first render pass _create_surface_images(surf); - _transition_surf_images(surf); surf->status = VKVG_STATUS_SUCCESS; - vkvg_device_reference(surf->dev); return surf; } VkvgSurface vkvg_surface_create_for_VkhImage(VkvgDevice dev, void *vkhImg) { @@ -103,7 +75,6 @@ VkvgSurface vkvg_surface_create_for_VkhImage(VkvgDevice dev, void *vkhImg) { //_clear_surface (surf, VK_IMAGE_ASPECT_STENCIL_BIT); surf->status = VKVG_STATUS_SUCCESS; - 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 @@ -124,20 +95,20 @@ VkvgSurface vkvg_surface_create_from_bitmap(VkvgDevice dev, unsigned char *img, uint32_t imgSize = width * height * 4; VkImageSubresourceLayers imgSubResLayers = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}; // original format image - VkhImage stagImg = vkh_image_create((VkhDevice)surf->dev, VK_FORMAT_R8G8B8A8_UNORM, surf->width, surf->height, - VK_IMAGE_TILING_LINEAR, VKH_MEMORY_USAGE_GPU_ONLY, + VkhImage stagImg = vkh_image_create((VkhDevice)&surf->dev->vkDev, VK_FORMAT_R8G8B8A8_UNORM, surf->width, + surf->height, VK_IMAGE_TILING_LINEAR, VKH_MEMORY_USAGE_GPU_ONLY, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); // bgra bliting target VkhImage tmpImg = - vkh_image_create((VkhDevice)surf->dev, surf->format, surf->width, surf->height, VK_IMAGE_TILING_LINEAR, + vkh_image_create((VkhDevice)&surf->dev->vkDev, surf->format, surf->width, surf->height, VK_IMAGE_TILING_LINEAR, VKH_MEMORY_USAGE_GPU_ONLY, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); vkh_image_create_descriptor(tmpImg, 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_BORDER); // staging buffer vkh_buffer_t buff = {0}; - vkh_buffer_init((VkhDevice)dev, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VKH_MEMORY_USAGE_CPU_TO_GPU, imgSize, &buff, - true); + vkh_buffer_init((VkhDevice)&dev->vkDev, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VKH_MEMORY_USAGE_CPU_TO_GPU, imgSize, + &buff, true); memcpy(vkh_buffer_get_mapped_pointer(&buff), img, imgSize); @@ -204,7 +175,6 @@ VkvgSurface vkvg_surface_create_from_bitmap(VkvgDevice dev, unsigned char *img, vkh_image_destroy(tmpImg); surf->status = VKVG_STATUS_SUCCESS; - vkvg_device_reference(surf->dev); return surf; } VkvgSurface vkvg_surface_create_from_image(VkvgDevice dev, const char *filePath) { @@ -212,7 +182,7 @@ VkvgSurface vkvg_surface_create_from_image(VkvgDevice dev, const char *filePath) unsigned char *img = stbi_load(filePath, &w, &h, &channels, 4); // force 4 components per pixel if (!img) { LOG(VKVG_LOG_ERR, "Could not load texture from %s, %s\n", filePath, stbi_failure_reason()); - return (VkvgSurface)&_no_mem_status; + return (VkvgSurface)&_vkvg_status_null_pointer; } VkvgSurface surf = vkvg_surface_create_from_bitmap(dev, img, (uint32_t)w, (uint32_t)h); @@ -223,8 +193,14 @@ VkvgSurface vkvg_surface_create_from_image(VkvgDevice dev, const char *filePath) } void vkvg_surface_destroy(VkvgSurface surf) { - if (surf->status) + if (vkvg_surface_status(surf)) { + LOG(VKVG_LOG_ERR, "DESTROY surface failed, invalid surface\n"); + return; + } + if (!surf->dev || surf->dev->status) { + LOG(VKVG_LOG_ERR, "DESTROY surface failed, device error\n"); return; + } LOCK_SURFACE(surf) surf->references--; @@ -234,6 +210,8 @@ void vkvg_surface_destroy(VkvgSurface surf) { } UNLOCK_SURFACE(surf) + LOG(VKVG_LOG_INFO, "DESTROY Surface\n"); + vkDestroyCommandPool(surf->dev->vkDev, surf->cmdPool, NULL); vkDestroyFramebuffer(surf->dev->vkDev, surf->fb, NULL); @@ -256,8 +234,10 @@ void vkvg_surface_destroy(VkvgSurface surf) { free(surf); } +vkvg_status_t vkvg_surface_status(VkvgSurface surf) { return !surf ? VKVG_STATUS_NULL_POINTER : surf->status; } + VkvgSurface vkvg_surface_reference(VkvgSurface surf) { - if (!surf->status) { + if (!vkvg_surface_status(surf)) { LOCK_SURFACE(surf) surf->references++; UNLOCK_SURFACE(surf) @@ -265,7 +245,7 @@ VkvgSurface vkvg_surface_reference(VkvgSurface surf) { return surf; } uint32_t vkvg_surface_get_reference_count(VkvgSurface surf) { - if (surf->status) + if (vkvg_surface_status(surf)) return 0; return surf->references; } @@ -323,11 +303,11 @@ vkvg_status_t vkvg_surface_write_to_png(VkvgSurface surf, const char *path) { VkhImage stagImg; if (dev->pngStagTiling == VK_IMAGE_TILING_LINEAR) - stagImg = vkh_image_create((VkhDevice)surf->dev, dev->pngStagFormat, surf->width, surf->height, + stagImg = vkh_image_create((VkhDevice)&surf->dev->vkDev, dev->pngStagFormat, surf->width, surf->height, dev->pngStagTiling, VKH_MEMORY_USAGE_GPU_TO_CPU, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); else - stagImg = vkh_image_create((VkhDevice)surf->dev, dev->pngStagFormat, surf->width, surf->height, + stagImg = vkh_image_create((VkhDevice)&surf->dev->vkDev, dev->pngStagFormat, surf->width, surf->height, dev->pngStagTiling, VKH_MEMORY_USAGE_GPU_ONLY, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); @@ -356,7 +336,7 @@ vkvg_status_t vkvg_surface_write_to_png(VkvgSurface surf, const char *path) { VkhImage stagImgLinear = stagImg; if (dev->pngStagTiling == VK_IMAGE_TILING_OPTIMAL) { - stagImgLinear = vkh_image_create((VkhDevice)surf->dev, dev->pngStagFormat, surf->width, surf->height, + stagImgLinear = vkh_image_create((VkhDevice)&surf->dev->vkDev, dev->pngStagFormat, surf->width, surf->height, VK_IMAGE_TILING_LINEAR, VKH_MEMORY_USAGE_GPU_TO_CPU, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); VkImageCopy cpy = {.srcSubresource = imgSubResLayers, @@ -411,8 +391,8 @@ vkvg_status_t vkvg_surface_write_to_memory(VkvgSurface surf, unsigned char *cons VkvgDevice dev = surf->dev; // RGBA to blit to, surf img is bgra - VkhImage stagImg = vkh_image_create((VkhDevice)surf->dev, VK_FORMAT_B8G8R8A8_UNORM, surf->width, surf->height, - VK_IMAGE_TILING_LINEAR, VKH_MEMORY_USAGE_GPU_TO_CPU, + VkhImage stagImg = vkh_image_create((VkhDevice)&surf->dev->vkDev, VK_FORMAT_B8G8R8A8_UNORM, surf->width, + surf->height, VK_IMAGE_TILING_LINEAR, VKH_MEMORY_USAGE_GPU_TO_CPU, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); VkCommandBuffer cmd = surf->cmd; diff --git a/src/vkvg_surface_internal.c b/src/vkvg_surface_internal.c index f1bf9dd..69428a7 100644 --- a/src/vkvg_surface_internal.c +++ b/src/vkvg_surface_internal.c @@ -53,7 +53,31 @@ void _explicit_ms_resolve(VkvgSurface surf) { UNLOCK_SURFACE(surf) } +void _transition_surf_images(VkvgSurface surf) { + LOCK_SURFACE(surf) + VkvgDevice dev = surf->dev; + + //_surface_wait_cmd (surf); + + vkh_cmd_begin(surf->cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + VkhImage imgMs = surf->imgMS; + if (imgMs != NULL) + vkh_image_set_layout(surf->cmd, imgMs, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); + vkh_image_set_layout(surf->cmd, surf->img, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); + vkh_image_set_layout(surf->cmd, surf->stencil, dev->stencilAspectFlag, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT); + vkh_cmd_end(surf->cmd); + + _surface_submit_cmd(surf); + + UNLOCK_SURFACE(surf) +} void _clear_surface(VkvgSurface surf, VkImageAspectFlags aspect) { LOCK_SURFACE(surf) @@ -102,41 +126,42 @@ void _clear_surface(VkvgSurface surf, VkImageAspectFlags aspect) { } void _create_surface_main_image(VkvgSurface surf) { - surf->img = vkh_image_create((VkhDevice)surf->dev, surf->format, surf->width, surf->height, - surf->dev->supportedTiling, VKH_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); + VkhDevice vkhd = (VkhDevice)&surf->dev->vkDev; + surf->img = vkh_image_create(vkhd, surf->format, surf->width, surf->height, surf->dev->supportedTiling, + VKH_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); #if defined(DEBUG) && defined(VKVG_DBG_UTILS) vkh_image_set_name(surf->img, "SURF main color"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(surf->img), + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(surf->img), "SURF main color VIEW"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(surf->img), + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(surf->img), "SURF main color SAMPLER"); #endif } // create multisample color img if sample count > 1 and the stencil buffer multisampled or not void _create_surface_secondary_images(VkvgSurface surf) { + VkhDevice vkhd = (VkhDevice)&surf->dev->vkDev; if (surf->dev->samples > VK_SAMPLE_COUNT_1_BIT) { - surf->imgMS = vkh_image_ms_create((VkhDevice)surf->dev, surf->format, surf->dev->samples, surf->width, - surf->height, VKH_MEMORY_USAGE_GPU_ONLY, - VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | - VK_IMAGE_USAGE_TRANSFER_SRC_BIT); + surf->imgMS = vkh_image_ms_create( + vkhd, surf->format, surf->dev->samples, surf->width, surf->height, VKH_MEMORY_USAGE_GPU_ONLY, + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT); 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); #if defined(DEBUG) && defined(VKVG_DBG_UTILS) vkh_image_set_name(surf->imgMS, "SURF MS color IMG"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_IMAGE_VIEW, - (uint64_t)vkh_image_get_view(surf->imgMS), "SURF MS color VIEW"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_SAMPLER, - (uint64_t)vkh_image_get_sampler(surf->imgMS), "SURF MS color SAMPLER"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(surf->imgMS), + "SURF MS color VIEW"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(surf->imgMS), + "SURF MS color SAMPLER"); #endif } - surf->stencil = vkh_image_ms_create((VkhDevice)surf->dev, surf->dev->stencilFormat, surf->dev->samples, surf->width, - surf->height, VKH_MEMORY_USAGE_GPU_ONLY, + surf->stencil = vkh_image_ms_create(vkhd, surf->dev->stencilFormat, surf->dev->samples, surf->width, surf->height, + VKH_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->stencil, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_STENCIL_BIT, VK_FILTER_NEAREST, @@ -144,10 +169,10 @@ void _create_surface_secondary_images(VkvgSurface surf) { VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); #if defined(DEBUG) && defined(VKVG_DBG_UTILS) vkh_image_set_name(surf->stencil, "SURF stencil"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_IMAGE_VIEW, - (uint64_t)vkh_image_get_view(surf->stencil), "SURF stencil VIEW"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_SAMPLER, - (uint64_t)vkh_image_get_sampler(surf->stencil), "SURF stencil SAMPLER"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(surf->stencil), + "SURF stencil VIEW"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(surf->stencil), + "SURF stencil SAMPLER"); #endif } void _create_framebuffer(VkvgSurface surf) { @@ -171,7 +196,7 @@ void _create_framebuffer(VkvgSurface surf) { } VK_CHECK_RESULT(vkCreateFramebuffer(surf->dev->vkDev, &frameBufferCreateInfo, NULL, &surf->fb)); #if defined(DEBUG) && defined(VKVG_DBG_UTILS) - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_FRAMEBUFFER, (uint64_t)surf->fb, "SURF FB"); + vkh_device_set_object_name((VkhDevice)&surf->dev->vkDev, VK_OBJECT_TYPE_FRAMEBUFFER, (uint64_t)surf->fb, "SURF FB"); #endif } void _create_surface_images(VkvgSurface surf) { @@ -180,40 +205,48 @@ void _create_surface_images(VkvgSurface surf) { _create_surface_secondary_images(surf); _create_framebuffer(surf); -#if defined(DEBUG) && defined(ENABLE_VALIDATION) +#if defined(DEBUG) && defined(VKVG_DBG_UTILS) vkh_image_set_name(surf->img, "surfImg"); vkh_image_set_name(surf->imgMS, "surfImgMS"); vkh_image_set_name(surf->stencil, "surfStencil"); #endif } VkvgSurface _create_surface(VkvgDevice dev, VkFormat format) { + LOG(VKVG_LOG_INFO, "CREATE Surface\n"); + if (vkvg_device_status(dev)) { + LOG(VKVG_LOG_ERR, "CREATE Surface failed, invalid Device\n"); + return (VkvgSurface)&_vkvg_status_device_error; + } + VkvgSurface surf = (vkvg_surface *)calloc(1, sizeof(vkvg_surface)); - if (!surf) - return (VkvgSurface)&_no_mem_status; + if (!surf) { + LOG(VKVG_LOG_ERR, "CREATE Surface failed, no memory\n"); + return (VkvgSurface)&_vkvg_status_no_memory; + } surf->references = 1; - if (dev->status != VKVG_STATUS_SUCCESS) { - surf->status = VKVG_STATUS_DEVICE_ERROR; - return surf; - } surf->dev = dev; surf->format = format; + if (dev->threadAware) mtx_init(&surf->mutex, mtx_plain); + + VkhDevice vkhd = (VkhDevice)&surf->dev->vkDev; + surf->cmdPool = - vkh_cmd_pool_create((VkhDevice)dev, dev->gQueue->familyIndex, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); - vkh_cmd_buffs_create((VkhDevice)dev, surf->cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1, &surf->cmd); + vkh_cmd_pool_create(vkhd, dev->gQueue->familyIndex, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); + vkh_cmd_buffs_create(vkhd, surf->cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1, &surf->cmd); #if VKVG_ENABLE_VK_TIMELINE_SEMAPHORE - surf->timeline = vkh_timeline_create((VkhDevice)dev, 0); + surf->timeline = vkh_timeline_create(vkhd, 0); #else - surf->flushFence = vkh_fence_create((VkhDevice)dev); + surf->flushFence = vkh_fence_create(vkhd); #endif #if defined(DEBUG) && defined(VKVG_DBG_UTILS) - vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)surf->cmd, "vkvgSurfCmd"); + vkh_device_set_object_name(vkhd, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)surf->cmd, "vkvgSurfCmd"); #endif - + vkvg_device_reference(surf->dev); return surf; } // if fence sync, surf mutex must be locked. @@ -240,7 +273,7 @@ void _surface_submit_cmd(VkvgSurface surf) { vkh_cmd_submit_timelined(dev->gQueue, &surf->cmd, surf->timeline, surf->timelineStep, surf->timelineStep + 1); surf->timelineStep++; UNLOCK_DEVICE - vkh_timeline_wait((VkhDevice)dev, surf->timeline, surf->timelineStep); + vkh_timeline_wait((VkhDevice)&dev->vkDev, surf->timeline, surf->timelineStep); #else LOCK_DEVICE vkh_cmd_submit(surf->dev->gQueue, &surf->cmd, surf->flushFence); diff --git a/src/vkvg_surface_internal.h b/src/vkvg_surface_internal.h index 085ce77..ef9c685 100644 --- a/src/vkvg_surface_internal.h +++ b/src/vkvg_surface_internal.h @@ -51,13 +51,16 @@ typedef struct _vkvg_surface_t { } vkvg_surface; #define LOCK_SURFACE(surf) \ - if (surf->dev->threadAware) \ - mtx_lock(&surf->mutex); + if (surf->dev->threadAware) { \ + mtx_lock(&surf->mutex); \ + } #define UNLOCK_SURFACE(surf) \ - if (surf->dev->threadAware) \ - mtx_unlock(&surf->mutex); + if (surf->dev->threadAware) { \ + mtx_unlock(&surf->mutex); \ + } void _explicit_ms_resolve(VkvgSurface surf); +void _transition_surf_images(VkvgSurface surf); void _clear_surface(VkvgSurface surf, VkImageAspectFlags aspect); void _create_surface_main_image(VkvgSurface surf); void _create_surface_secondary_images(VkvgSurface surf); diff --git a/tests/common/test.c b/tests/common/test.c index 0295993..7526b2a 100644 --- a/tests/common/test.c +++ b/tests/common/test.c @@ -558,12 +558,11 @@ void perform_test_onscreen(void (*testfunc)(void), const char *testName, int arg vkengine_set_cursor_pos_callback(e, mouse_move_callback); vkengine_set_scroll_callback(e, scroll_callback); - vkvg_device_create_info_t info = {samples, false, vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0}; + vkvg_device_create_info_t info = {samples, false, vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, + 0, threadAware}; device = vkvg_device_create(&info); vkvg_device_set_dpy(device, 96, 96); - if (threadAware) - vkvg_device_set_thread_aware(device, 1); #ifdef VKVG_TEST_DIRECT_DRAW surfaces = (VkvgSurface *)malloc(r->imgCount * sizeof(VkvgSurface)); diff --git a/tests/data/blender_icons16.png b/tests/data/blender_icons16.png new file mode 100644 index 0000000000000000000000000000000000000000..2f2f8deed6825e417ece27bb022c445743a5a916 GIT binary patch literal 240844 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

)y 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 E52^8}$p8QV literal 0 HcmV?d00001 diff --git a/tests/multithreading/multithreaded.c b/tests/multithreading/multithreaded.c index 280261d..728fe15 100644 --- a/tests/multithreading/multithreaded.c +++ b/tests/multithreading/multithreaded.c @@ -48,8 +48,6 @@ void fixedSizeRects() { mtx_t mutex; pmutex = &mutex; - vkvg_device_set_thread_aware(device, 1); - thrd_t threads[THREAD_COUNT]; finishedThreadCount = 0; @@ -65,8 +63,6 @@ void fixedSizeRects() { mtx_unlock(pmutex); mtx_destroy(pmutex); pmutex = NULL; - - vkvg_device_set_thread_aware(device, 0); } int main(int argc, char *argv[]) { diff --git a/tests/multithreading/multithreaded2.c b/tests/multithreading/multithreaded2.c index 7eff7a0..61a87be 100644 --- a/tests/multithreading/multithreaded2.c +++ b/tests/multithreading/multithreaded2.c @@ -35,8 +35,6 @@ void fixedSizeRects() { mtx_t mutex; pmutex = &mutex; - vkvg_device_set_thread_aware(device, 1); - thrd_t threads[THREAD_COUNT]; finishedThreadCount = 0; @@ -52,8 +50,6 @@ void fixedSizeRects() { mtx_unlock(pmutex); mtx_destroy(pmutex); pmutex = NULL; - - vkvg_device_set_thread_aware(device, 0); } int main(int argc, char *argv[]) { diff --git a/tests/multithreading/threaded_create_surf.c b/tests/multithreading/threaded_create_surf.c index f7e8d80..c8a587e 100644 --- a/tests/multithreading/threaded_create_surf.c +++ b/tests/multithreading/threaded_create_surf.c @@ -22,8 +22,6 @@ void fixedSizeRects() { mtx_t mutex; pmutex = &mutex; - vkvg_device_set_thread_aware(device, 1); - thrd_t threads[THREAD_COUNT]; finishedThreadCount = 0; @@ -39,8 +37,6 @@ void fixedSizeRects() { mtx_unlock(pmutex); mtx_destroy(pmutex); pmutex = NULL; - - vkvg_device_set_thread_aware(device, 0); } int main(int argc, char *argv[]) { diff --git a/tests/multithreading/threaded_text.c b/tests/multithreading/threaded_text.c index 8ae18a9..bba0280 100644 --- a/tests/multithreading/threaded_text.c +++ b/tests/multithreading/threaded_text.c @@ -53,8 +53,6 @@ void threaded_text(int (*testfunc)(void *)) { mtx_t mutex; pmutex = &mutex; - vkvg_device_set_thread_aware(device, 1); - thrd_t threads[THREAD_COUNT]; finishedThreadCount = 0; @@ -70,8 +68,6 @@ void threaded_text(int (*testfunc)(void *)) { mtx_unlock(pmutex); mtx_destroy(pmutex); pmutex = NULL; - - vkvg_device_set_thread_aware(device, 0); } void single_font_and_size() { threaded_text(_single_font_and_size); } diff --git a/tests/pattern_transforms.c b/tests/pattern_transforms.c index 58651c9..dc2f1e0 100644 --- a/tests/pattern_transforms.c +++ b/tests/pattern_transforms.c @@ -1,6 +1,7 @@ #include "test.h" float lineWidth = 10.f; +static float angle = 0; const char *imgPath = "data/miroir.jpg"; VkvgPattern create_grad(VkvgContext ctx) { @@ -47,6 +48,41 @@ void img_scale() { vkvg_surface_destroy(imgSurf); } +void icon_sheet() { + VkvgSurface imgSurf = vkvg_surface_create_from_image(device, "data/blender_icons16.png"); + VkvgPattern pat = vkvg_pattern_create_for_surface(imgSurf); + VkvgContext ctx = _initCtx(surf); + + vkvg_translate(ctx, 100, 100); + + vkvg_matrix_t mat; + // vkvg_matrix_init_rotate(&mat, 1.2f); + // vkvg_matrix_init_translate(&mat, 23.f, 0.f); + + float scale = 0.5f; + + // vkvg_matrix_init_scale(&mat, scale, scale); + // vkvg_matrix_rotate(&mat, -0.3f); + vkvg_matrix_init_translate(&mat, 22.0f, 27.0f); + vkvg_matrix_scale(&mat, scale, scale); + vkvg_matrix_rotate(&mat, 0.2f); + + // vkvg_matrix_init_rotate(&mat, 0.14f); + vkvg_pattern_set_matrix(pat, &mat); + + // vkvg_scale(ctx, 4.f, 4.f); + // vkvg_rotate(ctx, 0.5f); + vkvg_set_source(ctx, pat); + + vkvg_rectangle(ctx, 0, 0, 24.f / scale, 24.f / scale); + // vkvg_rectangle(ctx, 0, 0, 602.f, 640.f); + // vkvg_rectangle(ctx, 0, 0, 24.f, 24.f); + vkvg_fill(ctx); + vkvg_destroy(ctx); + vkvg_pattern_destroy(pat); + vkvg_surface_destroy(imgSurf); +} + void pat_scale() { VkvgContext ctx = _initCtx(surf); @@ -64,8 +100,8 @@ void pat_scale() { vkvg_destroy(ctx); vkvg_pattern_destroy(pat); } -static float angle = 0; -void pat_rotate() { + +void pat_rotate() { angle += 0.001f; VkvgContext ctx = _initCtx(surf); @@ -89,5 +125,6 @@ int main(int argc, char *argv[]) { PERFORM_TEST(pat_scale, argc, argv); PERFORM_TEST(pat_rotate, argc, argv); PERFORM_TEST(img_scale, argc, argv); + PERFORM_TEST(icon_sheet, argc, argv); return 0; } -- 2.47.3