C#opengl上下文句柄getter返回错误地址
问题解决了C#opengl上下文句柄getter返回错误地址,c#,c++,opengl,interop,opencl,C#,C++,Opengl,Interop,Opencl,问题解决了 从内核字符串中删除了共享的杂注。(使用OpenCL1.2) 重新排序的总账VBO创建和CL上下文创建。首先从gl上下文创建CL上下文。然后创建GL-VBO。然后通过cl获取,然后计算。然后由cl释放,然后由gl绑定。画完成总帐。重新开始。始终使用clFinish以确保它与总账同步。为了提高速度,clflush也可以,甚至可以进行隐式同步,我没有尝试过 [此处的原始问题] 在C#中,opencl gl互操作的上下文构造失败,因为handle getter函数给出了错误的地址并导致
- 从内核字符串中删除了共享的杂注。(使用OpenCL1.2)
- 重新排序的总账VBO创建和CL上下文创建。首先从gl上下文创建CL上下文。然后创建GL-VBO。然后通过cl获取,然后计算。然后由cl释放,然后由gl绑定。画完成总帐。重新开始。始终使用clFinish以确保它与总账同步。为了提高速度,clflush也可以,甚至可以进行隐式同步,我没有尝试过
System.AccessViolationException
C部分:
OpenCL中的P>C++部分(这是在C++ OPENCL的包装类中):
这些地方出了什么问题?当我将“opengl32.dll”更改为“opengl64.dll”时,编译器/链接器找不到它
加载glControl1
后调用wglGetCurrentDC()
和wglGetCurrentContext()
,但这些似乎给出了错误的地址。在这些之前调用wglMakeCurrent()
或glControl1.MakeCurrent()
也不能解决问题
操作系统:64位windows7
主持人:fx8150
设备:HD7870
MSVC2012(windows窗体应用程序)+OpenTK(2010_10_6)+Khronos opencl 1.2头文件
构建目标是x64(版本)
注意:opencl部件在计算(sgemm)方面运行良好,opengl部件在VBO(一些由带有某种颜色和法线的三角形构成的平面)方面绘制良好,但opencl部件(上下文)拒绝互操作
编辑:在内核字符串中添加#pragma OPENCL扩展cl_khr_gl_共享:enable
并不能解决问题
编辑:创建GL VBOs“在”构建cl上下文之后,错误消失,但opencl内核不会更新任何内容。奇怪的另外,当我删除cl_khr_共享pragma时,3D形状开始伪影,这意味着opencl现在正在做一些事情,但它只是随机删除的像素和一些我没有在内核中编写的裁剪区域。魏德尔。你可以在下面的图片中看到这一点(我正试图让蓝色平板消失,但它并没有完全消失,而且我尝试改变颜色,但没有改变)
Edit:CMSoft的opencltemplate看起来像我需要学习/做的,但是他们的示例代码只包含6-7行代码!我不知道把计算内核放在哪里,也不知道从哪里获取/设置初始数据,但是这个例子非常有效(顺便说一句,它给出了数百个“警告!ComputeBuffer{T}(575296656)泄漏”)
编辑:如果您想知道,下面是C++中内核参数的构造:
//v1,v2,v3,v4 are unsigned int taken from `bindbuffer` of GL in C#
//so v1 is buf[0] and v2 is buf[1] and so goes like this
glBuf1=cl::BufferGL(ctx,CL_MEM_READ_WRITE,v1,0);
glBuf2=cl::BufferGL(ctx,CL_MEM_READ_WRITE,v2,0);
glBuf3=cl::BufferGL(ctx,CL_MEM_READ_WRITE,v3,0);
glBuf4=cl::BufferGL(ctx,CL_MEM_READ_WRITE,v4,0);
下面是如何设置为命令队列:
v.clear();
v.push_back(glBuf1);
v.push_back(glBuf2);
v.push_back(glBuf3);
v.push_back(glBuf4);
cq.enqueueAcquireGLObjects(&v,0,0);
cq.finish();
下面是我如何设置内核的参数:
kernel.setArg(0,glBuf1);
kernel.setArg(1,glBuf2);
kernel.setArg(2,glBuf3);
kernel.setArg(3,glBuf3);
以下是如何执行的:
cq.enqueueNDRangeKernel(kernel,referans,Global,Local);
cq.flush();
cq.finish();
以下是发布方式:
cq.enqueueReleaseGLObjects(&v,0,0);
cq.finish();
模拟迭代:
for (int i = 0; i < 200; i++)
{
GL.Finish(); // lets cl take over
//cl acquires buffers in glTest
clh.glTest(gci.buf[0], gci.buf[1], gci.buf[2], gci.buf[3]);// then computes
// then releases
Thread.Sleep(50);
glControl1.MakeCurrent();
glControl1.Invalidate();
gci.ciz(); //draw
}
for(int i=0;i<200;i++)
{
GL.Finish();//让cl接管
//cl在glTest中获取缓冲区
clh.glTest(gci.buf[0],gci.buf[1],gci.buf[2],gci.buf[3]);//然后计算
//然后释放
睡眠(50);
glControl1.MakeCurrent();
glControl1.Invalidate();
gci.ciz();//绘制
}
2个问题:工作目录中是否有“opengl64.dll”?您的包装器类是使用x64指令集构建的吗?@Kirk Backus是使用x64指令集构建的。我找不到opengl32.dll和64版本,它们通常在哪里?。我需要x64,因为我使用超过5-6 GB RAM和使用AVX内核在C++部分。哇!嗯,你可以在你的电脑上搜索它们!它们通常位于C:\Windows\System32
目录中。根据我发布的链接,有一个名为32的64位版本。为您找到这个:好的,解决问题。谢谢你的努力。把答案放在问题的开头。
cq.enqueueReleaseGLObjects(&v,0,0);
cq.finish();
for (int i = 0; i < 200; i++)
{
GL.Finish(); // lets cl take over
//cl acquires buffers in glTest
clh.glTest(gci.buf[0], gci.buf[1], gci.buf[2], gci.buf[3]);// then computes
// then releases
Thread.Sleep(50);
glControl1.MakeCurrent();
glControl1.Invalidate();
gci.ciz(); //draw
}