]> O.S.I.I.S - jp/vkvg.git/commitdiff
vkvg_surface_write_to_memory, #vkvg_export and #vkvg_inline modifs
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Mon, 9 Aug 2021 08:54:11 +0000 (10:54 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Mon, 9 Aug 2021 08:54:11 +0000 (10:54 +0200)
include/vkvg.h
src/cross_mutex.c
src/cross_mutex.h
src/cross_os.c
src/cross_os.h
src/vkvg_buff.c
src/vkvg_internal.h
src/vkvg_pattern.c
src/vkvg_surface.c

index 217bf1af155afe91cd649628c5b01c3cb2eb8585..a97f2d17f8a9cbeecddcaf5196cf3ad344cfcdf0 100644 (file)
@@ -67,13 +67,14 @@ extern "C" {
 #include <stdbool.h>
 
 #ifndef vkvg_public
-# if defined (_MSC_VER) && !defined (VKVG_STATIC_BUILD)
-#  define vkvg_public __declspec(dllimport)
-else
-#  define vkvg_public
-endif
+       #if (defined(_WIN32) || defined(_WIN64)) && !defined (VKVG_STATIC_BUILD)
+               #define vkvg_public __declspec(dllimport)
+       #else
+               #define vkvg_public __attribute__((visibility("default")))
+       #endif
 #endif
 
+
 #define VKVG_LOG_ERR           0x10
 #define VKVG_LOG_DEBUG         0x20
 #define VKVG_LOG_INFO          0x40
@@ -678,6 +679,13 @@ uint32_t vkvg_surface_get_height (VkvgSurface surf);
  */
 vkvg_public
 void vkvg_surface_write_to_png (VkvgSurface surf, const char* path);
+/**
+ * @brief Save surface to memory
+ * @param The surface to save
+ * @param A valid pointer on cpu memory large enough to contain surface pixels (stride * height)
+ */
+vkvg_public
+void vkvg_surface_write_to_memory (VkvgSurface surf, unsigned char* const bitmap);
 /**
  * @brief Explicitly resolve a multisampled surface.
  *
index 7a33c87a460ebab22da1a6a07edb8403f4e092bd..2066f286e83ede5a147c38266762cd6dc7892e6d 100644 (file)
 int MUTEX_INIT(MUTEX *mutex)
 {
 #ifdef _WIN32
-    *mutex = CreateMutex(0, FALSE, 0);;
-    return (*mutex==0);
+       *mutex = CreateMutex(0, FALSE, 0);;
+       return (*mutex==0);
 #elif __APPLE__
 #elif __unix__
-    return pthread_mutex_init (mutex, NULL);
+       return pthread_mutex_init (mutex, NULL);
 #else
-    return -1;
+       return -1;
 #endif
 }
 
 int MUTEX_LOCK(MUTEX *mutex)
 {
 #ifdef _WIN32
-    return (WaitForSingleObject(*mutex, INFINITE)==WAIT_FAILED?1:0);
+       return (WaitForSingleObject(*mutex, INFINITE)==WAIT_FAILED?1:0);
 #elif __APPLE__
 #elif __unix__
-    return pthread_mutex_lock( mutex );
+       return pthread_mutex_lock( mutex );
 #else
-    return -1;
+       return -1;
 #endif
 }
 
 int MUTEX_UNLOCK(MUTEX *mutex)
 {
 #ifdef _WIN32
-    return (ReleaseMutex(*mutex)==0);
+       return (ReleaseMutex(*mutex)==0);
 #elif __APPLE__
 #elif __unix__
-    return pthread_mutex_unlock( mutex );
+       return pthread_mutex_unlock( mutex );
 #else
-    return -1;
+       return -1;
 #endif
 }
 
 int MUTEX_DESTROY(MUTEX *mutex)
 {
 #ifdef _WIN32
-    return (CloseHandle(*mutex)==0);
+       return (CloseHandle(*mutex)==0);
 #elif __APPLE__
 #elif __unix__
-    return pthread_mutex_destroy(mutex);
+       return pthread_mutex_destroy(mutex);
 #else
-    return -1;
+       return -1;
 #endif
 }
+
index 11635a7f861706ea2fd627773de1bf84ca21df3d..dd86634f95c165e9aeec9249affee2b8c045b2a3 100644 (file)
 
 //cross platform mutex
 #ifdef _WIN32
-#include "windows.h"
-#include "process.h"
-#define MUTEX HANDLE
+       #include "windows.h"
+       #include "process.h"
+       #define MUTEX HANDLE
 #elif __APPLE__
-#include "pthread.h"
-#define MUTEX pthread_mutex_t
+       #include "pthread.h"
+       #define MUTEX pthread_mutex_t
 #elif __unix__
-#include "pthread.h"
-#define MUTEX pthread_mutex_t
+       #include "pthread.h"
+       #define MUTEX pthread_mutex_t
 #endif
 
 int MUTEX_INIT(MUTEX *mutex);
index 1db376ca4155afcc0df1912b87690efd7d72f305..7385eee8ca2002ef4166c95199f4d3ef75b709b8 100644 (file)
 
 int directoryExists (const char* path) {
 #if defined(_WIN32) || defined(_WIN64)
-    return getenv("HOME") != NULL;
 #elif __APPLE__
 #elif __unix__
-    struct stat st = {0};
-    return stat(path, &st)+1;
+       struct stat st = {0};
+       return stat(path, &st)+1;
 #else
-    return -1;
+       return -1;
 #endif
 }
 const char* getUserDir () {
 #if defined(_WIN32) || defined(_WIN64)
-    return getenv("HOME");
+       return getenv("HOME");
 #elif __APPLE__
 #elif __unix__
-    struct passwd *pw = getpwuid(getuid());
-    return pw->pw_dir;
+       struct passwd *pw = getpwuid(getuid());
+       return pw->pw_dir;
 #endif
 }
index 916aa125d0755d8c05acb1485e733e0e6a4306c2..864d8f9cb7154925ff41ed2557e911cde04ce519 100644 (file)
        #define _CRT_SECURE_NO_WARNINGS
        #include "windows.h"
        #define isnanf _isnanf
+       #define vkvg_inline __forceinline
 #elif __APPLE__
        #include <math.h>
        #define isnanf isnan
+       #define vkvg_inline
 #elif __unix__
        #include <unistd.h>
        #include <sys/types.h>
@@ -38,6 +40,7 @@
        #ifndef isnanf
                #define isnanf __isnanf
        #endif
+       #define vkvg_inline static inline __attribute((always_inline))
 #endif
 
 const char* getUserDir ();
index 7e516965b1ecc77221bf36607cbae6363e579737..54b02e06faeed9e7a0a7aa2d7ce1466a95a27b1d 100644 (file)
 #include "vkvg_device_internal.h"
 
 void vkvg_buffer_create(VkvgDevice pDev, VkBufferUsageFlags usage, VmaMemoryUsage memoryPropertyFlags, VkDeviceSize size, vkvg_buff *buff){
-    buff->pDev = pDev;
-    VkBufferCreateInfo bufCreateInfo = {
-        .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
-        .usage = usage, .size = size, .sharingMode = VK_SHARING_MODE_EXCLUSIVE};
-    VmaAllocationCreateInfo allocInfo = { .usage = memoryPropertyFlags, .flags = VMA_ALLOCATION_CREATE_MAPPED_BIT };
+       buff->pDev = pDev;
+       VkBufferCreateInfo bufCreateInfo = {
+               .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
+               .usage = usage, .size = size, .sharingMode = VK_SHARING_MODE_EXCLUSIVE};
+       VmaAllocationCreateInfo allocInfo = { .usage = memoryPropertyFlags, .flags = VMA_ALLOCATION_CREATE_MAPPED_BIT };
 
-    VK_CHECK_RESULT(vmaCreateBuffer (pDev->allocator, &bufCreateInfo, &allocInfo, &buff->buffer, &buff->alloc, &buff->allocInfo));
+       VK_CHECK_RESULT(vmaCreateBuffer (pDev->allocator, &bufCreateInfo, &allocInfo, &buff->buffer, &buff->alloc, &buff->allocInfo));
 }
 
 void vkvg_buffer_destroy(vkvg_buff *buff){
-    vmaDestroyBuffer (buff->pDev->allocator, buff->buffer, buff->alloc);
+       vmaDestroyBuffer (buff->pDev->allocator, buff->buffer, buff->alloc);
 }
 
index a7402bdce3abafc9666f7200217d46d2c3ccabd7..f49e38941d10cb53d4ca761a003b9bd952de5f67 100644 (file)
@@ -58,6 +58,7 @@
 #define ROUND_DOWN(v,p) (floorf(v * p) / p)
 #define EQUF(a, b) (fabsf(a-b)<=FLT_EPSILON)
 
+
 #include "cross_os.h"
 #include "vectors.h"
 #include "cross_mutex.h"
index 92634e4b6d077ad05c210dbfdf25357a6cb6a5c9..76dc30e91b76df874f1935db9fa416c4e0dae489 100644 (file)
@@ -79,10 +79,8 @@ uint32_t vkvg_pattern_get_reference_count (VkvgPattern pat) {
        return pat->references;
 }
 void vkvg_pattern_add_color_stop (VkvgPattern pat, float offset, float r, float g, float b, float a) {
-       if (pat->type == VKVG_PATTERN_TYPE_SURFACE || pat->type == VKVG_PATTERN_TYPE_SOLID){
-
+       if (pat->type == VKVG_PATTERN_TYPE_SURFACE || pat->type == VKVG_PATTERN_TYPE_SOLID)
                return;
-       }
 
        vkvg_gradient_t* grad = (vkvg_gradient_t*)pat->data;
        vkvg_color_t c = {r,g,b,a};
index 19bbaa4ad663e6ea8d84e5f874c87db3239cf447..802f75e981094adb6f9895b8247cb89d89fe840a 100644 (file)
@@ -278,3 +278,44 @@ void vkvg_surface_write_to_png (VkvgSurface surf, const char* path){
        vkh_image_unmap (stagImg);
        vkh_image_destroy (stagImg);
 }
+
+void vkvg_surface_write_to_memory (VkvgSurface surf, unsigned char* const bitmap){
+       uint32_t stride = surf->width * 4;
+       VkImageSubresourceLayers imgSubResLayers = {VK_IMAGE_ASPECT_COLOR_BIT,0,0,1};
+       VkvgDevice dev = surf->dev;
+
+       //RGBA to blit to, surf img is bgra
+       VkhImage stagImg= vkh_image_create ((VkhDevice)surf->dev,VK_FORMAT_R8G8B8A8_UNORM,surf->width,surf->height,VK_IMAGE_TILING_LINEAR,
+                                                                                VMA_MEMORY_USAGE_GPU_TO_CPU,
+                                                                                VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+
+       VkCommandBuffer cmd = dev->cmd;
+       _wait_and_reset_device_fence (dev);
+
+       vkh_cmd_begin (cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
+       vkh_image_set_layout (cmd, stagImg, VK_IMAGE_ASPECT_COLOR_BIT,
+                                                 VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+                                                 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
+       vkh_image_set_layout (cmd, surf->img, VK_IMAGE_ASPECT_COLOR_BIT,
+                                                 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+                                                 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
+
+       VkImageBlit blit = {
+               .srcSubresource = imgSubResLayers,
+               .srcOffsets[1] = {(int32_t)surf->width, (int32_t)surf->height, 1},
+               .dstSubresource = imgSubResLayers,
+               .dstOffsets[1] = {(int32_t)surf->width, (int32_t)surf->height, 1},
+       };
+       vkCmdBlitImage  (cmd,
+                                        vkh_image_get_vkimage (surf->img), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+                                        vkh_image_get_vkimage (stagImg),  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit, VK_FILTER_NEAREST);
+
+       vkh_cmd_end     (cmd);
+       _submit_cmd     (dev, &cmd, dev->fence);
+       vkWaitForFences (dev->vkDev, 1, &dev->fence, VK_TRUE, UINT64_MAX);
+
+       void* img = vkh_image_map (stagImg);
+       memcpy(bitmap, img, surf->height * stride);
+       vkh_image_unmap (stagImg);
+       vkh_image_destroy (stagImg);
+}