Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取指向vkGetSwapChainImagesKHR对象向量的指针_C++_Vector_C++17_Shared Ptr_Vulkan - Fatal编程技术网

C++ 获取指向vkGetSwapChainImagesKHR对象向量的指针

C++ 获取指向vkGetSwapChainImagesKHR对象向量的指针,c++,vector,c++17,shared-ptr,vulkan,C++,Vector,C++17,Shared Ptr,Vulkan,我正在为Vulkan应用程序处理一个类对象,现在正在修改SwapChain对象的代码。我正在为DepthBuffer添加功能 最初在SwapChain::create(/*…*/)中调用了vkGetSwapChainImagesKHR()。它的名字是这样的: vkGetSwapChainImagesKHR(*device_, swapChain_, &imageCount_, nullptr); images_.resize(imageCount); vkGetSwapChainImag

我正在为Vulkan应用程序处理一个类对象,现在正在修改
SwapChain
对象的代码。我正在为
DepthBuffer
添加功能

最初在
SwapChain::create(/*…*/)
中调用了
vkGetSwapChainImagesKHR()
。它的名字是这样的:

vkGetSwapChainImagesKHR(*device_, swapChain_, &imageCount_, nullptr);
images_.resize(imageCount);
vkGetSwapChainImagesKHR(*device_, swapChain_, &imageCount, images_.data());
其中,
images
SwapChain
的头中声明为
std::vector images


而不是让我的对象编写自己的
createImage
createImageView
函数。。。我决定将
Image
作为一个独立的类对象。我已经为我的所有类使用了许多Vulkan对象,它们遵循类似的接口模式。当一个Vulkan类对象包含另一个而不是存储
raw
Vulkan类型时,它们现在存储
std::shared_ptr
std::vector
类型


现在回到我的
SwapChain
类。它的成员
images\uu
不再是:
std::vector
它现在是
std::vector
,其中
Image
是一个围绕
VkImage
的类,具有创建和清理Vulkan资源所需的所有函数


至于我的问题:我现在如何调用
vkGetSwapChainImagesKHR()

//这是直截了当的。。。
矢量图像;
VGGETSWAPCHAINIMAGESKHR(*设备、交换链和图像计数、图像、数据());
//这就是我被困的地方。。。
矢量图像;
VGGetSwapChainImageSkhr(*设备、swapChain和图像计数、?);//&images.data(),images.get()。。。

如何获取
vkGetSwapChainImagesKHR()
最后一个参数所需的适当类型

好吧,我想告诉您,您必须创建一个
VkImage
s数组(某种类型),并将其传递给函数。但是你的代码会“起作用”,但实际上不会起作用。为什么?

因为您的
图像
类型无法存储它们。看,swapchain图像很特别;它们不属于您的应用程序。这就是为什么不通过通常的
vkCreateImage
调用创建它们。这也是为什么你不能用通常的
vkDestroyImage
调用来销毁它们

您的
图像
类型的析构函数无疑会在图像上调用
vkDestroyImage
。但是你不允许为swapchain图像这样做,因为你不拥有它们

因此,至少,您需要为您的
图像
类型使用一个特殊的构造函数,该构造函数接受一个已经存在的
VkImage
,并在
图像
中设置一些状态,以便其析构函数不会破坏图像


因此,在从Vulkan获得
VkImage
对象数组之后,您只需迭代该数组,并使用前面提到的专门构造函数为堆分配的
Image
对象构建
向量并将其传递给函数。但是你的代码会“起作用”,但实际上不会起作用。为什么?

因为您的
图像
类型无法存储它们。看,swapchain图像很特别;它们不属于您的应用程序。这就是为什么不通过通常的
vkCreateImage
调用创建它们。这也是为什么你不能用通常的
vkDestroyImage
调用来销毁它们

您的
图像
类型的析构函数无疑会在图像上调用
vkDestroyImage
。但是你不允许为swapchain图像这样做,因为你不拥有它们

因此,至少,您需要为您的
图像
类型使用一个特殊的构造函数,该构造函数接受一个已经存在的
VkImage
,并在
图像
中设置一些状态,以便其析构函数不会破坏图像


因此,在从Vulkan获得
VkImage
对象的数组之后,您只需迭代该数组,并构建堆分配
Image
对象的
vector
,为它们使用上述专用构造函数。

我不确定您是否可以假定由
共享的向量指向的数据将在连续内存中。只有那些
共享\u ptr
对象的内存将被删除。但我肯定不是百分之百地在乎这件事。@AdrianMole…因此我被卡住了。。。我可以让交换链保持原样。。。对于只包含一个VkImage的其他类,请在那里使用我的类。。。但我喜欢智能指针中包含的东西。。。它便于清理和减少内存泄漏。这可能取决于您如何分配和/或加载
shared_ptr
vector。如果您通过从原始指针数组(从
new[]
或类似的数组)进行“转换”,那么可能只是第一个元素的
get()
??@AdrianMole给出的地址,我没有显式使用
new
或new[]`。我所有的类都有默认的空构造函数。它们都有一个必须首先调用的初始化函数。它们要么使用
VkDevice*
VkPhysicalDevice*
,要么同时使用这两个指针,或者使用其他一些可能的指针。它检查它们是否为
nullptr
,如果是,则抛出一条消息,如果不是,则将传递的指针分配给类的成员。然后,它们都至少有一个
create()
和一个
cleanup()
,还有几个getter,返回指向底层
VkType
的指针……看起来有点像是在尝试将方形插头插入
vkGetSwapChainImagesKHR()
的圆孔。我不确定您是否可以假定
共享的向量指向的数据将在连续内存中。只有那些
共享的内存
// this is straight forward...
std::vector<VkImage> images_;
vkGetSwapChainImagesKHR(*device_, swapChain_, &imageCount, images_.data()); 

// this is where I'm stuck...
std::vector<std::shared_ptr<Image>> images_;
vkGetSwapChainImagesKHR(*device_, swapChain_, &imageCount_, ??? ); // &images_.data(), images_.get()...