[BUG] createGLBuffer and copyToGLBuffer do not point to the same device
- Langage dominant
- C++
- Étoiles
- 238
- Forks
- 46
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
If you have more than one display cards, all the examples in forge/examples/opencl will fail.
A temporary workaround is to modify createCLGLContext in cl_helpers.h so that cl::Context always use the last device instead of the first device. But it is not a solution at all.
```
void get_devices(const forge::Window &wnd,
std::vector &platforms_interop,
std::vector &devices_interop) {
std::vector platforms;
Platform::get(&platforms);
for (auto platform : platforms) {
std::vector devices;
try {
platform.getDevices(CL_DEVICE_TYPE_GPU, &devices);
for (auto device : devices) {
if (checkGLInterop(platform, device, wnd)) {
devices_interop.push_back(device);
platforms_interop.push_back(platform);
}
}
} catch (const cl::Error &err) {
if (err.err() != CL_DEVICE_NOT_FOUND) {
std::cout << "Platform: " << platform.getInfo()
<< " got error = " << err.err() << std::endl;
throw std::runtime_error("Fatal Error!");
}
}
}
if (devices_interop.size() == 0)
throw std::runtime_error("No CL-GL sharing contexts found");
}
cl::Context createCLGLContext(const forge::Window &wnd, cl::Platform platform,
cl::Device device) {
// std::cout << "Platform: " << platform.getInfo()
// << std::endl;
// std::cout << "Device: " << device.getInfo() << std::endl;
#if defined(OS_MAC)
CGLContextObj cgl_current_ctx = CGLGetCurrentContext();
CGLShareGroupObj cgl_share_group = CGLGetShareGroup(cgl_current_ctx);
cl_context_properties cps[] = {CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE,
(cl_context_properties)cgl_share_group, 0};
#elif defined(OS_LNX)
cl_context_properties cps[] = {CL_GL_CONTEXT_KHR,
(cl_context_properties)wnd.context(),
CL_GLX_DISPLAY_KHR,
(cl_context_properties)wnd.display(),
CL_CONTEXT_PLATFORM,
(cl_context_properties)platform(),
0};
#else /* OS_WIN */
cl_context_properties cps[] = {CL_GL_CONTEXT_KHR,
(cl_context_properties)wnd.context(),
CL_WGL_HDC_KHR,
(cl_context_properties)wnd.display(),
CL_CONTEXT_PLATFORM,
(cl_context_properties)platform(),
0};
#endif
return cl::Context(device, cps);
}
cl::Context createCLGLContext(const forge::Window &wnd) {
std::vector platforms;
std::vector devices;
get_devices(wnd, platforms, devices);
for (size_t i = devices.size() - 1; i >= 0; i--) {
// for (size_t i = 0; i < devices.size(); i++) {
try {
return createCLGLContext(wnd, platforms[i], devices[i]);
} catch (const cl::Error &err) {
std::cout << "[createCLGLContext]Error:" << err.err() << std::endl;
}
}
return cl::Context();
}
```
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
Commencez par forge/examples/opencl et cl_helpers.h, en particulier get_devices et les deux surcharges de createCLGLContext. Reproduisez l’échec sur un système doté de plusieurs cartes graphiques, puis tracez quel périphérique OpenCL utilise chaque opération sur les buffers OpenGL. Le travail est terminé lorsque les exemples créent et copient les buffers GL via le même périphérique sans dépendre de la sélection du dernier périphérique.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- cpp
- Domaine
- computer-graphics
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100