Hi,
I’m trying to learn multi-threading programming with C++ and for that I was trying to implement a loader image while some assets are being loaded in an OpenGL scene.
The thing is, that I have only 2 threads: main and a sample one and this simple multi-threading code works fine (at least from the point of view of the CPU). However, my problem is that OpenGL seems not to be rendering whatever I created in the extra thread. For a better explanation of what I am doing I’ll let you see my code here:
- First, the function that will run in a separate thread:
void loadingWork(std::atomic<bool> * signal, GameObjectManager* mngr)
{
mngr->GenerateGameObjects();
(*signal) = true;
}
// The GenerateGameObjects function encapsulates all the procedure of creating VAOs, VBOs, Textures. I mean, it sends all the required data of the models to the GPU.
- Second, the thread creation (located in main, after initializing my window, camera and shaders)
std::atomic<bool> threadFinished = false;
std::thread objectsGenerationThread(loadingWork, &threadFinished , gameobjectManager);
GameObject* loading = gameobjectManager->CreateOneGameObject("UILoading");
renderManager->GetRender2D()->Use();
frameRateController->SetTargetFrameRate(60.0f);
while (!threadFinished )
{
frameRateController->FrameStart();
renderManager->Clear();
loading->GetDefaultShader()->Enable2D();
loading->UpdateAllComponents();
loading->GetDefaultShader()->Disable2D();
SDL_GL_SwapWindow(mainWindow);
frameRateController->FrameEnd();
}
objectsGenerationThread.join();
loading->DestroyAllComponents();
delete loading;
- And that’s it. This is the first time ever I tried multi-threading in an OpenGL program. I am using SDL to create my window and just in case I’ll let you see this code (which is at the very beginning of my main)
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
std::cout << "Failed to init SDL
";
return false;
}
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
mainWindow = SDL_CreateWindow(programName.c_str(),
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
SCREEN_WIDTH,
SCREEN_HEIGHT,
SDL_WINDOW_OPENGL);
if (!mainWindow)
{
std::cout << "Unable to create window
";
CheckSDLError(__LINE__);
return false;
}
mainContext = SDL_GL_CreateContext(mainWindow);
SetOpenGLAttributes();
SDL_GL_SetSwapInterval(1);
glewExperimental = GL_TRUE;
glewInit();
I am afraid that my issue has something to do with the OpenGL contexts, but not sure.
Hope somebody can give me some sight on this. I will appreciate any help!
Have a good one, guys.
MJ