получить платформу opencl, соответствующую платформе opengl - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть два графических процессора на моем компьютере, один из моего процессора и другой из моей графической карты.

Я пытаюсь использовать возможности взаимодействия opengl / opencl.Но я застрял в создании контекста opencl, я не знаю, как определить, какая платформа / устройство из двух используется opengl.

В приведенном выше коде, какую функцию я должен использовать втест "DEVICE MATCHING OPENGL ONE", чтобы проверить, является ли устройство тем, что используется OpenGL, или что я должен сделать, чтобы проверить, является ли platform_id хорошим?

sf::ContextSettings settings;
settings.depthBits = 24;
settings.stencilBits = 8;
settings.antialiasingLevel = 2;
sf::Window window(sf::VideoMode(2048, 1024), "GAME",
        sf::Style::Fullscreen, settings);

glewInit();

cl_platform_id platform_ids[16] = { NULL };
cl_device_id device_id = NULL;
cl_uint ret_num_devices;
cl_uint ret_num_platforms;

cl_platform_id platform_id = 0;
cl_int ret = clGetPlatformIDs(_countof(platform_ids), platform_ids,
            &ret_num_platforms);

size_t n = 0;

cl_context_properties props[] = { CL_GL_CONTEXT_KHR,
        (cl_context_properties) wglGetCurrentContext(), CL_WGL_HDC_KHR,
        (cl_context_properties) wglGetCurrentDC(), CL_CONTEXT_PLATFORM,
        (cl_context_properties) platform_id, 0 };

for (size_t i = 0; i < ret_num_platforms; ++i) {
    platform_id = platform_ids[i];
    cl_device_id curDevices_id[16];

    ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU,
                _countof(curDevices_id), curDevices_id, &ret_num_devices);

    for (cl_uint nDevices = 0; nDevices < ret_num_devices; ++nDevices) {
        cl_device_id curDevice_id = curDevices_id[nDevices];

        clGetGLContextInfoKHR_fn clGetGLContextInfo =
                reinterpret_cast<clGetGLContextInfoKHR_fn> 
                (clGetExtensionFunctionAddressForPlatform(
                            platform_id, "clGetGLContextInfoKHR"));

        if (clGetGLContextInfo) {
            cl_device_id clGLDevice = 0;
            props[5] =
                    reinterpret_cast<cl_context_properties>(platform_id);
            clGetGLContextInfo(props,
                    CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR,
                    sizeof(clGLDevice), &clGLDevice, &n);

            if (DEVICE MATCHING OPENGL ONE) {
                    device_id = clGLDevice;
            }
        }
    }
    if (device_id) {
        break;
    }
}

cl_context context = clCreateContext(props, 1, &device_id, NULL, NULL,
        &ret);

1 Ответ

0 голосов
/ 04 декабря 2018

Используйте одобренное Kronos расширение "cl_khr_gl_sharing".Он будет возвращен для CL_DEVICE_EXTENSIONS с использованием clGetDeviceInfo.

https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/cl_khr_gl_sharing.html

...