Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#opengl上下文句柄getter返回错误地址_C#_C++_Opengl_Interop_Opencl - Fatal编程技术网

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也可以,甚至可以进行隐式同步,我没有尝试过

[此处的原始问题]

在C#中,opencl gl互操作的上下文构造失败,因为handle getter函数给出了错误的地址并导致
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
}