How to update texture for every frame in vulkan? -
as question title says, want update texture every frame.
i got idea : create vkimage
texture buffer bellow configurations :
initiallayout = vk_image_layout_preinitialized
usage= vk_image_usage_sampled_bit
and it's memory type vk_memory_property_host_visible_bit | vk_memory_property_host_coherent_bit
in draw loop :
first frame :
- map texure data
vkimage
(usevkmapmemory
). - change
vkimage
layoutvk_image_layout_preinitialized
vk_image_layout_shader_read_only_optimal
. - use
vkimage
texture buffer.
second frame:
the layout vk_image_layout_shader_read_only_optimal
after first frame , can map next texure data vkimage
directly without change it's layout ? if can not that, layout can change vkimage
?
in vkspec 11.4 says :
the new layout used in transition must not vk_image_layout_undefined or vk_image_layout_preinitialized
so , can not change layout _preinitialized
.
appreciated.
for case not need layout_preinitialized
. complicate code (forcing provide separate code first frame).
layout_preinitialized
indeed special layout intended start of life of image. more useful static textures.
start layout_undefined
, use layout_general
when need write image cpu side.
i propose scheme:
berfore render loop
- create
vkimage
undefined
1st nth frame (aka render loop)
- transition image
general
- synchronize (likely
vkfence
) - map image, write it, unmap (weell, mapping , unmaping can perhaps outside render loop)
- synchronize (potentially done implicitly)
- transition image whatever layout need next
- do rendering , whatnot
- start on @ 1.
it naive implementation should suffice ordinary hobbyist uses.
double buffered access can implemented — e.g. vkbuffer
cpu access , vkimage
of same gpu access. , vkcmdcopy*
must done data hand-off.
it not more complicated above approach , there can performance benefits (if need @ stage of project). want resources in device local memory, not host visible.
it go like:
berfore render loop
- create
vkbuffer
b
undefined
backedhost_visible
memory , map it - create
vkimage
i
undefined
backeddevice_local
memory - prepare synchronization primitives between
i
,b
: e.g. 2 semaphores, or events used or barriers if transfer in same queue
1st nth frame (aka render loop)
operations on b
, i
can pretty detached (even can on different queues) so:
for b
:
- transition
b
general
- synchronize cpu (likely waiting on
vkfence
orvkqueueidle
) - invalidate(if non-coherent), write it, flush(if non-coherent)
- synchronize gpu (done implicitly if 3. before queue submission)
- transition
b
transfer
- synchronize make sure
i
not in use (likely waiting onvksemaphore
) - transition
i
transfer
- do
vkcmdcopy*
b
i
- synchronize make known finished
i
(likely signallingvksemaphore
) - start on @ 1.
(the fence @ 2. , semaphore @ 6. have pre-signalled or skipped first frame work)
for i
:
- synchronize make sure
i
free use (likely waiting onvksemaphore
) - transition
i
whatever needed - do rendering
- synchronize make known finished
i
(likely signallingvksemaphore
) - start on @ 1.
Comments
Post a Comment