Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

[BUG] createGLBuffer and copyToGLBuffer do not point to the same device

Abierto
#242 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
cpp

Línea de trabajo

Comienza con forge/examples/opencl y cl_helpers.h, especialmente con get_devices y las dos sobrecargas de createCLGLContext. Reproduce el fallo en un sistema con varias tarjetas gráficas y, a continuación, rastrea qué dispositivo OpenCL utiliza cada operación sobre búferes OpenGL. Se considera terminado cuando los ejemplos crean y copian búferes GL a través del mismo dispositivo sin depender de seleccionar el último dispositivo.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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<cl::Platform> &platforms_interop,
                 std::vector<Device> &devices_interop) {
  std::vector<cl::Platform> platforms;
  Platform::get(&platforms);

  for (auto platform : platforms) {
    std::vector<cl::Device> 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<CL_PLATFORM_NAME>()
                  << " 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<CL_PLATFORM_NAME>()
  //           << std::endl;
  // std::cout << "Device: " << device.getInfo<CL_DEVICE_NAME>() << 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<cl::Platform> platforms;
  std::vector<Device> 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();
}
Lenguaje dominante
C++
Estrellas
238
Forks
46
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de arrayfire/forge

Todos los issues de arrayfire/forge

Issues similares

Más issues de C++

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.