bool VulkanContext::pickPhysicalDeviceAndQueueFamily()

in RenderScriptMigrationSample/app/src/main/cpp/VulkanContext.cpp [119:152]


bool VulkanContext::pickPhysicalDeviceAndQueueFamily() {
    uint32_t numDevices = 0;
    CALL_VK(vkEnumeratePhysicalDevices, mInstance.handle(), &numDevices, nullptr);
    std::vector<VkPhysicalDevice> devices(numDevices);
    CALL_VK(vkEnumeratePhysicalDevices, mInstance.handle(), &numDevices, devices.data());

    // Pick the first device with a compute queue
    for (auto device : devices) {
        uint32_t numQueueFamilies = 0;
        vkGetPhysicalDeviceQueueFamilyProperties(device, &numQueueFamilies, nullptr);
        std::vector<VkQueueFamilyProperties> queueFamilies(numQueueFamilies);
        vkGetPhysicalDeviceQueueFamilyProperties(device, &numQueueFamilies, queueFamilies.data());

        uint32_t qf = 0;
        bool haveQf = false;
        for (uint32_t i = 0; i < queueFamilies.size(); i++) {
            if (queueFamilies[i].queueFlags & VK_QUEUE_COMPUTE_BIT) {
                qf = i;
                haveQf = true;
                break;
            }
        }
        if (!haveQf) continue;
        mPhysicalDevice = device;
        mQueueFamilyIndex = qf;
        break;
    }
    RET_CHECK(mPhysicalDevice != VK_NULL_HANDLE);
    vkGetPhysicalDeviceProperties(mPhysicalDevice, &mPhysicalDeviceProperties);
    mWorkGroupSize = chooseWorkGroupSize(mPhysicalDeviceProperties.limits);
    vkGetPhysicalDeviceMemoryProperties(mPhysicalDevice, &mPhysicalDeviceMemoryProperties);
    LOGV("Using physical device '%s'", mPhysicalDeviceProperties.deviceName);
    return true;
}