summaryrefslogtreecommitdiff
path: root/include/util/cru_cleanup.h
blob: 6eca30416abbdcf400af4855d8ad82535c90216f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Copyright 2015 Intel Corporation
//
// 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 the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice (including the next
// paragraph) shall be included in all copies or substantial portions of the
// Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.

#pragma once

#include <stdarg.h>

#include "util/macros.h"
#include "util/vk_wrapper.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct cru_cleanup_stack cru_cleanup_stack_t;
typedef struct cru_image cru_image_t;

typedef void (*cru_cleanup_callback_func_t)(void *data);

enum cru_cleanup_cmd {
    CRU_CLEANUP_CMD_CALLBACK,
    CRU_CLEANUP_CMD_FREE,
    CRU_CLEANUP_CMD_CRU_CLEANUP_STACK,
    CRU_CLEANUP_CMD_CRU_IMAGE,
    CRU_CLEANUP_CMD_VK_BUFFER,
    CRU_CLEANUP_CMD_VK_BUFFER_VIEW,
    CRU_CLEANUP_CMD_VK_COMMAND_BUFFER,
    CRU_CLEANUP_CMD_VK_COMMAND_POOL,
    CRU_CLEANUP_CMD_VK_DEBUG_CB,
    CRU_CLEANUP_CMD_VK_DESCRIPTOR_POOL,
    CRU_CLEANUP_CMD_VK_DESCRIPTOR_SET,
    CRU_CLEANUP_CMD_VK_DESCRIPTOR_SET_LAYOUT,
    CRU_CLEANUP_CMD_VK_DEVICE,
    CRU_CLEANUP_CMD_VK_DEVICE_MEMORY,
    CRU_CLEANUP_CMD_VK_DEVICE_MEMORY_MAP,
    CRU_CLEANUP_CMD_VK_EVENT,
    CRU_CLEANUP_CMD_VK_FENCE,
    CRU_CLEANUP_CMD_VK_FRAMEBUFFER,
    CRU_CLEANUP_CMD_VK_IMAGE,
    CRU_CLEANUP_CMD_VK_IMAGE_VIEW,
    CRU_CLEANUP_CMD_VK_INSTANCE,
    CRU_CLEANUP_CMD_VK_PIPELINE,
    CRU_CLEANUP_CMD_VK_PIPELINE_CACHE,
    CRU_CLEANUP_CMD_VK_PIPELINE_LAYOUT,
    CRU_CLEANUP_CMD_VK_QUERY_POOL,
    CRU_CLEANUP_CMD_VK_RENDER_PASS,
    CRU_CLEANUP_CMD_VK_SAMPLER,
    CRU_CLEANUP_CMD_VK_SEMAPHORE,
    CRU_CLEANUP_CMD_VK_SHADER_MODULE,
};

malloclike cru_cleanup_stack_t* cru_cleanup_create(void);
void cru_cleanup_reference(cru_cleanup_stack_t *c);
void cru_cleanup_release(cru_cleanup_stack_t *c);
void cru_cleanup_push_command(cru_cleanup_stack_t *c, enum cru_cleanup_cmd cmd, ...);
void cru_cleanup_push_commandv(cru_cleanup_stack_t *c, enum cru_cleanup_cmd cmd, va_list va);
void cru_cleanup_pop(cru_cleanup_stack_t *c);
void cru_cleanup_pop_all(cru_cleanup_stack_t *c);
void cru_cleanup_pop_noop(cru_cleanup_stack_t *c);
void cru_cleanup_pop_all_noop(cru_cleanup_stack_t *c);

#ifdef DOXYGEN
void cru_cleanup_push(cru_cleanup_stack_t *t, T obj, ...);
#else
#define cru_cleanup_push(c, x, ...) \
    _Generic((x), \
        cru_cleanup_callback_func_t     : __cru_cleanup_push_callback, \
        cru_cleanup_stack_t *           : __cru_cleanup_push_cru_cleanup_stack, \
        cru_image_t *                   : __cru_cleanup_push_cru_image, \
    )((c), (x), ##__VA_ARGS__)
#endif

static inline void cru_cleanup_push_callback(cru_cleanup_stack_t *c, cru_cleanup_callback_func_t func, void *data)                          { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_CALLBACK,                         func, data); }
static inline void cru_cleanup_push_free(cru_cleanup_stack_t *c, void *data)                                                                { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_FREE,                             data); }
static inline void cru_cleanup_push_cru_cleanup_stack(cru_cleanup_stack_t *c, cru_cleanup_stack_t *x)                                       { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_CRU_CLEANUP_STACK,                x); }
static inline void cru_cleanup_push_cru_image(cru_cleanup_stack_t *c, cru_image_t *x)                                                       { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_CRU_IMAGE,                        x); }

static inline void cru_cleanup_push_vk_instance(cru_cleanup_stack_t *c, VkInstance x, const VkAllocationCallbacks *a)                       { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_INSTANCE,                      x, a); }
static inline void cru_cleanup_push_vk_device(cru_cleanup_stack_t *c, VkDevice x, const VkAllocationCallbacks *a)                           { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_DEVICE,                        x, a); }

static inline void cru_cleanup_push_vk_buffer(cru_cleanup_stack_t *c, VkDevice dev, VkBuffer x)                                             { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_BUFFER,                        dev, x); }
static inline void cru_cleanup_push_vk_buffer_view(cru_cleanup_stack_t *c, VkDevice dev, VkBufferView x)                                    { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_BUFFER_VIEW,                   dev, x); }
static inline void cru_cleanup_push_vk_command_buffer(cru_cleanup_stack_t *c, VkDevice dev, VkCommandPool pool, VkCommandBuffer x)          { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_COMMAND_BUFFER,                    dev, pool, x); }
static inline void cru_cleanup_push_vk_descriptor_pool(cru_cleanup_stack_t *c, VkDevice dev, VkDescriptorPool x)                            { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_DESCRIPTOR_POOL,               dev, x); }
static inline void cru_cleanup_push_vk_descriptor_set(cru_cleanup_stack_t *c, VkDevice dev, VkDescriptorPool pool, VkDescriptorSet set)     { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_DESCRIPTOR_SET,                dev, pool, set); }
static inline void cru_cleanup_push_vk_descriptor_set_layout(cru_cleanup_stack_t *c, VkDevice dev, VkDescriptorSetLayout x)                 { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_DESCRIPTOR_SET_LAYOUT,         dev, x); }
static inline void cru_cleanup_push_vk_event(cru_cleanup_stack_t *c, VkDevice dev, VkEvent x)                                               { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_EVENT,                         dev, x); }
static inline void cru_cleanup_push_vk_fence(cru_cleanup_stack_t *c, VkDevice dev, VkFence x)                                               { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_FENCE,                         dev, x); }
static inline void cru_cleanup_push_vk_framebuffer(cru_cleanup_stack_t *c, VkDevice dev, VkFramebuffer x)                                   { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_FRAMEBUFFER,                   dev, x); }
static inline void cru_cleanup_push_vk_image(cru_cleanup_stack_t *c, VkDevice dev, VkImage x)                                               { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_IMAGE,                         dev, x); }
static inline void cru_cleanup_push_vk_image_view(cru_cleanup_stack_t *c, VkDevice dev, VkImageView x)                                      { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_IMAGE_VIEW,                    dev, x); }
static inline void cru_cleanup_push_vk_pipeline(cru_cleanup_stack_t *c, VkDevice dev, VkPipeline x)                                         { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_PIPELINE,                      dev, x); }
static inline void cru_cleanup_push_vk_pipeline_layout(cru_cleanup_stack_t *c, VkDevice dev, VkPipelineLayout x)                            { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_PIPELINE_LAYOUT,               dev, x); }
static inline void cru_cleanup_push_vk_query_pool(cru_cleanup_stack_t *c, VkDevice dev, VkQueryPool x)                                      { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_QUERY_POOL,                    dev, x); }
static inline void cru_cleanup_push_vk_render_pass(cru_cleanup_stack_t *c, VkDevice dev, VkRenderPass x)                                    { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_RENDER_PASS,                   dev, x); }
static inline void cru_cleanup_push_vk_sampler(cru_cleanup_stack_t *c, VkDevice dev, VkSampler x)                                           { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_SAMPLER,                       dev, x); }
static inline void cru_cleanup_push_vk_semaphore(cru_cleanup_stack_t *c, VkDevice dev, VkSemaphore x)                                       { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_SEMAPHORE,                     dev, x); }
static inline void cru_cleanup_push_vk_shader_module(cru_cleanup_stack_t *c, VkDevice dev, VkShaderModule x)                                { cru_cleanup_push_command(c, CRU_CLEANUP_CMD_VK_SHADER_MODULE,                 dev, x); }

#ifdef __cplusplus
}
#endif