Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Использование буферов OpenGL в OpenCL - ошибка “InvalidContext”

#c_sharp #opengl #opencl


Мне требуется использовать буферы OpenGL в OpenCL.
при использовании метода clCreateFromGLBuffer выдаёт ошибку InvalidContext.
я где то прочитал что нужно добавить свойства при создании контекста OpenCl 

ContextProperty[] contextProperties = new[]
{
     new ContextProperty(ContextProperties.CL_GL_CONTEXT_KHR, Win32.wglGetCurrentContext()),
     new ContextProperty(ContextProperties.CL_WGL_HDC_KHR,Win32.GetDC(Process.GetCurrentProcess().MainWindowHandle)),
     new ContextProperty(ContextProperties.CL_CONTEXT_PLATFORM,_platform.handle), 
}


я добавил но появилась ошибка при создании контекста


  System.AccessViolationException: Попытка чтения или записи в защищенную память.
Это часто свидетельствует о том, что другая память повреждена.


Также, констант CL_GL_CONTEXT_KHR и CL_WGL_HDC_KHR не было в библиотеке которую я
скачал в NuGet значения констант я нашёл на на этом сайте

Как это исправить?

полный код

Glfw.Init();
window = Glfw.CreateWindow(500, 500, "");
Glfw.MakeContextCurrent(window);
OpenGL gl = new OpenGL();

Platform[] platforms = Cl.GetPlatformIDs(out errorCode);
foreach (Platform platform in platforms)
{
     Device[] devices = Cl.GetDeviceIDs(platform, DeviceType.Gpu, out errorCode);

     if (devices.Length == 0)
     {
          continue;
     }

     _platform = platform;
     _device = devices[0];
     break;
}
ContextProperty[] contextProperties = new[]
{
     new ContextProperty(ContextProperties.CL_GL_CONTEXT_KHR, Win32.wglGetCurrentContext()),
            new ContextProperty(ContextProperties.CL_WGL_HDC_KHR,Win32.GetDC(window.Ptr)),
            new ContextProperty(ContextProperties.CL_CONTEXT_PLATFORM,_platform.handle), 

};
_context = Cl.CreateContext(contextProperties, 1, new Device[] {_device}, null, IntPtr.Zero,
out errorCode);

    


Ответы

Ответ 1



вообщем ему не хватало одного элемента в массиве. ContextProperty[] contextProperties = new[] { new ContextProperty(ContextProperties.CL_GL_CONTEXT_KHR, wglGetCurrentContext()), new ContextProperty(ContextProperties.CL_WGL_HDC_KHR,wglGetCurrentDC()), new ContextProperty(ContextProperties.CL_CONTEXT_PLATFORM,_platform.handle), new ContextProperty(0,IntPtr.Zero), }; вот так всё работает.

Комментариев нет:

Отправить комментарий