Hi,
Using R9 290X with Catalyst 14.12 on Windows 8.1 I'm trying to use OpenCL for TressFX simulation :
YAGF/tfx-ocl.cpp at master · vlj/YAGF · GitHub
The relevant part of the code is :
int err = CL_SUCCESS;
cl_event ev = 0;
if (syncFirstPassRenderComplete);
ev = clCreateEventFromGLsyncKHRCustom(context, syncFirstPassRenderComplete, &err);
// First pass is done so sim is done too, can safely upload
err = clEnqueueWriteBuffer(queue, ConstantSimBuffer, CL_FALSE, 0, sizeof(struct SimulationConstants), &cbuf, 0, 0, 0);
err = clEnqueueAcquireGLObjects(queue, 1, &PosBuffer, 0, 0, 0);
err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &PosBuffer);
err = clSetKernelArg(kernel, 1, sizeof(cl_mem), &PreviousPos);
err = clSetKernelArg(kernel, 2, sizeof(cl_mem), &StrandType);
err = clSetKernelArg(kernel, 3, sizeof(cl_mem), &InitialPos);
err = clSetKernelArg(kernel, 4, sizeof(cl_mem), &ConstantSimBuffer);
size_t local_wg = 64;
size_t global_wg = .5 * tfxassets.m_NumTotalHairVertices;
err = clEnqueueNDRangeKernel(queue, kernel, 1, 0, &global_wg, &local_wg, 0, 0, 0);
err = clEnqueueReleaseGLObjects(queue, 1, &PosBuffer, 0, 0, 0);
clFinish(queue);
if (syncFirstPassRenderComplete);
{
glDeleteSync(syncFirstPassRenderComplete);
clReleaseEvent(ev);
}
return;
I'm attempting to use explicit sync between cl and GL using clCreateEventFromGLsyncKHR by replacing
err = clEnqueueWriteBuffer(queue, ConstantSimBuffer, CL_FALSE, 0, sizeof(struct SimulationConstants), &cbuf, 0, 0, 0);
by
if (ev)
err = clEnqueueWriteBuffer(queue, ConstantSimBuffer, CL_FALSE, 0, sizeof(struct SimulationConstants), &cbuf, 1, &ev, 0);
else
err = clEnqueueWriteBuffer(queue, ConstantSimBuffer, CL_FALSE, 0, sizeof(struct SimulationConstants), &cbuf, 0, 0, 0);
ie I'm adding a sync between last GL command that uses PosBuffer and before first opencl command so that some opencl upload/kernel can be executed while the second OpenGL fragment shader is in flight.
It works however after a couple of frame there is a crash in atigktxx.dll (Access violation reading location 0xFEEEFEEE.). I get no OpenCL or OpenGL error.
I'm not sure what's happening since I delete sync and clean cl_event after cl_finish. I tested with an event generated from an opencl call each frame and it works, I suspect the issue only happens with cl_event generated from GL sync object.
With luck, one of the engineers can take a look at this next week. We have it on the radar. Just making sure everyone knows, silence != we're ignoring you.
We can't get to everything, and some of what we can cover it takes time to find a slot in the workflow to get to the issue. Which is why there's a community! And I'll take the opportunity to thank everyone who helps out, because, like you all, the AMD engineers have real jobs too.
Thanks for the feedback.
Some additional information :
With Catalyst 15.3 the issue still appears, but if I run it with CodeXL debugger I don't have crash. However "output" console in VS 2013 get spammed with :
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #3)
CodeXL - OpenGL Render Context 4 Created
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #4)
CodeXL - OpenGL Render Context 5 Created
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #5)
CodeXL - OpenGL Render Context 6 Created
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #6)
CodeXL - OpenGL Render Context 7 Created
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #7)
CodeXL - OpenGL Render Context 8 Created
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #8)
CodeXL - OpenGL Render Context 9 Created
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #9)
CodeXL - OpenGL Render Context 10 Created
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #10)
CodeXL - OpenGL Render Context 11 Created
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #11)
CodeXL - OpenGL Render Context 12 Created
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #12)
CodeXL - OpenGL Render Context 13 Created
CodeXL - Debug String: CodeXL warning: The debugged process asked for an extension function pointer (glClientWaitSync) from one render context, but called this function pointer in another render context (context #13)
CodeXL - OpenGL Render Context 14 Created
Does your application create multiple OpenGL contexts? Are you using a toolkit to set up OpenGL or is it your own code?
Thanks,
Graham
I'm using glfw3 to create the Windows context. Since I create a GL 4.3 context I think it creates a fake context to get a pointer to wglCreateContextAttribsARB.
I use GLEW too.