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