Loading an OpenGL Resource into a Second Stream

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 : enter image description here

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.

+6
source share
1 answer

Now it works, but I have a problem when sometimes part of my cubemap texture takes data from Mozilla Firefox (how the hell is this happening?)

Your texture receives data from uninitialized graphics memory, which is likely to contain residual images from another process that previously used this memory area. Such things can happen if

a) the driver has an error and does not synchronize resources between threads

and

b) if you are trying to change a texture while it is bound to a texture block in another thread.

EDIT: you can (and should) enter the correct synchronization yourself. Just because it improves performance. Use condition variables to communicate between threads when the texture is not currently busy. Ideally, you use two or more textures that you update using cyclic mode.

+7
source

All Articles