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:vulkan memory management less wrong 538051412ca7f0409f4dc1a2a21877c1a34c45eb Sylvain BERTRAND 2024-10-03 11:21:09
npv:sync vulkan error codes with latest specs. 0d61683a8e8669d3f6f8b11c3301d2e9fbde97c2 Sylvain BERTRAND 2024-10-01 12:15:24
npv: fixes, sync cleanup 2e8935339971f099e42cab9f4142bf040d09b109 Sylvain BERTRAND 2024-09-30 13:56:03
npv:osd:smooth timer glyph rendering d6bed048741df610b9a4c5efb9c527bd792a6a2c Sylvain BERTRAND 2024-05-05 14:05:50
npv:osd:timer glyph size change 38787582262a2c4cd08d29384f928c3d86e500eb Sylvain BERTRAND 2024-05-04 22:43:43
epoll cfg done at the wrong time c275849395c9c772d293c0e02216ff3f94bd1899 Sylvain BERTRAND 2023-08-13 20:50:55
npv: my iap trash peering with twitch.tv wants more workaround ccdcd2048de11de3f78c8a6011824b2abdace92d Sylvain BERTRAND 2022-09-04 02:53:07
npv: move to a shared video/audio limit 53d5990ce4a87715a106095dde83e6658c3c1642 Sylvain BERTRAND 2022-08-30 17:58:39
npv: my iap hls peering with twitch.tv is accute trash 4ab8caadb41ac42482f8c7a43725054067674fe3 Sylvain BERTRAND 2022-08-30 17:17:21
npv: alsa, POLLERR is XRUN 73c89d6529123fca081c4f55d1a57eab4ede7b90 Sylvain BERTRAND 2022-06-30 15:43:27
npv: may help IAPs with bad peerings 7ec70f67d779a478f065f0e92259e52f8315d113 Sylvain BERTRAND 2022-06-30 15:42:47
move to new ffmpeg channel layout handling 938790d0c657278f405c4f57987d2274c5ada9b7 Sylvain BERTRAND 2022-03-20 22:18:01
npa: fine grained volume control 89279ea0c7dcaf7a718c9a57ecb6b08a0ccfbcb9 Sylvain BERTRAND 2022-02-15 23:24:36
npv: add fine grained volume control 06bc3b77b065f35f294659db520f66e7e8094c8c Sylvain BERTRAND 2022-02-15 18:47:34
npv: move to freetype SDF rendering 972a3027fec3b69a1e10405cc0da35b5194b6f46 Sylvain BERTRAND 2021-12-27 20:54:53
npv:osd:ascii only mode for the timer 3de3158fc3300f8a9c6f75fcca76b512331b8c2f Sylvain BERTRAND 2021-10-30 19:18:38
npv: default to dejavu instead of noto 708f3166a09fd7ba815ec47907cabfb1af4d26c5 Sylvain BERTRAND 2021-10-10 17:05:17
npv: live mode and ready the code for indicators.. if ever... 2d6ddb83edd6f08e99fbe01dc60a354b5e5a2afe Sylvain BERTRAND 2021-07-23 13:17:47
npv: don't block the muted state 0c29e9329ec5db6bed191b2b4caffff8166bd11f Sylvain BERTRAND 2021-07-21 21:34:37
npv: now we have enough perspective, make states internal 62f6b1bf62fc083762f036ddde1f29dd23baf814 Sylvain BERTRAND 2021-07-21 20:12:36
Commit 538051412ca7f0409f4dc1a2a21877c1a34c45eb - npv:vulkan memory management less wrong
Author: Sylvain BERTRAND
Author date (UTC): 2024-10-03 11:21
Committer name: Sylvain BERTRAND
Committer date (UTC): 2024-10-03 11:21
Parent(s): 0d61683a8e8669d3f6f8b11c3301d2e9fbde97c2
Signer:
Signing key:
Signing status: N
Tree: 64531de82cd19d3dbadbcbeeee0951cd2afade07
File Lines added Lines deleted
npv/nyanvk/consts.h 8 0
npv/nyanvk/types.h 6 0
npv/video/local/code.frag.c 66 16
npv/vk/api_usage.h 3 4
npv/vk/local/code.frag.c 5 3
File npv/nyanvk/consts.h changed (mode: 100644) (index 0f45d4c..2978a67)
... ... enum {
63 63 vk_struct_type_cb_begin_info = 42, vk_struct_type_cb_begin_info = 42,
64 64 vk_struct_type_rp_begin_info = 43, vk_struct_type_rp_begin_info = 43,
65 65 vk_struct_type_img_mem_barrier = 45, vk_struct_type_img_mem_barrier = 45,
66 vk_struct_type_mem_barrier = 46,
66 67 /* extension number 2 or index 1, offset 0 */ /* extension number 2 or index 1, offset 0 */
67 68 vk_struct_type_swpchn_create_info = 1000000000 + 1000 + 0, vk_struct_type_swpchn_create_info = 1000000000 + 1000 + 0,
68 69 /* extension number 2 or index 1, offset 1 */ /* extension number 2 or index 1, offset 1 */
 
... ... enum {
139 140 enum { enum {
140 141 vk_mem_prop_dev_local_bit = 0x00000001, vk_mem_prop_dev_local_bit = 0x00000001,
141 142 vk_mem_prop_host_visible_bit = 0x00000002, vk_mem_prop_host_visible_bit = 0x00000002,
143 vk_mem_prop_host_coherent_bit = 0x00000004,
142 144 vk_mem_prop_host_cached_bit = 0x00000008, vk_mem_prop_host_cached_bit = 0x00000008,
143 145 vk_mem_prop_bits_enum_max = 0x7fffffff vk_mem_prop_bits_enum_max = 0x7fffffff
144 146 }; };
 
... ... enum {
196 198 enum { enum {
197 199 /* more */ /* more */
198 200 vk_pl_stage_top_of_pipe_bit = (1 << 0), vk_pl_stage_top_of_pipe_bit = (1 << 0),
201 vk_pl_stage_transfer_bit = 0x00001000,
199 202 vk_pl_stage_bottom_of_pipe_bit = (1 << 13), vk_pl_stage_bottom_of_pipe_bit = (1 << 13),
200 203 vk_pl_stage_bits_enum_max = 0x7fffffff vk_pl_stage_bits_enum_max = 0x7fffffff
201 204 }; };
 
... ... enum {
307 310 vk_filt_linear = 1, vk_filt_linear = 1,
308 311 vk_filt_enum_max = 0x7fffffff vk_filt_enum_max = 0x7fffffff
309 312 }; };
313 enum {
314 vk_access_memory_read = 0x00008000,
315 vk_access_memory_write = 0x00010000,
316 vk_access_enum_max = 0x7fffffff
317 };
310 318 #endif #endif
File npv/nyanvk/types.h changed (mode: 100644) (index 123e194..788ae05)
... ... struct vk_img_mem_barrier_t {
319 319 struct vk_img_t *img; struct vk_img_t *img;
320 320 struct vk_img_subrsrc_range_t subrsrc_range; struct vk_img_subrsrc_range_t subrsrc_range;
321 321 }; };
322 struct vk_mem_barrier_t {
323 u32 type;
324 void *next;
325 u32 src_access;
326 u32 dst_access;
327 };
322 328 struct vk_cb_alloc_info_t { struct vk_cb_alloc_info_t {
323 329 u32 type; u32 type;
324 330 void *next; void *next;
File npv/video/local/code.frag.c changed (mode: 100644) (index d64bbce..3bd6b64)
... ... STATIC void img_mem_barrier_run_once(struct vk_img_mem_barrier_t *b)
112 112 &begin_info); &begin_info);
113 113 IF_FATALVVK("%d:unable to begin recording the layout transition command buffer for the vulkan image which will be used by ffmpeg color space converter\n", r, npv_vk_surf_p.dev.misc_cbs[npv_vk_color_space_layout_transition]); IF_FATALVVK("%d:unable to begin recording the layout transition command buffer for the vulkan image which will be used by ffmpeg color space converter\n", r, npv_vk_surf_p.dev.misc_cbs[npv_vk_color_space_layout_transition]);
114 114 /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
115 /* don't wait on any pipe stage, neither make wait any pipe stage */
115 116 vk_cmd_pl_barrier(npv_vk_surf_p.dev.misc_cbs[ vk_cmd_pl_barrier(npv_vk_surf_p.dev.misc_cbs[
116 npv_vk_color_space_layout_transition], b);
117 npv_vk_color_space_layout_transition],
118 vk_pl_stage_top_of_pipe_bit, vk_pl_stage_bottom_of_pipe_bit,
119 0, 0, 1, b);
117 120 /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
118 121 vk_end_cb(npv_vk_surf_p.dev.misc_cbs[ vk_end_cb(npv_vk_surf_p.dev.misc_cbs[
119 122 npv_vk_color_space_layout_transition]); npv_vk_color_space_layout_transition]);
 
... ... STATIC void tmp_scaler_img_mem_rqmts_get(void)
191 194 vk_get_img_mem_rqmts(&info, rqmts); vk_get_img_mem_rqmts(&info, rqmts);
192 195 IF_FATALVVK("%d:device:%p:unable to get memory requirements for scaler image\n", r, npv_vk_surf_p.dev.vk); IF_FATALVVK("%d:device:%p:unable to get memory requirements for scaler image\n", r, npv_vk_surf_p.dev.vk);
193 196 } }
197 /* we want coherent memory to avoid to have to flush the memory range */
194 198 #define WANTED_MEM_PROPS (vk_mem_prop_host_visible_bit \ #define WANTED_MEM_PROPS (vk_mem_prop_host_visible_bit \
195 | vk_mem_prop_host_cached_bit)
199 | vk_mem_prop_host_cached_bit | vk_mem_prop_host_coherent_bit)
196 200 #define IS_DEV_LOCAL(x) (((x)->prop_flags & vk_mem_prop_dev_local_bit) != 0) #define IS_DEV_LOCAL(x) (((x)->prop_flags & vk_mem_prop_dev_local_bit) != 0)
197 201 STATIC bool match_mem_type(u8 mem_type_idx, STATIC bool match_mem_type(u8 mem_type_idx,
198 202 struct vk_mem_rqmts_t *img_rqmts, bool ignore_gpu_is_discret) struct vk_mem_rqmts_t *img_rqmts, bool ignore_gpu_is_discret)
 
... ... STATIC void blit_setup(u8 swpchn_img)
478 482 { {
479 483 s32 r; s32 r;
480 484 struct vk_cb_begin_info_t begin_info; struct vk_cb_begin_info_t begin_info;
481 struct vk_img_mem_barrier_t b;
485 struct vk_img_mem_barrier_t img_b;
486 struct vk_mem_barrier_t mb;
482 487 struct vk_img_blit_t region; struct vk_img_blit_t region;
483 488 struct vk_extent_2d_t *current; struct vk_extent_2d_t *current;
484 489 union vk_clr_color_val_t clr_color_val; union vk_clr_color_val_t clr_color_val;
 
... ... STATIC void blit_setup(u8 swpchn_img)
504 509 vk_begin_cb(npv_vk_surf_p.dev.cbs[swpchn_img], &begin_info); vk_begin_cb(npv_vk_surf_p.dev.cbs[swpchn_img], &begin_info);
505 510 IF_FATALVVK("%d:swapchain img:%u:command buffer:%p:unable to begin recording\n", r, swpchn_img, npv_vk_surf_p.dev.cbs[swpchn_img]); IF_FATALVVK("%d:swapchain img:%u:command buffer:%p:unable to begin recording\n", r, swpchn_img, npv_vk_surf_p.dev.cbs[swpchn_img]);
506 511 /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
507 /* acquired img (undefined layout) to presentation layout */
508 memset(&b, 0, sizeof(b));
509 b.type = vk_struct_type_img_mem_barrier;
510 b.old_layout = vk_img_layout_undefined;
511 b.new_layout = vk_img_layout_present;
512 b.src_q_fam = vk_q_fam_ignored;
513 b.dst_q_fam = vk_q_fam_ignored;
514 b.img = npv_vk_surf_p.dev.swpchn.imgs[swpchn_img];
515 b.subrsrc_range.aspect = vk_img_aspect_color_bit;
516 b.subrsrc_range.lvls_n = 1;
517 b.subrsrc_range.array_layers_n = 1;
518 vk_cmd_pl_barrier(npv_vk_surf_p.dev.cbs[swpchn_img], &b);
512 /*
513 * Acquired img, from undefined layout (whatever layout discarded) to
514 * to general layout.
515 * Initially, acquired images are in undefined layout, it is only after
516 * their first presentation they are returned with a presentation layout
517 * and their content.
518 */
519 memset(&img_b, 0, sizeof(img_b));
520 img_b.type = vk_struct_type_img_mem_barrier;
521 img_b.dst_access = vk_access_memory_write; /* the dst stage will want to clear then write */
522 img_b.old_layout = vk_img_layout_undefined;
523 img_b.new_layout = vk_img_layout_general;
524 img_b.src_q_fam = vk_q_fam_ignored;
525 img_b.dst_q_fam = vk_q_fam_ignored;
526 img_b.img = npv_vk_surf_p.dev.swpchn.imgs[swpchn_img];
527 img_b.subrsrc_range.aspect = vk_img_aspect_color_bit;
528 img_b.subrsrc_range.lvls_n = 1;
529 img_b.subrsrc_range.array_layers_n = 1;
530 /*
531 * don't wait on any stage, block on the transfer stage for the
532 * following clear command
533 */
534 vk_cmd_pl_barrier(npv_vk_surf_p.dev.cbs[swpchn_img],
535 vk_pl_stage_top_of_pipe_bit, vk_pl_stage_transfer_bit,
536 0, 0, 1, &img_b);
519 537 /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
520 538 /* clear the viewport with integer black pixels since we work in sRGB */ /* clear the viewport with integer black pixels since we work in sRGB */
521 539 memset(&clr_color_val, 0, sizeof(clr_color_val)); memset(&clr_color_val, 0, sizeof(clr_color_val));
 
... ... STATIC void blit_setup(u8 swpchn_img)
525 543 range.array_layers_n = 1; range.array_layers_n = 1;
526 544 vk_cmd_clr_color_img(npv_vk_surf_p.dev.cbs[swpchn_img], vk_cmd_clr_color_img(npv_vk_surf_p.dev.cbs[swpchn_img],
527 545 npv_vk_surf_p.dev.swpchn.imgs[swpchn_img], npv_vk_surf_p.dev.swpchn.imgs[swpchn_img],
528 vk_img_layout_present, &clr_color_val, 1,
546 vk_img_layout_general, &clr_color_val, 1,
529 547 &range); &range);
530 548 /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
549 /*
550 * insert a memory barrier between the clear color command and the
551 * following transfer-blit-scale-filter
552 */
553 memset(&mb, 0, sizeof(mb));
554 mb.type = vk_struct_type_mem_barrier;
555 mb.src_access = vk_access_memory_write; /* finish to clear everything */
556 mb.dst_access = vk_access_memory_read | vk_access_memory_write; /* the dst stage will want to filter, let's expect reads and writes */
557 vk_cmd_pl_barrier(npv_vk_surf_p.dev.cbs[swpchn_img],
558 vk_pl_stage_transfer_bit, vk_pl_stage_transfer_bit,
559 1, &mb, 0, 0);
560 /*--------------------------------------------------------------------*/
531 561 /* blit from cpu img to pe img */ /* blit from cpu img to pe img */
532 562 memset(&region, 0, sizeof(region)); memset(&region, 0, sizeof(region));
533 563 region.src_subrsrc.aspect = vk_img_aspect_color_bit; region.src_subrsrc.aspect = vk_img_aspect_color_bit;
 
... ... STATIC void blit_setup(u8 swpchn_img)
554 584 vk_cmd_blit_img(npv_vk_surf_p.dev.cbs[swpchn_img], scaler_p.img.vk, vk_cmd_blit_img(npv_vk_surf_p.dev.cbs[swpchn_img], scaler_p.img.vk,
555 585 npv_vk_surf_p.dev.swpchn.imgs[swpchn_img], &region, filt); npv_vk_surf_p.dev.swpchn.imgs[swpchn_img], &region, filt);
556 586 /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
587 /* acquired img general layout to presentation layout */
588 memset(&img_b, 0, sizeof(img_b));
589 img_b.type = vk_struct_type_img_mem_barrier;
590 img_b.src_access = vk_access_memory_write; /* flush the final writes of the transfer-blit-scale-filter */
591 img_b.old_layout = vk_img_layout_general;
592 img_b.new_layout = vk_img_layout_present;
593 img_b.src_q_fam = vk_q_fam_ignored;
594 img_b.dst_q_fam = vk_q_fam_ignored;
595 img_b.img = npv_vk_surf_p.dev.swpchn.imgs[swpchn_img];
596 img_b.subrsrc_range.aspect = vk_img_aspect_color_bit;
597 img_b.subrsrc_range.lvls_n = 1;
598 img_b.subrsrc_range.array_layers_n = 1;
599 /*
600 * wait on the previous transfer stage, but don't make wait any pipe
601 * stages since we are going to pe
602 */
603 vk_cmd_pl_barrier(npv_vk_surf_p.dev.cbs[swpchn_img],
604 vk_pl_stage_transfer_bit, vk_pl_stage_bottom_of_pipe_bit,
605 0, 0, 1, &img_b);
606 /*--------------------------------------------------------------------*/
557 607 vk_end_cb(npv_vk_surf_p.dev.cbs[swpchn_img]); vk_end_cb(npv_vk_surf_p.dev.cbs[swpchn_img]);
558 608 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]);
559 609 blit_l[swpchn_img].update_requested = false; blit_l[swpchn_img].update_requested = false;
File npv/vk/api_usage.h changed (mode: 100644) (index 140d558..138d99b)
... ... r = npv_vk_surf_p.dev.dl_vk_begin_cb(__VA_ARGS__)
60 60 #define vk_end_cb(...) \ #define vk_end_cb(...) \
61 61 r = npv_vk_surf_p.dev.dl_vk_end_cb(__VA_ARGS__) r = npv_vk_surf_p.dev.dl_vk_end_cb(__VA_ARGS__)
62 62
63 /* we only use this for image barriers, logical layout transition, then bottom of pipe everywhere */
64 #define vk_cmd_pl_barrier(cb, b) \
65 npv_vk_surf_p.dev.dl_vk_cmd_pl_barrier(cb, vk_pl_stage_bottom_of_pipe_bit, vk_pl_stage_bottom_of_pipe_bit, 0, 0, 0, 0, 0, 1, b)
63 #define vk_cmd_pl_barrier(cb, src_stage_msk, dst_stage_msk, mbs_n, mbs, img_bs_n, img_bs) \
64 npv_vk_surf_p.dev.dl_vk_cmd_pl_barrier(cb, src_stage_msk, dst_stage_msk, 0, mbs_n, mbs, 0, 0, img_bs_n, img_bs)
66 65
67 66 #define vk_q_submit(info, fence) \ #define vk_q_submit(info, fence) \
68 67 r = npv_vk_surf_p.dev.dl_vk_q_submit(npv_vk_surf_p.dev.q, 1, info, fence) r = npv_vk_surf_p.dev.dl_vk_q_submit(npv_vk_surf_p.dev.q, 1, info, fence)
 
... ... r = npv_vk_surf_p.dev.dl_vk_acquire_next_img(npv_vk_surf_p.dev.vk, __VA_ARGS__)
80 79 r = npv_vk_surf_p.dev.dl_vk_reset_cb(cb, 0) r = npv_vk_surf_p.dev.dl_vk_reset_cb(cb, 0)
81 80
82 81 #define vk_cmd_blit_img(cb, src_img, dst_img, region, filter) \ #define vk_cmd_blit_img(cb, src_img, dst_img, region, filter) \
83 npv_vk_surf_p.dev.dl_vk_cmd_blit_img(cb, src_img, vk_img_layout_general, dst_img, vk_img_layout_present, 1, region, filter)
82 npv_vk_surf_p.dev.dl_vk_cmd_blit_img(cb, src_img, vk_img_layout_general, dst_img, vk_img_layout_general, 1, region, filter)
84 83
85 84 #define vk_q_present(info) \ #define vk_q_present(info) \
86 85 r = npv_vk_surf_p.dev.dl_vk_q_present(npv_vk_surf_p.dev.q, info) r = npv_vk_surf_p.dev.dl_vk_q_present(npv_vk_surf_p.dev.q, info)
File npv/vk/local/code.frag.c changed (mode: 100644) (index e037deb..4b86dd5)
... ... STATIC void phydev_mem_type_dump(void *phydev, u8 i,
376 376 pout("physical device:%p:memory type:%u:host visible\n", phydev, i); pout("physical device:%p:memory type:%u:host visible\n", phydev, i);
377 377 if ((type->prop_flags & vk_mem_prop_host_cached_bit) != 0) if ((type->prop_flags & vk_mem_prop_host_cached_bit) != 0)
378 378 pout("physical device:%p:memory type:%u:host cached\n", phydev, i); pout("physical device:%p:memory type:%u:host cached\n", phydev, i);
379 if ((type->prop_flags & vk_mem_prop_host_coherent_bit) != 0)
380 pout("physical device:%p:memory type:%u:host coherent\n", phydev, i);
379 381 } }
380 382 STATIC void tmp_phydev_mem_types_dump(struct tmp_phydev_t *p) STATIC void tmp_phydev_mem_types_dump(struct tmp_phydev_t *p)
381 383 { {
 
... ... STATIC void swpchn_reinit(void)
885 887 STATIC void swpchn_imgs_get(void) STATIC void swpchn_imgs_get(void)
886 888 { {
887 889 s32 r; s32 r;
890 surf_p.dev.swpchn.imgs_n = swpchn_imgs_n_max;
888 891 /* /*
889 * TODO: should try to figure out how to favor double buf over
890 * everything else
892 * we queried the minimum image count already, then vk_incomplete is not
893 * supposed to happen
891 894 */ */
892 surf_p.dev.swpchn.imgs_n = swpchn_imgs_n_max;
893 895 vk_get_swpchn_imgs(); vk_get_swpchn_imgs();
894 896 IF_FATALVK("%d:device:%p:surface:%p:swapchain:%p:unable to get the swapchain images\n", r, surf_p.dev.vk, surf_p.vk, surf_p.dev.swpchn.vk); IF_FATALVK("%d:device:%p:surface:%p:swapchain:%p:unable to get the swapchain images\n", r, surf_p.dev.vk, surf_p.vk, surf_p.dev.swpchn.vk);
895 897 } }
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