sylware / nyanmp (public) (License: AGPLv3) (since 2020-02-12) (hash sha1)
intended to become a collection of media players for gnu/linux based on ffmpeg, alsa, vulkan, x11, wayland, etc.
List of commits:
Subject Hash Author Date (UTC)
npv: correct coarse sync of vulkan image acquisition a9b52940ff2d567dc6c26b28d86eab54f5876819 Sylvain BERTRAND 2020-09-20 22:00:32
npv: fix channel layout handling and a tad more 88f74f181a567d108874a936fe3d306d34cfefb7 Sylvain BERTRAND 2020-09-19 23:12:04
npv: dynamic audio filter configuration d8a0ff688ddb2abcde22c01a2ae52ea74e9f0f2f Sylvain BERTRAND 2020-09-19 20:54:04
npv:protection against tantrum of media audio 78589150b7c6f1f3cae49b4b4bc8b572c6d8e6b7 Sylvain BERTRAND 2020-09-18 15:26:17
npv/npa:finish to workaround null channel layout 314788563e01d7ffb364a1775ba68619ee3f6c5c Sylvain BERTRAND 2020-09-15 22:50:57
npv: handle empty channel layout 5b5794fc4d5300b671b684a2f41196f66bd1fc4a Sylvain BERTRAND 2020-09-15 22:11:07
npv: tidy mutex locking 1962092d9675f76604414086200e88f6c857346f Sylvain BERTRAND 2020-09-15 00:51:12
npv: less incorrect reprogramming of blits b319e79f4f1b79670f6eef754142cc65c891ad4b Sylvain BERTRAND 2020-09-12 15:14:27
npv:fix osd restoration 8c64f703eca6b8c54b4cb5c95231dd02aa394135 Sylvain BERTRAND 2020-08-29 20:36:12
npv:osd:solo compilation modulo a few warnings 7805bd8f34f913b1535cc81c5be2a3132bd7e0e5 Sylvain BERTRAND 2020-08-29 14:51:35
npv: cleanup and color component fix 44f294e1de96c7974740f1187ebdbe12204884ae Sylvain BERTRAND 2020-08-28 23:48:18
npv:osd:timer, will add more if pertinent 6d34403c2c49bfa6ccf8e7a72e35a69e6f0527c5 Sylvain BERTRAND 2020-08-28 22:47:18
npv/npa: document properly snd_pcm_drain behavior 510ca39ee6a9ac9fcd646484793b7556eaa5972f Sylvain BERTRAND 2020-08-26 17:36:29
npv:remove locale layout dependent key binds f69bbbe529045b4243ece8957c838cb1465352da Sylvain BERTRAND 2020-08-24 21:27:08
npv: global seek based on audio timeline only 3c8fd60fa0a67143fa16ac90565bfcc35a193b6b Sylvain BERTRAND 2020-08-24 18:41:16
npv:_reasonable_ "pedanticage" of the code c5f2644d6eba84bcbcc9b0599c41e1f6733ea95c Sylvain BERTRAND 2020-08-20 16:25:50
npa:some amount of pedanticage 554bd5b07b1a82eabb2622cbf565031bf7af5c6d Sylvain BERTRAND 2020-08-18 19:33:47
hacking again on it after a rather long time cc09df4f340c9f906e0de9520d2c803ea6936769 Sylvain BERTRAND 2020-08-16 18:14:14
npv:fix initial volume not being stored ef66775061157e5af7d6938d06f38e6e7d06a873 Sylvain BERTRAND 2020-08-15 16:59:23
npv:fixing the fix 2043d3ae57ff8b4c26acfd1ee2ff8958cb887ab8 Sylvain BERTRAND 2020-07-17 19:11:14
Commit a9b52940ff2d567dc6c26b28d86eab54f5876819 - npv: correct coarse sync of vulkan image acquisition
Author: Sylvain BERTRAND
Author date (UTC): 2020-09-20 22:00
Committer name: Sylvain BERTRAND
Committer date (UTC): 2020-09-20 22:00
Parent(s): 88f74f181a567d108874a936fe3d306d34cfefb7
Signing key:
Tree: 6f820df01aed0e5588112e6183e7d02d55570bb8
File Lines added Lines deleted
npv/TODO 1 1
npv/nyanvk/consts.h 5 0
npv/nyanvk/syms_dev.h 14 2
npv/nyanvk/types.h 5 0
npv/video/local/code.frag.c 30 3
npv/video/namespace/main.c 4 0
npv/video/public/code.frag.c 2 0
npv/vk/api_usage.h 11 2
npv/vk/local/code.frag.c 15 0
npv/vk/namespace/main.c 2 0
npv/vk/public/code.frag.c 1 0
npv/vk/public/state.frag.h 1 0
File npv/TODO changed (mode: 100644) (index 8d590d7..57e3367)
1 1 not ordered: not ordered:
2 2 - we were lied to: presentation/decoding timestamps from a demuxer can be - we were lied to: presentation/decoding timestamps from a demuxer can be
3 3 discontinuous without any warning. discontinuous without any warning.
4 - "buffering" indicatorr? subtitles?
5 4 - forced monotonic video frame selection? may be, probably, more robust in - forced monotonic video frame selection? may be, probably, more robust in
6 5 regard to latency spikes. regard to latency spikes.
6 - "buffering" indicator (no)? subtitles (mmmmh...)?
7 7 - use vulkan shaders (no glsl or hlsl), compute or not, in order to perform - use vulkan shaders (no glsl or hlsl), compute or not, in order to perform
8 8 some yuvX pixel formats to srgb format conversions. do NOT use the vulkan some yuvX pixel formats to srgb format conversions. do NOT use the vulkan
9 9 yuvX samplers as they are mostly dirty hack tricks built into spirv yuvX samplers as they are mostly dirty hack tricks built into spirv
File npv/nyanvk/consts.h changed (mode: 100644) (index 1094587..522aad5)
... ... enum {
43 43 vk_struct_type_dev_create_info = 3, vk_struct_type_dev_create_info = 3,
44 44 vk_struct_type_submit_info = 4, vk_struct_type_submit_info = 4,
45 45 vk_struct_type_mem_alloc_info = 5, vk_struct_type_mem_alloc_info = 5,
46 vk_struct_type_fence_create_info = 8,
46 47 vk_struct_type_sem_create_info = 9, vk_struct_type_sem_create_info = 9,
47 48 vk_struct_type_img_create_info = 14, vk_struct_type_img_create_info = 14,
48 49 vk_struct_type_imgview_create_info = 15, vk_struct_type_imgview_create_info = 15,
 
... ... enum {
295 296 vk_front_face_clockwise = 1, vk_front_face_clockwise = 1,
296 297 vk_front_face_enum_max = 0x7fffffff vk_front_face_enum_max = 0x7fffffff
297 298 }; };
299 enum {
300 vk_fence_create_signaled_bit = 0x00000001,
301 vk_fence_create_flag_bits_enum_max = 0x7fffffff
302 };
298 303 #endif #endif
File npv/nyanvk/syms_dev.h changed (mode: 100644) (index 4333e86..8a8874f)
168 168 u32 vtxs_n, \ u32 vtxs_n, \
169 169 u32 instances_n, \ u32 instances_n, \
170 170 u32 first_vtx, \ u32 first_vtx, \
171 u32 first_instance);\
171 u32 first_instance); \
172 172 void (*dl_vk_cmd_clr_color_img)(\ void (*dl_vk_cmd_clr_color_img)(\
173 173 struct vk_cb_t *cb,\ struct vk_cb_t *cb,\
174 174 struct vk_img_t *img,\ struct vk_img_t *img,\
175 175 u32 img_layout,\ u32 img_layout,\
176 176 union vk_clr_color_val_t *color,\ union vk_clr_color_val_t *color,\
177 177 u32 ranges_n,\ u32 ranges_n,\
178 struct vk_img_subrsrc_range_t *ranges);
178 struct vk_img_subrsrc_range_t *ranges); \
179 s32 (*dl_vk_create_fence)(\
180 struct vk_dev_t *dev, \
181 struct vk_fence_create_info_t *info, \
182 void * allocator, \
183 struct vk_fence_t **fence); \
184 s32 (*dl_vk_get_fence_status)(\
185 struct vk_dev_t *dev, \
186 struct vk_fence_t *fence); \
187 s32 (*dl_vk_reset_fences)( \
188 struct vk_dev_t *dev, \
189 u32 fences_n, \
190 struct vk_fence_t **fences);
179 191 #endif #endif
File npv/nyanvk/types.h changed (mode: 100644) (index 72da47b..b264ce3)
... ... struct vk_rp_begin_info_t {
633 633 u32 clr_vals_n; u32 clr_vals_n;
634 634 union vk_clr_val_t *clr_vals; union vk_clr_val_t *clr_vals;
635 635 }; };
636 struct vk_fence_create_info_t {
637 u32 type;
638 void *next;
639 u32 flags;
640 };
636 641 #endif #endif
File npv/video/local/code.frag.c changed (mode: 100644) (index 285cfab..48ef6ab)
... ... STATIC void img_mem_barrier_run_once(struct vk_img_mem_barrier_t *b)
119 119 submit_info.type = vk_struct_type_submit_info; submit_info.type = vk_struct_type_submit_info;
120 120 submit_info.cbs_n = 1; submit_info.cbs_n = 1;
121 121 submit_info.cbs = &npv_vk_surf_p.dev.cbs[0]; submit_info.cbs = &npv_vk_surf_p.dev.cbs[0];
122 vk_q_submit(&submit_info);
122 vk_q_submit(&submit_info, 0);
123 123 IF_FATALVVK("%d:queue:%p:unable to submit the initial layout transition command buffer\n", r, npv_vk_surf_p.dev.q); IF_FATALVVK("%d:queue:%p:unable to submit the initial layout transition command buffer\n", r, npv_vk_surf_p.dev.q);
124 124 /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
125 125 vk_q_wait_idle(); vk_q_wait_idle();
 
... ... STATIC void blit_setup(u8 swpchn_img)
528 528 IF_FATALVVK("%d:swapchain img:%u:command buffer:%p:unable to end recording\n", r, swpchn_img, npv_vk_surf_p.dev.cbs[swpchn_img]); IF_FATALVVK("%d:swapchain img:%u:command buffer:%p:unable to end recording\n", r, swpchn_img, npv_vk_surf_p.dev.cbs[swpchn_img]);
529 529 blit_l[swpchn_img].update_requested = false; blit_l[swpchn_img].update_requested = false;
530 530 } }
531 /*NSPC*/
532 531 STATIC void blits_request_update(void) STATIC void blits_request_update(void)
533 532 { {
534 533 u8 i; u8 i;
 
... ... STATIC void blits_request_update(void)
541 540 ++i; ++i;
542 541 } }
543 542 } }
543 STATIC bool are_sems_available(void)
544 {
545 s32 r;
546 /* coarse synchronization (we could use a pool of semaphores/fences) */
547 vk_get_fence_status();
548 if (r == vk_not_ready)
549 return false;
550 else if (r != vk_success)
551 npv_vk_fatal("%d:device:%p:unable to get fence %p status\n", r, npv_vk_surf_p.dev.vk, npv_vk_surf_p.dev.fence);
552 /* vk_success */
553 vk_reset_fences();
554 IF_FATALVVK("%d:device:%p:unable to reset the fence\n", r, npv_vk_surf_p.dev.vk, npv_vk_surf_p.dev.fence);
555 return true;
556 }
544 557 #define READY 0 #define READY 0
545 558 #define NOT_READY 1 #define NOT_READY 1
546 559 STATIC u8 swpchn_next_img(u32 *swpchn_img) { loop STATIC u8 swpchn_next_img(u32 *swpchn_img) { loop
 
... ... STATIC u8 swpchn_next_img(u32 *swpchn_img) { loop
554 567 info.timeout = 0; info.timeout = 0;
555 568 info.devs = 0x00000001; /* no device group then 1 */ info.devs = 0x00000001; /* no device group then 1 */
556 569 info.sem = npv_vk_surf_p.dev.sems[npv_vk_sem_acquire_img_done]; info.sem = npv_vk_surf_p.dev.sems[npv_vk_sem_acquire_img_done];
570 /*
571 * XXX: for this vk func, the wait sem _MUST_ be unsignaled _AND_ have
572 * all its "wait" operations completed. state we secure with our usage
573 * of a fence.
574 */
557 575 vk_acquire_next_img(&info, swpchn_img); vk_acquire_next_img(&info, swpchn_img);
558 576 if (r == vk_not_ready) if (r == vk_not_ready)
559 577 return NOT_READY; return NOT_READY;
 
... ... STATIC u8 send_to_pe(u32 swpchn_img)
581 599 memset(&submit_info, 0, sizeof(submit_info)); memset(&submit_info, 0, sizeof(submit_info));
582 600 submit_info.type = vk_struct_type_submit_info; submit_info.type = vk_struct_type_submit_info;
583 601 submit_info.wait_sems_n = 1; submit_info.wait_sems_n = 1;
602 /*
603 * the "semaphore wait operation" will unsignal this semaphore once the
604 * "wait" is done.
605 */
584 606 submit_info.wait_sems = submit_info.wait_sems =
585 607 &npv_vk_surf_p.dev.sems[npv_vk_sem_acquire_img_done]; &npv_vk_surf_p.dev.sems[npv_vk_sem_acquire_img_done];
586 608 wait_dst_stage = vk_pl_stage_bottom_of_pipe_bit; wait_dst_stage = vk_pl_stage_bottom_of_pipe_bit;
 
... ... STATIC u8 send_to_pe(u32 swpchn_img)
589 611 submit_info.cbs = &npv_vk_surf_p.dev.cbs[swpchn_img]; submit_info.cbs = &npv_vk_surf_p.dev.cbs[swpchn_img];
590 612 submit_info.signal_sems_n = 1; submit_info.signal_sems_n = 1;
591 613 submit_info.signal_sems = &npv_vk_surf_p.dev.sems[npv_vk_sem_blit_done]; submit_info.signal_sems = &npv_vk_surf_p.dev.sems[npv_vk_sem_blit_done];
592 vk_q_submit(&submit_info);
614 /* XXX: coarse synchronization happens here */
615 vk_q_submit(&submit_info, npv_vk_surf_p.dev.fence);
593 616 IF_FATALVVK("%d:queue:%p:unable to submit the image pre-recorded command buffer\n", r, npv_vk_surf_p.dev.q); IF_FATALVVK("%d:queue:%p:unable to submit the image pre-recorded command buffer\n", r, npv_vk_surf_p.dev.q);
594 617 /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
595 618 idxs[0] = swpchn_img; idxs[0] = swpchn_img;
596 619 memset(&present_info, 0, sizeof(present_info)); memset(&present_info, 0, sizeof(present_info));
597 620 present_info.type = vk_struct_type_present_info; present_info.type = vk_struct_type_present_info;
621 /*
622 * the "semaphore wait operation" will unsignal this semaphore once the
623 * "wait" is done.
624 */
598 625 present_info.wait_sems_n = 1; present_info.wait_sems_n = 1;
599 626 present_info.wait_sems = &npv_vk_surf_p.dev.sems[npv_vk_sem_blit_done]; present_info.wait_sems = &npv_vk_surf_p.dev.sems[npv_vk_sem_blit_done];
600 627 present_info.swpchns_n = 1; present_info.swpchns_n = 1;
File npv/video/namespace/main.c changed (mode: 100644) (index 7844aa7..2780159)
4 4 #define avutil_video_fr_ref_alloc av_frame_alloc #define avutil_video_fr_ref_alloc av_frame_alloc
5 5 #define avutil_video_fr_unref av_frame_unref #define avutil_video_fr_unref av_frame_unref
6 6 /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
7 #define are_sems_available npv_video_are_sems_available
7 8 #define blit_compute_offsets npv_video_blit_compute_offsets #define blit_compute_offsets npv_video_blit_compute_offsets
8 9 #define blit_l npv_video_blit_l #define blit_l npv_video_blit_l
9 10 #define blit_vp_t npv_video_blit_vp_t #define blit_vp_t npv_video_blit_vp_t
10 11 #define blit_setup npv_video_blit_setup #define blit_setup npv_video_blit_setup
12 #define blit_request npv_video_blits_request
11 13 #define dec_a_grow npv_video_dec_a_grow #define dec_a_grow npv_video_dec_a_grow
12 14 #define dec_ctx_mutex_l npv_video_dec_ctx_mutex_l #define dec_ctx_mutex_l npv_video_dec_ctx_mutex_l
13 15 #define dec_l npv_video_dec_l #define dec_l npv_video_dec_l
 
49 51 #undef avutil_video_fr_ref_alloc #undef avutil_video_fr_ref_alloc
50 52 #undef avutil_video_fr_unref #undef avutil_video_fr_unref
51 53 /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
54 #undef are_sems_available
52 55 #undef blit_compute_offsets #undef blit_compute_offsets
53 56 #undef blit_l #undef blit_l
54 57 #undef blit_vp_t #undef blit_vp_t
55 58 #undef blit_setup #undef blit_setup
59 #undef blit_request
56 60 #undef dec_a_grow #undef dec_a_grow
57 61 #undef dec_ctx_mutex_l #undef dec_ctx_mutex_l
58 62 #undef dec_l #undef dec_l
File npv/video/public/code.frag.c changed (mode: 100644) (index 3c2fc4b..c8b403b)
... ... STATIC void timer_evt(void)
234 234 if (npv_paused_p) if (npv_paused_p)
235 235 npv_video_osd_rop_restore(); npv_video_osd_rop_restore();
236 236 npv_video_osd_rop_blend(now); npv_video_osd_rop_blend(now);
237 if (!are_sems_available())
238 return;
237 239 loop { /* because the swpchn can change for many reasons */ loop { /* because the swpchn can change for many reasons */
238 240 r = swpchn_next_img(&swpchn_img); r = swpchn_next_img(&swpchn_img);
239 241 if (r == NOT_READY) if (r == NOT_READY)
File npv/vk/api_usage.h changed (mode: 100644) (index 8ee52a2..5d59ce4)
... ... r = npv_vk_surf_p.dev.dl_vk_end_cb(__VA_ARGS__)
63 63 #define vk_cmd_pl_barrier(cb, b) \ #define vk_cmd_pl_barrier(cb, b) \
64 64 npv_vk_surf_p.dev.dl_vk_cmd_pl_barrier(cb, vk_pl_stage_top_of_pipe_bit, vk_pl_stage_top_of_pipe_bit, 0, 0, 0, 0, 0, 1, b) npv_vk_surf_p.dev.dl_vk_cmd_pl_barrier(cb, vk_pl_stage_top_of_pipe_bit, vk_pl_stage_top_of_pipe_bit, 0, 0, 0, 0, 0, 1, b)
65 65
66 #define vk_q_submit(info) \
67 r = npv_vk_surf_p.dev.dl_vk_q_submit(npv_vk_surf_p.dev.q, 1, info, 0)
66 #define vk_q_submit(info, fence) \
67 r = npv_vk_surf_p.dev.dl_vk_q_submit(npv_vk_surf_p.dev.q, 1, info, fence)
68 68
69 69 #define vk_q_wait_idle() \ #define vk_q_wait_idle() \
70 70 r = npv_vk_surf_p.dev.dl_vk_q_wait_idle(npv_vk_surf_p.dev.q) r = npv_vk_surf_p.dev.dl_vk_q_wait_idle(npv_vk_surf_p.dev.q)
 
... ... r = npv_vk_surf_p.dev.dl_vk_q_present(npv_vk_surf_p.dev.q, info)
90 90 r = npv_vk_surf_p.dev.dl_vk_create_sem(npv_vk_surf_p.dev.vk, info, 0, sem) r = npv_vk_surf_p.dev.dl_vk_create_sem(npv_vk_surf_p.dev.vk, info, 0, sem)
91 91
92 92 #define vk_cmd_clr_color_img npv_vk_surf_p.dev.dl_vk_cmd_clr_color_img #define vk_cmd_clr_color_img npv_vk_surf_p.dev.dl_vk_cmd_clr_color_img
93
94 #define vk_create_fence(info) \
95 r = npv_vk_surf_p.dev.dl_vk_create_fence(npv_vk_surf_p.dev.vk, info, 0, &npv_vk_surf_p.dev.fence)
96
97 #define vk_get_fence_status() \
98 r = npv_vk_surf_p.dev.dl_vk_get_fence_status(npv_vk_surf_p.dev.vk, npv_vk_surf_p.dev.fence)
99
100 #define vk_reset_fences() \
101 r = npv_vk_surf_p.dev.dl_vk_reset_fences(npv_vk_surf_p.dev.vk, 1, &npv_vk_surf_p.dev.fence)
93 102 /******************************************************************************/ /******************************************************************************/
94 103 /* cherry picked from nyanvk/syms_global.h */ /* cherry picked from nyanvk/syms_global.h */
95 104 #define VK_GLOBAL_SYMS \ #define VK_GLOBAL_SYMS \
File npv/vk/local/code.frag.c changed (mode: 100644) (index f996199..19afef6)
... ... STATIC void dev_syms(void)
84 84 DEV_SYM(vkQueuePresentKHR, vk_q_present); DEV_SYM(vkQueuePresentKHR, vk_q_present);
85 85 DEV_SYM(vkCreateSemaphore, vk_create_sem); DEV_SYM(vkCreateSemaphore, vk_create_sem);
86 86 DEV_SYM(vkCmdClearColorImage, vk_cmd_clr_color_img); DEV_SYM(vkCmdClearColorImage, vk_cmd_clr_color_img);
87 DEV_SYM(vkCreateFence, vk_create_fence);
88 DEV_SYM(vkGetFenceStatus, vk_get_fence_status);
89 DEV_SYM(vkResetFences, vk_reset_fences);
87 90 } }
88 91 #undef DEVICE_SYM #undef DEVICE_SYM
89 92 /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
 
... ... STATIC void sems_create(void)
888 891 ++sem; ++sem;
889 892 } }
890 893 } }
894 STATIC void fence_create(void)
895 {
896 s32 r;
897 struct vk_fence_create_info_t info;
898
899 memset(&info, 0, sizeof(info));
900 info.type = vk_struct_type_fence_create_info;
901 info.flags = vk_fence_create_signaled_bit;
902 vk_create_fence(&info);
903 IF_FATALVK("%d:device:%p:unable to create the synchronization fence\n", r, surf_p.dev.vk);
904 pout("device:%p:synchronization fence created %p\n", surf_p.dev.vk, surf_p.dev.fence);
905 }
891 906 STATIC void swpchn_imgs_cbs_init_once(void) STATIC void swpchn_imgs_cbs_init_once(void)
892 907 { {
893 908 s32 r; s32 r;
File npv/vk/namespace/main.c changed (mode: 100644) (index 893a047..47fd1e3)
5 5 #define dev_init npv_vk_dev_init #define dev_init npv_vk_dev_init
6 6 #define dev_syms npv_vk_devs_syms #define dev_syms npv_vk_devs_syms
7 7 #define dev_type_str npv_vk_dev_type_str #define dev_type_str npv_vk_dev_type_str
8 #define fence_create npv_vk_fence_create
8 9 #define instance_create npv_vk_instance_create #define instance_create npv_vk_instance_create
9 10 #define instance_exts_dump npv_vk_instance_exts_dump #define instance_exts_dump npv_vk_instance_exts_dump
10 11 #define instance_l npv_vk_instance_l #define instance_l npv_vk_instance_l
 
66 67 #undef dev_init #undef dev_init
67 68 #undef dev_syms #undef dev_syms
68 69 #undef dev_type_str #undef dev_type_str
70 #undef fence_create
69 71 #undef instance_create #undef instance_create
70 72 #undef instance_exts_dump #undef instance_exts_dump
71 73 #undef instance_l #undef instance_l
File npv/vk/public/code.frag.c changed (mode: 100644) (index 021e14f..fa46cab)
... ... STATIC void surf_init_once(xcb_connection_t *c, u32 win_id)
45 45 surf_create(c, win_id); surf_create(c, win_id);
46 46 dev_init(); dev_init();
47 47 sems_create(); sems_create();
48 fence_create();
48 49 /*====================================================================*/ /*====================================================================*/
49 50 swpchn_init_once(); swpchn_init_once();
50 51 swpchn_imgs_cbs_init_once(); swpchn_imgs_cbs_init_once();
File npv/vk/public/state.frag.h changed (mode: 100644) (index 8c40139..d8e7006)
... ... struct dev_t {
26 26 struct vk_dev_t *vk; struct vk_dev_t *vk;
27 27 struct phydev_t phydev; struct phydev_t phydev;
28 28 struct swpchn_t swpchn; struct swpchn_t swpchn;
29 struct vk_fence_t *fence;
29 30 struct vk_q_t *q; struct vk_q_t *q;
30 31 struct vk_cp_t *cp; struct vk_cp_t *cp;
31 32 struct vk_cb_t *cbs[swpchn_imgs_n_max]; struct vk_cb_t *cbs[swpchn_imgs_n_max];
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/sylware/nyanmp

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

Clone this repository using git:
git clone git://git.rocketgit.com/user/sylware/nyanmp

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