Страницы

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

воскресенье, 10 марта 2019 г.

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

Мне требуется использовать буферы 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);


Ответ

вообщем ему не хватало одного элемента в массиве.
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),
};
вот так всё работает.

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

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