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

210
23 сентября 2018, 22:20

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

вот так всё работает.

READ ALSO
Отправка XML POST запросом на C#

Отправка XML POST запросом на C#

Есть у меня задачкаНеобходимо отправлять и принимать ответы от веб-сервиса

246
VuforiaConfiguration - Webcam - Camera Device

VuforiaConfiguration - Webcam - Camera Device

Доброго времени суток

244
Как работать с ChildRelations в дата сете?

Как работать с ChildRelations в дата сете?

Есть дата сет с кучей ChildRelations связейСвязи называются ТаблицаГлавная_ПотомокГлавной, и так внутрь до 6 вложений

240
Async await в 3-х методах C#

Async await в 3-х методах C#

Мне нужно запустить в консольном приложение 3 асинхронных 3 методаКаждый метод создает бесконечный цикл в котором обрабатывает данные из источника...

253