SEXP getDeviceIDs(SEXP sPlatformID){ resetError("ROpenCL::getDeviceIDs"); Rcpp::XPtr<cl_platform_id> platformID(sPlatformID); cl_uint num_GPUs = 0; logError( clGetDeviceIDs(*platformID, CL_DEVICE_TYPE_GPU, 0, 0, &num_GPUs) ); std::vector<cl_device_id> gpus(num_GPUs); logError( clGetDeviceIDs(*platformID, CL_DEVICE_TYPE_GPU, num_GPUs, gpus.empty() ? NULL : &gpus.front(), &num_GPUs) ); cl_uint num_nonGPUs = 0; logError( clGetDeviceIDs(*platformID, ~CL_DEVICE_TYPE_GPU, 0, 0, &num_nonGPUs) ); std::vector<cl_device_id> devices(num_nonGPUs); logError( clGetDeviceIDs(*platformID, ~CL_DEVICE_TYPE_GPU, num_nonGPUs, devices.empty() ? NULL : &devices.front(), &num_nonGPUs) ); //for each device in devices add its pointer to the return list Rcpp::List result(gpus.size() + devices.size()); //To be more compatible with the previous version of this function, put GPUs first in the result list. for (int i=0; i<gpus.size(); i++){ cl_device_id *tempDeviceID = new cl_device_id; *tempDeviceID = gpus[i]; Rcpp::XPtr<cl_device_id> tempXPtr(tempDeviceID); result[i] = tempXPtr; } for (int i=0; i<devices.size(); i++){ cl_device_id *tempDeviceID = new cl_device_id; *tempDeviceID = devices[i]; Rcpp::XPtr<cl_device_id> tempXPtr(tempDeviceID); result[i+gpus.size()] = tempXPtr; } PRINTONERROR(); return result; }
void Renderer::initDevice() { uint32_t gpuCount; errorCheck(vkEnumeratePhysicalDevices(mInstance, &gpuCount, nullptr)); std::vector<VkPhysicalDevice> gpus(gpuCount); errorCheck(vkEnumeratePhysicalDevices(mInstance, &gpuCount, gpus.data())); printf("GPUS:\n"); for (auto it = gpus.begin(); it < gpus.end(); it++) { checkDeviceProperties(*it); } mGpu = gpus[0]; // Grabbing the first one (doesn't mean that the first one is the best one) vkGetPhysicalDeviceProperties(mGpu, &mGpuProperties); uint32_t familyCount; vkGetPhysicalDeviceQueueFamilyProperties(mGpu, &familyCount, nullptr); std::vector<VkQueueFamilyProperties> familyProperties(familyCount); vkGetPhysicalDeviceQueueFamilyProperties(mGpu, &familyCount, familyProperties.data()); bool found = false; for (uint32_t i = 0; i < familyCount; i++) { if (familyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { mGraphicsFamilyIndex = i; found = true; break; } } if (!found) { assert(0 && "Couldn't find a graphics queue"); std::exit(-1); } // Vulkan layers enumeration example. /*{ uint32_t layerCount; vkEnumerateInstanceLayerProperties(&layerCount, nullptr); std::vector<VkLayerProperties> layerProperties(layerCount); vkEnumerateInstanceLayerProperties(&layerCount, layerProperties.data()); printf("Instance layers installed:\n"); for (auto &i : layerProperties) { printf(" %s\t\t\t | %s\n", i.layerName, i.description); } } { uint32_t layerCount; vkEnumerateDeviceLayerProperties(mGpu, &layerCount, nullptr); std::vector<VkLayerProperties> layerProperties(layerCount); vkEnumerateDeviceLayerProperties(mGpu, &layerCount, layerProperties.data()); printf("Device layers installed:\n"); for (auto &i : layerProperties) { printf(" %s\t\t\t | %s\n", i.layerName, i.description); } }*/ float queuePriorities[]{ 1.0 }; VkDeviceQueueCreateInfo deviceQueueCreateInfo{}; deviceQueueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; deviceQueueCreateInfo.queueFamilyIndex = mGraphicsFamilyIndex; deviceQueueCreateInfo.queueCount = 1; deviceQueueCreateInfo.pQueuePriorities = queuePriorities; VkDeviceCreateInfo deviceCreateInfo{}; deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; deviceCreateInfo.queueCreateInfoCount = 1; deviceCreateInfo.pQueueCreateInfos = &deviceQueueCreateInfo; deviceCreateInfo.enabledLayerCount = mDeviceLayerList.size(); deviceCreateInfo.ppEnabledLayerNames = mDeviceLayerList.data(); deviceCreateInfo.enabledExtensionCount = mDeviceExtensionList.size(); deviceCreateInfo.ppEnabledExtensionNames = mDeviceExtensionList.data(); errorCheck(vkCreateDevice(mGpu, &deviceCreateInfo, nullptr, &mDevice)); vkGetDeviceQueue(mDevice, mGraphicsFamilyIndex, 0, &mGraphicsQueue); }