You need to do two things.
First, you must provide synchronization and visibility for the operation that generates this data. If you use compute shader to generate data in SSBO, a buffer texture, or something else, then you will need to use glMemoryBarrier , with the set GL_PIXEL_BUFFER_BARRIER_BIT . If you generate this data using a render operation in a buffer texture, then you do not need an explicit barrier. But if FS writes to SSBO or through image loading / saving, you still need an explicit barrier, as described above.
If you are using OpenCL, you will have to use the OpenCL OpenGL interaction function to make the CL result visible to GL.
After that, you simply use the buffer as a buffer to decompress the pixels, as with any asynchronous pixel transfer operation. Compressed textures work with GL_PIXEL_UNPACK_BUFFER in the same way as uncompressed textures.
Remember: in OpenGL, all buffer objects are the same. OpenGL doesn't care if you use the buffer as an SSBO in one minute, and then use it to transfer pixels next. As long as you synchronize it, everything is in order.
source share