使用 `vk::raii::ImageView` 与 `std::vector`

huangapple go评论87阅读模式
英文:

Usage of `vk::raii:ImageView` with `std::vector`

问题

我正在尝试使用此函数将std::vector<VkImage>映射到std::vector<vk::raii::ImageView>。映射方法来自它们的示例,所以也许示例是错误的,我不知道。

  1. std::vector<vk::raii::ImageView> Render::createImageViews(
  2. std::vector<VkImage>& images,
  3. vk::raii::Device& device
  4. ) {
  5. std::vector<vk::raii::ImageView> views(images.size());
  6. vk::ImageViewCreateInfo createInfo(
  7. {},
  8. {},
  9. vk::ImageViewType::e2D,
  10. vk::Format::eB8G8R8A8Srgb,
  11. {},
  12. { vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1 }
  13. );
  14. for (size_t i = 0; i < images.size(); i++) {
  15. createInfo.image = images[i];
  16. views[i] = std::move(
  17. vk::raii::ImageView(device, createInfo)
  18. );
  19. }
  20. return views;
  21. }

我遇到了这个错误,它展开为以下内容:

  1. mkdir -p build/debug/obj
  2. g++ -c -std=c++17 -Wall -pedantic -g -D ENABLE_VK_VALIDATION_LAYERS -D ENABLE_DEBUG_LOG -D VULKAN_HPP_NO_SMART_HANDLE -D VULKAN_HPP_NO_SPACESHIP_OPERATOR -D VULKAN_HPP_NO_TO_STRING -D VULKAN_HPP_NO_SETTERS src/render.cpp -o build/debug/obj/render.o
  3. In file included from /usr/include/c++/11/optional:44,
  4. from src/render.hpp:3,
  5. from src/render.cpp:1:
  6. /usr/include/c++/11/bits/stl_construct.h: In instantiation of void std::_Construct(_Tp*, _Args&& ...) [with _Tp = vk::raii::ImageView; _Args = {}]’:
  7. /usr/include/c++/11/bits/stl_uninitialized.h:579:18: required from static _ForwardIterator std::__uninitialized_default_n_1<_TrivialValueType>::__uninit_default_n(_ForwardIterator, _Size) [with _ForwardIterator = vk::raii::ImageView*; _Size = long unsigned int; bool _TrivialValueType = false]’
  8. /usr/include/c++/11/bits/stl_uninitialized.h:640:20: required from _ForwardIterator std::__uninitialized_default_n(_ForwardIterator, _Size) [with _ForwardIterator = vk::raii::ImageView*; _Size = long unsigned int]’
  9. /usr/include/c++/11/bits/stl_uninitialized.h:704:44: required from _ForwardIterator std::__uninitialized_default_n_a(_ForwardIterator, _Size, std::allocator<_Tp>&) [with _ForwardIterator = vk::raii::ImageView*; _Size = long unsigned int; _Tp = vk::raii::ImageView]’
  10. /usr/include/c++/11/bits/stl_vector.h:1606:36: required from void std::vector<_Tp, _Alloc>::_M_default_initialize(std::vector<_Tp, _Alloc>::size_type) [with _Tp = vk::raii::ImageView; _Alloc = std::allocator<vk::raii::ImageView>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]’
  11. /usr/include/c++/11/bits/stl_vector.h:512:9: required from std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type, const allocator_type&) [with _Tp = vk::raii::ImageView; _Alloc = std::allocator<vk::raii::ImageView>; std::vector<_Tp, _Alloc>::size_type = long unsigned int; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<vk::raii::ImageView>]’
  12. src/render.cpp:121:57: required from here
  13. /usr/include/c++/11/bits/stl_construct.h:119:7: error: use of deleted function vk::raii::ImageView::ImageView()’
  14. 119 | ::new(static_cast<void*>(__p)) _Tp(std::forward<_Args>(__args)...);
  15. | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  16. In file included from src/render.hpp:12,
  17. from src/render.cpp:1:
  18. /usr/include/vulkan/vulkan_raii.hpp:7501:7: note: declared here
  19. 7501 | ImageView() = delete;
  20. | ^~~~~~~~~
  21. make: *** [Makefile:44: build/debug/obj/render.o] Error 1

这是我唯一的错误,我确信它是由这段代码引起的。

我已经检查了vk::raii::ImageView的定义,它的默认构造函数被标记为删除。

这是vulkan_raii.hpp的一个“bug”还是我应该使用非 RAII 版本来从VkImage创建图像视图?

英文:

I'm trying to map std::vector&lt;VkImage&gt; to std::vector&lt;vk::raii::ImageView&gt; with this function. The mapping approach was taken from their samples, so maybe samples are wrong, idk.

  1. std::vector&lt;vk::raii::ImageView&gt; Render::createImageViews(
  2. std::vector&lt;VkImage&gt;&amp; images,
  3. vk::raii::Device&amp; device
  4. ) {
  5. std::vector&lt;vk::raii::ImageView&gt; views(images.size());
  6. vk::ImageViewCreateInfo createInfo(
  7. {},
  8. {},
  9. vk::ImageViewType::e2D,
  10. vk::Format::eB8G8R8A8Srgb,
  11. {},
  12. { vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1 }
  13. );
  14. for (size_t i = 0; i &lt; images.size(); i++) {
  15. createInfo.image = images[i];
  16. views[i] = std::move(
  17. vk::raii::ImageView(device, createInfo)
  18. );
  19. }
  20. return views;
  21. }

And I'm getting this error, which unwraps into this:

  1. make RUN=1
  2. mkdir -p build/debug/obj
  3. g++ -c -std=c++17 -Wall -pedantic -g -D ENABLE_VK_VALIDATION_LAYERS -D ENABLE_DEBUG_LOG -D VULKAN_HPP_NO_SMART_HANDLE -D VULKAN_HPP_NO_SPACESHIP_OPERATOR -D VULKAN_HPP_NO_TO_STRING -D VULKAN_HPP_NO_SETTERS src/render.cpp -o build/debug/obj/render.o
  4. In file included from /usr/include/c++/11/optional:44,
  5. from src/render.hpp:3,
  6. from src/render.cpp:1:
  7. /usr/include/c++/11/bits/stl_construct.h: In instantiation of void std::_Construct(_Tp*, _Args&amp;&amp; ...) [with _Tp = vk::raii::ImageView; _Args = {}]’:
  8. /usr/include/c++/11/bits/stl_uninitialized.h:579:18: required from static _ForwardIterator std::__uninitialized_default_n_1&lt;_TrivialValueType&gt;::__uninit_default_n(_ForwardIterator, _Size) [with _ForwardIterator = vk::raii::ImageView*; _Size = long unsigned int; bool _TrivialValueType = false]’
  9. /usr/include/c++/11/bits/stl_uninitialized.h:640:20: required from _ForwardIterator std::__uninitialized_default_n(_ForwardIterator, _Size) [with _ForwardIterator = vk::raii::ImageView*; _Size = long unsigned int]’
  10. /usr/include/c++/11/bits/stl_uninitialized.h:704:44: required from _ForwardIterator std::__uninitialized_default_n_a(_ForwardIterator, _Size, std::allocator&lt;_Tp&gt;&amp;) [with _ForwardIterator = vk::raii::ImageView*; _Size = long unsigned int; _Tp = vk::raii::ImageView]’
  11. /usr/include/c++/11/bits/stl_vector.h:1606:36: required from void std::vector&lt;_Tp, _Alloc&gt;::_M_default_initialize(std::vector&lt;_Tp, _Alloc&gt;::size_type) [with _Tp = vk::raii::ImageView; _Alloc = std::allocator&lt;vk::raii::ImageView&gt;; std::vector&lt;_Tp, _Alloc&gt;::size_type = long unsigned int]’
  12. /usr/include/c++/11/bits/stl_vector.h:512:9: required from std::vector&lt;_Tp, _Alloc&gt;::vector(std::vector&lt;_Tp, _Alloc&gt;::size_type, const allocator_type&amp;) [with _Tp = vk::raii::ImageView; _Alloc = std::allocator&lt;vk::raii::ImageView&gt;; std::vector&lt;_Tp, _Alloc&gt;::size_type = long unsigned int; std::vector&lt;_Tp, _Alloc&gt;::allocator_type = std::allocator&lt;vk::raii::ImageView&gt;]’
  13. src/render.cpp:121:57: required from here
  14. /usr/include/c++/11/bits/stl_construct.h:119:7: error: use of deleted function vk::raii::ImageView::ImageView()’
  15. 119 | ::new(static_cast&lt;void*&gt;(__p)) _Tp(std::forward&lt;_Args&gt;(__args)...);
  16. | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  17. In file included from src/render.hpp:12,
  18. from src/render.cpp:1:
  19. /usr/include/vulkan/vulkan_raii.hpp:7501:7: note: declared here
  20. 7501 | ImageView() = delete;
  21. | ^~~~~~~~~
  22. make: *** [Makefile:44: build/debug/obj/render.o] Error 1

It is the only error I have and I'm certain that it is caused by this code.

I've checked the vk::raii::ImageView definition, and it's default constructor marked as deleted.

Is it a "bug" of vulkan_raii.hpp or I supposed to use non RAII version to create image views out of VkImages?

答案1

得分: 2

views[i] = std::move(
vk::raii::ImageView(device, createInfo)
);

不要移动 rvalue,直接赋值:

views[i] = vk::raii::ImageView(device, createInfo);

如果默认构造函数被删除,就无法执行此操作:

std::vectorvk::raii::ImageView views(images.size());

创建一个空的向量

std::vectorvk::raii::ImageView views;

如果需要,可以预留空间

views.reserve(images.size());

然后在循环中

views.emplace_back(device, createInfo);

英文:
  1. views[i] = std::move(
  2. vk::raii::ImageView(device, createInfo)
  3. );

Don't move rvalue, assign it directly:

  1. views[i] = vk::raii::ImageView(device, createInfo);

This can't be done if the default constructor is deleted:

  1. std::vector&lt;vk::raii::ImageView&gt; views(images.size());

Make an empty vector

  1. std::vector&lt;vk::raii::ImageView&gt; views;

The space can be reserved if it's desired

  1. views.reserve(images.size());

And later in the loop

  1. views.emplace_back(device, createInfo);

huangapple
  • 本文由 发表于 2023年3月3日 23:20:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/75628895.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定