Vulkan没有设备内存报告主机可见

时间:2017-05-23 15:25:39

标签: vulkan

我目前正试图进入vulkan。 现在我想做的就是创建一个缓冲区清除它并将其内容读回主机。我现在的问题是我找不到主机可见的单个内存。我在运行GT 750M / GTX 970的笔记本电脑和台式机上测试了我的程序,结果相同。我得到2个记忆,一个2GB / 4GB,报告为本地设备和17GB不是设备本地,到目前为止很好,但他们都没有报告主机可见。我会惊讶于我无法从我的970读取数据,但真正让我觉得我在某处犯了一个大错误,即使17GB系统内存都不是主机可见的。

我使用的是最新版本的LunarG SDK(1.0.49)和最新的GeForece驱动程序。

这是我的实例创建代码:

VkInstance instance;
{
    char *extName = VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
    char *layName = "VK_LAYER_LUNARG_standard_validation";

    VkInstanceCreateInfo info;
    info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    info.enabledExtensionCount = 1;
    info.enabledLayerCount = 1;
    info.pNext = nullptr;
    info.ppEnabledExtensionNames = &extName;
    info.ppEnabledLayerNames = &layName;
    info.flags = 0;

    VkApplicationInfo appinfo;
    appinfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    appinfo.apiVersion = VK_MAKE_VERSION(1, 0, 0);
    appinfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
    appinfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
    appinfo.pApplicationName = "Vulkan Test";
    appinfo.pEngineName = "Vulkan Test";
    appinfo.pNext = nullptr;

    info.pApplicationInfo = &appinfo;

    VkResult res = vkCreateInstance(&info, nullptr, &instance);
    if (res != VK_SUCCESS) {
        std::cerr << "Failed to create instance " << res << std::endl;
        return;
    }
}

1 个答案:

答案 0 :(得分:4)

  

我得到2个记忆,一个2GB / 4GB报告为本地设备和17GB不是本地设备,到目前为止一直很好,但它们都没有报告主机可见。

根据您的描述,它听起来像memory heapsVkPhysicalDeviceMemoryProperties.memoryHeaps)的列表,这对您的GTX750 / 970来说是正确的。

但实际上,您需要检查要在应用中执行的内存分配的内存是类型VkPhysicalDeviceMemoryProperties.memoryTypes)。

这些内存类型(基于堆)包含指定如何访问内存(在堆上)的标志。以下是适用于GTX 970的memory types,包括主机可见类型。