Thank you for being exactly on point, it turns out I was using a frivolous interpretation of "change" rather than the one specified in OpenGL ES. The bug can safely be closed as invalid, as fence is necessary in this case. One thing that is curious to me still, is whether sampling the texture in the second thread should yield (0,0,0), since the texture change has not completed yet, and associated texture object is thus incomplete.