#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), }; вот так всё работает.
Комментариев нет:
Отправить комментарий