zwin-project / zwin

XR Windowing System on top of Wayland

Home Page:https://zwin.dev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Sharing vertex buffer, texture and shader among multiple virtual objects

Aki-7 opened this issue · comments

vertex buffer, texture, shader について、それぞれ複数のvirtual objectに(間接的に)紐づけられるようにしていて、これは同じtextureなのに複数のVirtual Object に対してそれぞれ別のtextureとして作成するとGPUのメモリがもったいないからだったとおもうんだけど、
例えばtextureの中身を書き換えたとき(attach されているwl_bufferの中身を書き換えたとき)、それに紐づいたvirtual object がcommitされたタイミングで実際にGPU内のtexture用に割り当てた領域を書き換えることになるが、その場合、そのtextureを使っている別のvirtual object は commit してないのに描画内容が変わってしまって、整合性が取れなくなる可能性がでてくるという問題がある。

解決策として、

  1. textureなどは一つのvirtual objectにしか割り当てられなくする。
    問題点としては、複数のvirtual objectで同じtextureを使う時などに効率が悪い。
  2. texture (zgn_opengl_texture) はその中身を変更できないよう(immutable)にする。
    virtual object に紐づいたtextureを変更したい場合は zgn_opengl_textureを新しく作り直して、attachしなおす。
    これなら、さきのvirtual object A でのcommitでB の内容まで変わってしまう問題は解決するが、textureの中身を書き換えるときに一旦新たに古いtextureとは別のGPUのメモリ領域を確保しないといけないので、効率が悪い。(三つ以上のvirtula object に紐づいている場合は1. よりかは効率がよい。)
    また、古いtextureをいつ削除して良いかの制約が面倒。zgn_opengl_texture を削除したタイミングでGPU内のメモリも開放しちゃうのが実装的に楽そうだけど、そうするとなると、なにかにattachされているtextureはdestroyできないというprotocolにする必要がある。(ここでのattachされているかどうかは、commitされているかどうかまで含む。)
  3. 共有用のtextureとそうでないtextureを作って、共有用は2. をそうでない方は1.を適応する。