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;
}