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
vkimagelayoutvk_image_layout_preinitializedvk_image_layout_shader_read_only_optimal. - use
vkimagetexture 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
vkimageundefined
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
vkbufferbundefinedbackedhost_visiblememory , map it - create
vkimageiundefinedbackeddevice_localmemory - 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
bgeneral - synchronize cpu (likely waiting on
vkfenceorvkqueueidle) - invalidate(if non-coherent), write it, flush(if non-coherent)
- synchronize gpu (done implicitly if 3. before queue submission)
- transition
btransfer - synchronize make sure
inot in use (likely waiting onvksemaphore) - transition
itransfer - do
vkcmdcopy*bi - 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
ifree use (likely waiting onvksemaphore) - transition
iwhatever needed - do rendering
- synchronize make known finished
i(likely signallingvksemaphore) - start on @ 1.
Comments
Post a Comment