I have an EXC_BAD_ACCESS
at the last line of this code (this code is fired several times per second), but I cannot figure out what is the problem:
[EAGLContext setCurrentContext:_context];
glActiveTexture(GL_TEXTURE0);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glBindTexture(GL_TEXTURE_2D, _backgroundTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _outputFrame.cols, _outputFrame.rows, 0, GL_BGRA, GL_UNSIGNED_BYTE, _outputFrame.data);
When debugging I make sure that the texture is created (the id is > 0), output frame has a valid pointer to the data and is a 4 channel matrix. I am inside the drawRect
method of a GLKViewController. I think I should not have to bind the framebuffer as it is one of the things that are automated here. It doesn't crash at the first frame, but a few dozens frames later.
Can anybody spot the problem?
UPDATE:
It seems it's because of a race condition on _outputFrame
, it's being updated while being read by glTexImage2D
. I will try to lock it for read, then report back.
That was the solution indeed (see UPDATE), I fixed it with
NSLock
. Firstly I swapped the instance variable_outputFrame
with a temporary one that gets updated from another thread and used the lock to update the instance variable:Then used the lock when I wanted to read from the instance variable:
I just figured out some problem like this after several days.
My solution: