I am using win32 streams with OpenGL 2.1. What I'm trying to achieve is to make a simple image that says βdownloadβ while the entire 3D scene is loading in the background. It works now, but I have a problem when sometimes part of my cubemap texture takes data from Mozilla Firefox browser (how the hell is this happening?), And ignore this little box with the texture, this is just a sprite and this is where it should be : 
This happens as 1 time in 3 times. I am trying to download my program. This is what my stream looks like:
WindowsThread::WindowsThread(HGLRC graphicsContext, HDC deviceContext) : graphicsContext_(graphicsContext), deviceContext_(deviceContext), running_(false), task_(0), mode_(WT_NORMAL) { handle_ = CreateThread(0, 0, (unsigned long (__stdcall *)(void *)) this->staticRun, (void*) this, CREATE_SUSPENDED, &id_); if (handle_ == 0) { LOGE("Unable to create thread."); return; } if (!SetThreadPriority(handle_, THREAD_PRIORITY_NORMAL)) { LOGE("Unable to set thread priority for thread."); return; } } WindowsThread::~WindowsThread() { finishTask(); running_ = false; WaitForSingleObject(handle_, INFINITE); CloseHandle(handle_); wglDeleteContext(graphicsContext_); } void WindowsThread::start() { running_ = true; if (!ResumeThread(handle_)) { LOGW("Unable to resume thread."); } } bool WindowsThread::isRunning() { return running_; } void WindowsThread::setTask(Task* task, Mode mode) { finishTask(); task_ = task; mode_ = mode; } bool WindowsThread::hasTask() { return task_ != 0; } void WindowsThread::finishTask() { while (task_ != 0) { Sleep(1); } } void WindowsThread::stop() { running_ = false; } int WindowsThread::staticRun(void* thread) { return ((WindowsThread*) thread)->run(); } int WindowsThread::run() { wglMakeCurrent(deviceContext_, graphicsContext_); while (running_) { if (task_ != 0) { task_->run(); task_ = 0; } Sleep(10); } wglMakeCurrent(0, 0); return 1; }
ThreadManager:
WindowsThreadManager::WindowsThreadManager( System* system, UINT threadPoolSize) { if (threadPoolSize == 0) { SYSTEM_INFO info; GetSystemInfo(&info); threadPoolSize = info.dwNumberOfProcessors; if (threadPoolSize == 0) { threadPoolSize = 1; } } LOGI("Number of threads used: %d", threadPoolSize); masterContext_ = wglGetCurrentContext(); HDC hdc = wglGetCurrentDC(); for (UINT i = 0; i < threadPoolSize; i++) { HGLRC threadContext = wglCreateContext(hdc); wglShareLists(masterContext_, threadContext); WindowsThread* thread = new WindowsThread(threadContext, hdc); thread->start(); threads_.push_back(thread); } } WindowsThreadManager::~WindowsThreadManager() { for (UINT i = 0; i < threads_.size(); i++) { delete threads_[i]; } for (UINT i = 0; i < tasks_.size(); i++) { delete tasks_[i]; } } void WindowsThreadManager::execute(Task* task, Mode mode) { WindowsThread::Mode wtMode = WindowsThread::WT_NORMAL; if (mode == TM_GRAPHICS_CONTEXT) { wtMode = WindowsThread::WT_GRPAHICS_CONTEXT; } tasks_.push_back(task); for (UINT i = 0; i < threads_.size(); i++) { if (!threads_[i]->hasTask()) { threads_[i]->setTask(task, wtMode); return; } } threads_[0]->setTask(task, wtMode); } void WindowsThreadManager::joinAll() { for (UINT i = 0; i < threads_.size(); i++) { if (threads_[i]->hasTask()) { threads_[i]->finishTask(); } } }
I am using Nvidia 670GTX with the latest drivers on Winodws 8. Any ideas that might cause a problem?
[EDIT] I added glFinish () at the end of my bootloader thread, and now everything loads fine. I'm blushing somewhere that OpenGL doesn't finish all this right away, so I guess it was where the context was set to NULL before it could finish the job.