Jackalope / jen (public) (License: GPLv3 or later version) (since 2018-10-24) (hash sha1)
----> ABOUT:

3D rendering and computing framework based on Vulkan API.

Libraries:
- simdcpp submodule (see my simdcpp repo)
- jmath submodule (see my jmath repo)
- mesh (constexpr generation of cubes, spheres, icosahedrons subdivisions)
- atlas (1D lines and 2D rectangles cutting)
- jlib submodule (see my jlib repo)
- jrf submodule (see my jrf repo)
- vkw (Vulkan API C++ wrapper)
Modules:
- compute (run compute shaders on gpu)
- graphics (draw models with clustered forward rendering and onscreen text)
- resource manager (load meshes, models, textures, scene data from
files and create related objects in graphics module)

----> INSTALLING:

To download all the parts of this framework it's enough to launch
git clone with recursive flag:

$ git clone —recursive ssh://rocketgit@ssh.rocketgit.com/user/Jackalope/jen

After this look at git tags:

$ git tag

It is recommended to use a tagged version instead of the latest commit,
because the first commit after the tagged one mostly includes incompatible
parts of future changes for the next version.

$ git checkout v0.1.0

----> DEPENDENCIES:

To use JEN as CMake subdirectory and successfully build programs with it
you need to make sure you have all of its dependencies:
- compiler: Clang or GCC, support for C++17. Clang 10+ or GCC 9+ is recommended,
compiling on Windows OS is tricky and requires something like MinGW with MSYS,
there are also some complications to go through to make dependencies work;
- GLFW3 library, supported version is 3.2.1;
- FreeType library, if graphics module will be used;
- Vulkan API headers, and optional validation layers to debug sneaky problems,
you also need Vulkan support in your graphics driver to run compiled programs;
- LibZip can be necessary, if JRF is used to read zip files;
- CMake, for obvious reasons;
- glslangValidator to compile shader for the graphics module.

CMake must be able to find GLFW3, Vulkan and FreeType (for graphics)
with find_package().

----> HOW TO USE IT:

To use JEN, you need to add it as a subdirectory:

add_subdirecroty(${PATH_TO_JEN})

There are several configuration options:
- JEN_MODULE_COMPUTE - turn compute module on for compiling and including;
- JEN_MODULE_GRAPHICS - turn graphics module on ...;
- JEN_MULTITHREADED_DRAW_FRAME - draw_frame function will use thread pool queue
instead of linear executing;
- JEN_MODULE_RESOURCE_MANAGER - resource manager module ON, if graphics is ON;
- JEN_VLK_VALIDATION - enable Vulkan Validation Layers to debug some errors
related to JEN. This will often produce false-positive,
as well as true-positive errors.

Look in CMakeLists.txt at JenExamples repo for details on how to use and
configure JEN automatically:

$ git clone ssh://rocketgit@ssh.rocketgit.com/user/Jackalope/JenExamples

Also I recommend to compile and run examples to make sure it works correctly.

----> SUPPORTED HARDWARE:

JEN has not been tested well, because it requires running it on large amount of
different hardware to do so. It must work with mesa driver and modern
Intel i965 GPUs as well as AMD GPUs.


----> DOCUMENTATION:

You can generate Doxygen documentation, to do so
turn on any of JEN_DOXYGEN_* options and run documentation target in cmake:

$ cmake -G %1 -DJEN_DOXYGEN_HTML=ON -DJEN_DOXYGEN_LATEX=ON
$ cmake —build —target documentation

Resource manager is not documented because it still requires large enhancements.
List of commits:
Subject Hash Author Date (UTC)
renamed compute::BindingsSet to BindingSet, vkw::BindNo to vkw::Binding, compute::BindingCreateInfo.bindingNo to binding 072430e257166208d6f4a7b759169779f21bf4c8 Jackalope 2020-05-18 17:51:25
better documentation 5233938573e5c557667de4f467209099a3d48faa Jackalope 2020-05-18 17:38:59
README improvements 3efd2a514affc8c6d706799fd56857c1a7c0d0f6 Jackalope 2020-05-18 17:35:48
better hash for white noise 55b1d39969b9a27a602c464ca216a89ec92cee0b Jackalope 2020-05-17 11:20:30
another reference to temporary removed 84231ce8c36619f9c696cb7da2879f504fa2e66c Jackalope 2020-05-17 10:46:26
removed git_sh directory 4fab20bc30f66ff96fdc9a336708cc5049c13ecb Jackalope 2020-05-17 04:13:34
README 9f70b0aba59a4eed15c5dc86423b0f7976734ce2 Jackalope 2020-05-17 04:09:18
removed C99 extension used in the nested structures initialization b5f33b0c562fd8cc872217eefde5fd6f58318ea3 Jackalope 2020-05-17 03:53:57
Make JEN modules as separate CMake targets e51ffd5b6cb8b1ba15e1f5df683feec8e0665240 Jackalope 2020-05-17 03:52:55
Automated shaders compilation with cmake, no more binaries in git efa9657336852c3543221bc56f4121f698f26044 Jackalope 2020-05-16 13:07:12
Compute process bug fix: correctly fences reset and removed reference to temporary c30b7bf737890cc3a23022c5c5470225bb324443 Jackalope 2020-05-16 07:00:15
pass shader specialization by constant refference 9e14c11e60d709d374f71aec393d28377b1525d2 Jackalope 2020-05-15 12:45:06
Added second template argument for white noise to support custom hash function. 9a714ad51903e35d158ff285fc6e1f517e7100c0 TheArtOfGriefing 2020-05-15 12:22:08
Added shadow map commads fence 447a75b3124eae48d64bf3646df90a7db1adcc57 Jackalope 2020-05-13 09:38:49
Fixed bug with timeline semaphores 08be9cf8af7d32c460fc77ca7c5b0a25976a6d79 Jackalope 2020-05-13 08:21:33
added pipeline cache, refactoring of pipeline stages af2d7d18e63fdeaaec3ca7d92a8f02b107358f27 Jackalope 2020-05-13 08:35:26
window unititialized values fix d9f6249e63550b07d932887c37a233182e7740af Jackalope 2020-05-13 04:21:26
added project information to cmake 2db949aaf90729d4226511773815eb19a314dc35 Jackalope 2020-05-12 18:42:50
Improved cmake scripts c38f2da172d553d519f0cee5d9b6b3f904234806 Jackalope 2020-05-12 07:02:26
license added c72e7e36f528ca69e96e970acf1e732734621f63 Jackalope 2020-05-12 05:25:34
Commit 072430e257166208d6f4a7b759169779f21bf4c8 - renamed compute::BindingsSet to BindingSet, vkw::BindNo to vkw::Binding, compute::BindingCreateInfo.bindingNo to binding
Author: Jackalope
Author date (UTC): 2020-05-18 17:51
Committer name: Jackalope
Committer date (UTC): 2020-05-18 18:01
Parent(s): 5233938573e5c557667de4f467209099a3d48faa
Signing key:
Tree: 2e06d4f6a295c41820287bbb540b6bb7b5a8dc41
File Lines added Lines deleted
include/jen/compute.h 12 12
libs/vkw/include/vkw/descriptor_set.h 4 4
libs/vkw/include/vkw/descriptor_set_layout.h 1 1
libs/vkw/include/vkw/typedefs.h 1 1
src/compute/cmd_unit.cpp 1 1
src/compute/compute.cpp 6 6
src/graphics/draw_stages/clusters.cpp 3 3
src/graphics/draw_stages/clusters.h 3 3
src/graphics/draw_stages/offscreen/offscreen.cpp 1 1
src/graphics/draw_stages/pass_depthcube.cpp 4 5
src/misc/descriptors.cpp 3 3
File include/jen/compute.h changed (mode: 100644) (index 09081dc..14199e1)
... ... namespace jen::compute {
48 48 using BindingUseMask = uint32_t; using BindingUseMask = uint32_t;
49 49 /// @brief User-provided information about binding /// @brief User-provided information about binding
50 50 struct BindingCreateInfo { struct BindingCreateInfo {
51 vkw::DeviceSize size; ///< Size in bytes for buffer allocation
52 BindingUseMask use; ///< Usage of binding buffer
53 vkw::BindNo bindingNo; ///< Number of binding to use in shader
51 vkw::DeviceSize size; ///< Size in bytes for buffer allocation
52 BindingUseMask use; ///< Usage of binding buffer
53 vkw::Binding binding; ///< Number of binding to use in shader
54 54 }; };
55 55 /// @brief Constant jl::rarray, array of BindingCreateInfo data types. /// @brief Constant jl::rarray, array of BindingCreateInfo data types.
56 56 using BindingCreateInfos = jl::rarray<const BindingCreateInfo>; using BindingCreateInfos = jl::rarray<const BindingCreateInfo>;
 
... ... namespace jen::compute {
66 66 /// Buffer part allocation /// Buffer part allocation
67 67 DeviceBufferPart part; DeviceBufferPart part;
68 68 /// Binding number for shader /// Binding number for shader
69 vkw::BindNo binding;
69 vkw::Binding binding;
70 70 /// Is staging required for transferring data /// Is staging required for transferring data
71 71 bool use_staging; bool use_staging;
72 72 /// Staging buffer part allocation, if staging is required /// Staging buffer part allocation, if staging is required
 
... ... namespace jen::compute {
139 139 /// @brief User-provided information about image binding /// @brief User-provided information about image binding
140 140 struct BindingImage { struct BindingImage {
141 141 /// Image to use in binding /// Image to use in binding
142 Image *p_image;
142 Image *p_image;
143 143 /// Binding number /// Binding number
144 vkw::BindNo binding;
144 vkw::Binding binding;
145 145 }; };
146 146 /// @brief Bindings list for a single binding set. /// @brief Bindings list for a single binding set.
147 147 /// Every binding in this list must have unique binding number. /// Every binding in this list must have unique binding number.
 
... ... namespace jen::compute {
165 165 /// Data are valid only after filling with /// Data are valid only after filling with
166 166 /// ModuleCompute::create_bindingSet and becomes invalid after /// ModuleCompute::create_bindingSet and becomes invalid after
167 167 /// ModuleCompute::destroy_bindingSet. /// ModuleCompute::destroy_bindingSet.
168 struct BindingsSet {
168 struct BindingSet {
169 169 /// Vulkan descriptor set handle. @see VkDescriptorSet /// Vulkan descriptor set handle. @see VkDescriptorSet
170 170 vkw::DescrSet set; vkw::DescrSet set;
171 171 /// Vulkan descriptor pool handle. @see VkDescriptorPool /// Vulkan descriptor pool handle. @see VkDescriptorPool
 
... ... namespace jen
315 315 /// @return If not VK_SUCCESS then function has no effect /// @return If not VK_SUCCESS then function has no effect
316 316 /// and binding set is not created /// and binding set is not created
317 317 [[nodiscard]] Result [[nodiscard]] Result
318 create_bindingSet(const compute::Pipeline &pipeline,
319 const compute::Bindings &bindings,
320 compute::BindingsSet *p_dst);
318 create_bindingSet(const compute::Pipeline &pipeline,
319 const compute::Bindings &bindings,
320 compute::BindingSet *p_dst);
321 321 /// @brief Destroy binding set. /// @brief Destroy binding set.
322 322 /// Must be called only once for a created set. /// Must be called only once for a created set.
323 323 /// Set cannot be used after destroying. /// Set cannot be used after destroying.
324 324 /// @param p_set pointer to created by create_bindingSet set /// @param p_set pointer to created by create_bindingSet set
325 void destroy_bindingSet(compute::BindingsSet *p_set);
325 void destroy_binding_set(compute::BindingSet *p_set);
326 326 /// @brief Destroy buffer bindings. /// @brief Destroy buffer bindings.
327 327 /// Must be called only once for every created binding. /// Must be called only once for every created binding.
328 328 /// Binding cannot be used after destroying. /// Binding cannot be used after destroying.
 
... ... namespace jen
358 358 compute::Pipeline *p_pipeline; compute::Pipeline *p_pipeline;
359 359 /// Pointer to set to use in computation. /// Pointer to set to use in computation.
360 360 /// Must be created with pipeline from *p_pipeline /// Must be created with pipeline from *p_pipeline
361 compute::BindingsSet *p_bindingsSet;
361 compute::BindingSet *p_binding_set;
362 362 /// Pointer to bindings lists. /// Pointer to bindings lists.
363 363 /// Must be еру same as the one passed to this pipeline and this binding set /// Must be еру same as the one passed to this pipeline and this binding set
364 364 compute::Bindings *p_bindings; compute::Bindings *p_bindings;
File libs/vkw/include/vkw/descriptor_set.h changed (mode: 100644) (index b0c4b09..808d059)
... ... namespace vkw
45 45 struct DescrSet : HandleWrapper<VkDescriptorSet> struct DescrSet : HandleWrapper<VkDescriptorSet>
46 46 { {
47 47 void void
48 set(Device d, BindNo bn, DescrType t,
48 set(Device d, Binding bn, DescrType t,
49 49 const DescrBuffer *p_b, const DescrImage *p_i, const BufferView *p_bv) { const DescrBuffer *p_b, const DescrImage *p_i, const BufferView *p_bv) {
50 50 VkWriteDescriptorSet info; { VkWriteDescriptorSet info; {
51 51 info.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; info.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
 
... ... namespace vkw
61 61 } }
62 62 vkUpdateDescriptorSets(d, 1, &info, 0, nullptr); vkUpdateDescriptorSets(d, 1, &info, 0, nullptr);
63 63 } }
64 void set(Device d, BindNo bn, DescrType t, const DescrBuffer &b) {
64 void set(Device d, Binding bn, DescrType t, const DescrBuffer &b) {
65 65 set(d, bn, t, &b, {}, {}); set(d, bn, t, &b, {}, {});
66 66 } }
67 void set(Device d, BindNo bn, DescrType t, const DescrImage &i) {
67 void set(Device d, Binding bn, DescrType t, const DescrImage &i) {
68 68 set(d, bn, t, {}, &i, {}); set(d, bn, t, {}, &i, {});
69 69 } }
70 void set(Device d, BindNo bn, DescrType t, const BufferView &bv) {
70 void set(Device d, Binding bn, DescrType t, const BufferView &bv) {
71 71 set(d, bn, t, {}, {}, &bv); set(d, bn, t, {}, {}, &bv);
72 72 } }
73 73 }; };
File libs/vkw/include/vkw/descriptor_set_layout.h changed (mode: 100644) (index cfb0df2..f1e58f7)
... ... namespace vkw {
28 28 using DescrLayouts = Array<const DescrLayout>; using DescrLayouts = Array<const DescrLayout>;
29 29 } }
30 30 struct vkw::DescrBind : StructWrapper<VkDescriptorSetLayoutBinding> { struct vkw::DescrBind : StructWrapper<VkDescriptorSetLayoutBinding> {
31 BindNo bind_no;
31 Binding binding;
32 32 DescrType type; DescrType type;
33 33 uint32_t count; uint32_t count;
34 34 ShaderStageMask stages; ShaderStageMask stages;
File libs/vkw/include/vkw/typedefs.h changed (mode: 100644) (index 9eff385..3b86268)
... ... namespace vkw
560 560 NONE_NV = VK_INDEX_TYPE_NONE_NV NONE_NV = VK_INDEX_TYPE_NONE_NV
561 561 }; };
562 562
563 using BindNo = uint32_t;
563 using Binding = uint32_t;
564 564
565 565
566 566 constexpr uint32_t format_size(VkFormat f) { constexpr uint32_t format_size(VkFormat f) {
File src/compute/cmd_unit.cpp changed (mode: 100644) (index ba10fed..e9a5c55)
... ... compute(const ComputeInfo &info)
417 417 auto &cmds = p->compute_cmds; auto &cmds = p->compute_cmds;
418 418 auto &pipeline = info.p_pipeline->pipeline; auto &pipeline = info.p_pipeline->pipeline;
419 419 auto &pipelineLayout = info.p_pipeline->layout; auto &pipelineLayout = info.p_pipeline->layout;
420 auto &set = info.p_bindingsSet->set;
420 auto &set = info.p_binding_set->set;
421 421
422 422 auto &cmd = cmds.primary[0]; auto &cmd = cmds.primary[0];
423 423 res = cmd.begin(vkw::CmdUsage::ONE_TIME_SUBMIT); res = cmd.begin(vkw::CmdUsage::ONE_TIME_SUBMIT);
File src/compute/compute.cpp changed (mode: 100644) (index 5aef7c4..d04b330)
... ... create_pipeline(const Bindings &bi, const char *p_shader_file_path,
42 42 auto put_part = [&numBinds, &dbinds] (vkw::DescrType dt, auto part) { auto put_part = [&numBinds, &dbinds] (vkw::DescrType dt, auto part) {
43 43 for (auto &b : part) for (auto &b : part)
44 44 dbinds[numBinds++] = { dbinds[numBinds++] = {
45 .bind_no = b.binding,
45 .binding = b.binding,
46 46 .type = dt, .type = dt,
47 47 .count = 1, .count = 1,
48 48 .stages = vkw::ShaderStage::COMPUTE, .stages = vkw::ShaderStage::COMPUTE,
 
... ... init(Device *p_d, BindingBuffer *p, const BindingCreateInfo &info) {
102 102 else else
103 103 mem_use = DevMemUsage::STATIC; mem_use = DevMemUsage::STATIC;
104 104
105 p->binding = info.bindingNo;
105 p->binding = info.binding;
106 106
107 107 Result res; Result res;
108 108 res = p_d->buffer_allocator res = p_d->buffer_allocator
 
... ... create_images(ImageCreateInfos infos, Image *p_dst) {
235 235 } }
236 236
237 237 [[nodiscard]] Result [[nodiscard]] Result
238 init(Device *p_dev, BindingsSet *p, vkw::DescrLayout setLayout,
238 init(Device *p_dev, BindingSet *p, vkw::DescrLayout setLayout,
239 239 const Bindings &bi) const Bindings &bi)
240 240 { {
241 241 uint32_t numPoolPart = 0; uint32_t numPoolPart = 0;
 
... ... init(Device *p_dev, BindingsSet *p, vkw::DescrLayout setLayout,
291 291
292 292 return res; return res;
293 293 } }
294 void destroy(Device *p_dev, BindingsSet *p) {
294 void destroy(Device *p_dev, BindingSet *p) {
295 295 p->pool.destroy(*p_dev); p->pool.destroy(*p_dev);
296 296 } }
297 297
298 298 [[nodiscard]] Result ModuleCompute:: [[nodiscard]] Result ModuleCompute::
299 299 create_bindingSet(const Pipeline &pipeline, const Bindings &bindings, create_bindingSet(const Pipeline &pipeline, const Bindings &bindings,
300 BindingsSet *p_dst) {
300 BindingSet *p_dst) {
301 301 return init(&p->device, p_dst, pipeline.setLayout, bindings); return init(&p->device, p_dst, pipeline.setLayout, bindings);
302 302 } }
303 303
304 304
305 305 void ModuleCompute:: void ModuleCompute::
306 destroy_bindingSet(BindingsSet *p_set) {
306 destroy_binding_set(BindingSet *p_set) {
307 307 destroy(&p->device, p_set); destroy(&p->device, p_set);
308 308 } }
309 309 void ModuleCompute:: void ModuleCompute::
File src/graphics/draw_stages/clusters.cpp changed (mode: 100644) (index 9207756..16874b0)
... ... init(jen::Device *p_dev, vkw::DescrPool pool)
92 92
93 93 jl::array<vkw::DescrBind, BINDING_COUNT> bindings; jl::array<vkw::DescrBind, BINDING_COUNT> bindings;
94 94 bindings[BINDING_OFFSETS] = { bindings[BINDING_OFFSETS] = {
95 .bind_no = BINDING_OFFSETS,
95 .binding = BINDING_OFFSETS,
96 96 .type = OFFSET_DESCR, .type = OFFSET_DESCR,
97 97 .count = 1, .count = 1,
98 98 .stages = vkw::ShaderStage::FRAGMENT, .stages = vkw::ShaderStage::FRAGMENT,
99 99 }; };
100 100 bindings[BINDING_LIGHTS] = { bindings[BINDING_LIGHTS] = {
101 .bind_no = BINDING_LIGHTS,
101 .binding = BINDING_LIGHTS,
102 102 .type = LIGHTS_DESCR, .type = LIGHTS_DESCR,
103 103 .count = 1, .count = 1,
104 104 .stages = vkw::ShaderStage::FRAGMENT, .stages = vkw::ShaderStage::FRAGMENT,
105 105 }; };
106 106 bindings[BINDING_INDICES] = { bindings[BINDING_INDICES] = {
107 .bind_no = BINDING_INDICES,
107 .binding = BINDING_INDICES,
108 108 .type = INDICES_DESCR, .type = INDICES_DESCR,
109 109 .count = 1, .count = 1,
110 110 .stages = vkw::ShaderStage::FRAGMENT, .stages = vkw::ShaderStage::FRAGMENT,
File src/graphics/draw_stages/clusters.h changed (mode: 100644) (index 7217c43..bcd2849)
... ... namespace jen::vk::clusters
28 28 constexpr static const auto CLUSTER_COUNT = EXTENT.volume(); constexpr static const auto CLUSTER_COUNT = EXTENT.volume();
29 29 constexpr static const uint32_t BUFFER_BINDING = 3; constexpr static const uint32_t BUFFER_BINDING = 3;
30 30
31 constexpr static const vkw::BindNo BINDING_OFFSETS = 0;
32 constexpr static const vkw::BindNo BINDING_LIGHTS = 1;
33 constexpr static const vkw::BindNo BINDING_INDICES = 2;
31 constexpr static const vkw::Binding BINDING_OFFSETS = 0;
32 constexpr static const vkw::Binding BINDING_LIGHTS = 1;
33 constexpr static const vkw::Binding BINDING_INDICES = 2;
34 34 constexpr static const uint32_t BINDING_COUNT = 3; constexpr static const uint32_t BINDING_COUNT = 3;
35 35
36 36 constexpr static const vkw::DescrType OFFSET_DESCR = { constexpr static const vkw::DescrType OFFSET_DESCR = {
File src/graphics/draw_stages/offscreen/offscreen.cpp changed (mode: 100644) (index 6b22911..8fc862b)
... ... CANCEL:
216 216 init(Device *p_dev, vkw::DescrPool pool) { init(Device *p_dev, vkw::DescrPool pool) {
217 217 Result res; Result res;
218 218 vkw::DescrBind binding = { vkw::DescrBind binding = {
219 .bind_no = 0,
219 .binding = 0,
220 220 .type = vkw::DescrType::UNIFORM_BUFFER_DYNAMIC, .type = vkw::DescrType::UNIFORM_BUFFER_DYNAMIC,
221 221 .count = 1, .count = 1,
222 222 .stages = vkw::ShaderStage::VERTEX | vkw::ShaderStage::GEOMETRY, .stages = vkw::ShaderStage::VERTEX | vkw::ShaderStage::GEOMETRY,
File src/graphics/draw_stages/pass_depthcube.cpp changed (mode: 100644) (index c930852..aefd74e)
... ... init(jen::Device *p_d, PassDepthCube *p_pass, vkw::DescrPool pool,
226 226
227 227 vkw::DescrBind binding; vkw::DescrBind binding;
228 228 binding = { binding = {
229 .bind_no = 0,
230 .type = vkw::DescrType::UNIFORM_BUFFER_DYNAMIC,
231 .count = 1,
232 .stages = vkw::ShaderStage::GEOMETRY | vkw::ShaderStage::FRAGMENT,
233 .pImmutableSamplers = nullptr,
229 .binding = 0,
230 .type = vkw::DescrType::UNIFORM_BUFFER_DYNAMIC,
231 .count = 1,
232 .stages = vkw::ShaderStage::GEOMETRY | vkw::ShaderStage::FRAGMENT,
234 233 }; };
235 234 res = ubd.init(p_d, sizeof(LightData), 2, binding, pool); res = ubd.init(p_d, sizeof(LightData), 2, binding, pool);
236 235 if (res != VK_SUCCESS) if (res != VK_SUCCESS)
File src/misc/descriptors.cpp changed (mode: 100644) (index f8ab527..e58878c)
... ... init(Device *p_dev, vkw::DeviceSize size,
86 86 res = create_buffer(p_dev, this, size, count); res = create_buffer(p_dev, this, size, count);
87 87 if (res != VK_SUCCESS) if (res != VK_SUCCESS)
88 88 goto C_LAYOUT; goto C_LAYOUT;
89 res = create_set(p_dev->device, this, binding.bind_no, pool);
89 res = create_set(p_dev->device, this, binding.binding, pool);
90 90 if (res != VK_SUCCESS) if (res != VK_SUCCESS)
91 91 goto C_BUFFER; goto C_BUFFER;
92 92 return res; return res;
 
... ... init(vkw::Device device) {
128 128 init(vkw::Device device) { init(vkw::Device device) {
129 129 Result res; Result res;
130 130 vkw::DescrBind binding = { vkw::DescrBind binding = {
131 .bind_no = 0,
131 .binding = 0,
132 132 .type = vkw::DescrType::COMBINED_IMAGE_SAMPLER, .type = vkw::DescrType::COMBINED_IMAGE_SAMPLER,
133 133 .count = 1, .count = 1,
134 134 .stages = vkw::ShaderStage::FRAGMENT, .stages = vkw::ShaderStage::FRAGMENT,
 
... ... void jen::DescriptorTextureAllocator::destroy(vkw::Device device, Set set) {
208 208 init(vkw::Device dev, vkw::DescrPool p, vkw::ImView v, vkw::Sampler s) { init(vkw::Device dev, vkw::DescrPool p, vkw::ImView v, vkw::Sampler s) {
209 209 Result res; Result res;
210 210 vkw::DescrBind binding = { vkw::DescrBind binding = {
211 .bind_no = 0,
211 .binding = 0,
212 212 .type = s.is_null() ? DESCR_TYPE : DESCR_TYPE_SAMPLER, .type = s.is_null() ? DESCR_TYPE : DESCR_TYPE_SAMPLER,
213 213 .count = 1, .count = 1,
214 214 .stages = vkw::ShaderStage::FRAGMENT, .stages = vkw::ShaderStage::FRAGMENT,
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/Jackalope/jen

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/Jackalope/jen

Clone this repository using git:
git clone git://git.rocketgit.com/user/Jackalope/jen

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main