Sign in to follow this  
Jamoflaw

OpenGL glfw - Toggle Fullscreen to Windowed to Fullscreen

Recommended Posts

Jamoflaw    159

Does anyone know how to toggle fullscreen to windowed in GLFW? I understand that the context is lost during the transition as you have to use glfwCreateWindow, however I have passed the original context as a parameter to that method which I was under the impression shared the context resources?

 

I then destroy the old window and mark the new context as current

	// With GLFW we have to create a new window and destroy the old after making sure we enable the new context
	GLFWwindow* tempWindowPtr = glfwCreateWindow(
										this->renderWindow_Width,
										this->renderWindow_Height, 
										this->renderWindow_Title.c_str(), 
										this->renderWindow_Fullscreen ? this->renderWindow_DisplayMonitor : NULL,
										this->renderWindow_hWnd);
	
	if(!tempWindowPtr)
	{
		GLogManager::GetSingleton().WriteLine("Error setting new display settings.", GLogManager::Error);
		this->shouldApplyNewSettings = false;
		return GR_FAILURE;
	}

	glfwDestroyWindow(this->renderWindow_hWnd);	// destroy the old window
	this->renderWindow_hWnd = tempWindowPtr;	// swap the pointers

	glfwMakeContextCurrent(this->renderWindow_hWnd);

I then proceed to recreate my callbacks as I understand the glfw state as well as the OpenGL state is lost, but as I understood it the resources, ie textures, shaders etc won't need to be recreated?? However it seems that I just get a black screen when running the above. Running the output through gDebugger i get:

 

Debug String: Detected error: The debugged process asked for an extension function pointer (glActiveTexture) from one render context, but called this function pointer in another render context (context #2) 

 

 
which suggests the context sharing isn't what I thought it was!!!....... anyone able to point me in the right direction here?
 
thanks 
Jamoflaw

 

Share this post


Link to post
Share on other sites
Waterlimon    4398

Internally glfw uses wglShareLists on windows probably.

 

This is what gl site says about it:

https://www.opengl.org/wiki/Platform_specifics:_Windows#wglShareLists

 

This means, while 'actual' resources will be shared (buffers, textures...), some other objects will not (such as VAOs) since they simply reference the actual resources, but dont really contain much data themselves.

 

I dont know if shaders/programs are shared, probably not (since theyre not mentioned there).

 

 

As for that error, did you reinitialize GLEW or whatever you are using to fetch the gl functions?

Share this post


Link to post
Share on other sites
Jamoflaw    159

I didn't initially, but I did try it and got the same result.

 

 

I just added the line:

glewInit()

Straight after the last line posted above? I believe that is correct (I'm quite new to OpenGL) Got the same results though. Would I need to repopulate all the VAO's? I previously used DirectX9 so used to have a procedure for device resets which I dropped as I thought OpenGL didn't behave that way! Doh!

 

Are the VBO's still valid at that point? Would it just be a case of reinitialising teh VAOs with relevant VBOs?

Share this post


Link to post
Share on other sites
Waterlimon    4398

Do you mean you still get that same error? Or you no longer get that error but it still doesnt work?

 

VBOs should be valid. I think you need to recreate VAOs using the same buffers.

 

EDIT:

looking at my own window creation, I only destroy the old window at the end (after making new context current), maybe try that.

(which is what your comment seems to say but you do the reverse...)

Edited by Waterlimon

Share this post


Link to post
Share on other sites
Jamoflaw    159

Ah thanks it's working now, was a case of just re-creating the VAOs. 

 

Now Looks like:

// With GLFW we have to create a new window and destroy the old after making sure we enable the new context
	GLFWwindow* newWindowPtr = glfwCreateWindow(
										this->renderWindow_Width,
										this->renderWindow_Height, 
										this->renderWindow_Title.c_str(), 
										this->renderWindow_Fullscreen ? this->renderWindow_DisplayMonitor : NULL,
										this->renderWindow_hWnd);
	
	if(!newWindowPtr)
	{
		GLogManager::GetSingleton().WriteLine("Error setting new display settings.", GLogManager::Error);
		this->shouldApplyNewSettings = false;
		return GR_FAILURE;
	}

	GLFWwindow* origWindowPtr = this->renderWindow_hWnd;
	this->renderWindow_hWnd = newWindowPtr;	// swap the pointers

	glfwMakeContextCurrent(this->renderWindow_hWnd);
	glfwDestroyWindow(origWindowPtr);	// destroy the old window
	
	// Setup callbacks
	this->SetupRenderWindowCallbacks();
	this->SetupInputKeyboardCallbacks();
	this->SetupInputMouseCallbacks();
	glfwSetErrorCallback(&Root::OnError);


	// VAO Reset goes here...

I've changed the ordering of the delete/make current as it seems more logical this way, though it doesn't seem to make any difference and works the way it was originally! The shaders and textures all seem to work, is there any other object type which doesn't get carried or is it really just the VAOs which require the DX style reset?

Share this post


Link to post
Share on other sites
Waterlimon    4398

IIRC glfw attempts to share as much as it can, so considering that, I would recreate anything that is easy to.

 

Based on the opengl site link, I would say only vbos, textures, and renderbuffers are shared... so everything else needs recreation?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Similar Content

    • By cebugdev
      hi all,

      i am trying to build an OpenGL 2D GUI system, (yeah yeah, i know i should not be re inventing the wheel, but this is for educational and some other purpose only),
      i have built GUI system before using 2D systems such as that of HTML/JS canvas, but in 2D system, i can directly match a mouse coordinates to the actual graphic coordinates with additional computation for screen size/ratio/scale ofcourse.
      now i want to port it to OpenGL, i know that to render a 2D object in OpenGL we specify coordiantes in Clip space or use the orthographic projection, now heres what i need help about.
      1. what is the right way of rendering the GUI? is it thru drawing in clip space or switching to ortho projection?
      2. from screen coordinates (top left is 0,0 nd bottom right is width height), how can i map the mouse coordinates to OpenGL 2D so that mouse events such as button click works? In consideration ofcourse to the current screen/size dimension.
      3. when let say if the screen size/dimension is different, how to handle this? in my previous javascript 2D engine using canvas, i just have my working coordinates and then just perform the bitblk or copying my working canvas to screen canvas and scale the mouse coordinates from there, in OpenGL how to work on a multiple screen sizes (more like an OpenGL ES question).
      lastly, if you guys know any books, resources, links or tutorials that handle or discuss this, i found one with marekknows opengl game engine website but its not free,
      Just let me know. Did not have any luck finding resource in google for writing our own OpenGL GUI framework.
      IF there are no any available online, just let me know, what things do i need to look into for OpenGL and i will study them one by one to make it work.
      thank you, and looking forward to positive replies.
    • By fllwr0491
      I have a few beginner questions about tesselation that I really have no clue.
      The opengl wiki doesn't seem to talk anything about the details.
       
      What is the relationship between TCS layout out and TES layout in?
      How does the tesselator know how control points are organized?
          e.g. If TES input requests triangles, but TCS can output N vertices.
             What happens in this case?
      In this article,
      http://www.informit.com/articles/article.aspx?p=2120983
      the isoline example TCS out=4, but TES in=isoline.
      And gl_TessCoord is only a single one.
      So which ones are the control points?
      How are tesselator building primitives?
    • By Orella
      I've been developing a 2D Engine using SFML + ImGui.
      Here you can see an image
      The editor is rendered using ImGui and the scene window is a sf::RenderTexture where I draw the GameObjects and then is converted to ImGui::Image to render it in the editor.
      Now I need to create a 3D Engine during this year in my Bachelor Degree but using SDL2 + ImGui and I want to recreate what I did with the 2D Engine. 
      I've managed to render the editor like I did in the 2D Engine using this example that comes with ImGui. 
      3D Editor preview
      But I don't know how to create an equivalent of sf::RenderTexture in SDL2, so I can draw the 3D scene there and convert it to ImGui::Image to show it in the editor.
      If you can provide code will be better. And if you want me to provide any specific code tell me.
      Thanks!
    • By Picpenguin
      Hi
      I'm new to learning OpenGL and still learning C. I'm using SDL2, glew, OpenGL 3.3, linmath and stb_image.
      I started following through learnopengl.com and got through it until I had to load models. The problem is, it uses Assimp for loading models. Assimp is C++ and uses things I don't want in my program (boost for example) and C support doesn't seem that good.
      Things like glVertexAttribPointer and shaders are still confusing to me, but I have to start somewhere right?
      I can't seem to find any good loading/rendering tutorials or source code that is simple to use and easy to understand.
      I have tried this for over a week by myself, searching for solutions but so far no luck. With tinyobjloader-c and project that uses it, FantasyGolfSimulator, I was able to actually load the model with plain color (always the same color no matter what I do) on screen and move it around, but cannot figure out how to use textures or use its multiple textures with it.
      I don't ask much: I just want to load models with textures in them, maybe have lights affect them (directional spotlight etc). Also, some models have multiple parts and multiple textures in them, how can I handle those?
      Are there solutions anywhere?
      Thank you for your time. Sorry if this is a bit confusing, English isn't my native language
    • By dpadam450
      FINALLY, upgrading my engine to openGL 4. I was having some trouble so I started with a stripped down application and was wondering if VAO's are required, because I have a sample working, but if I remove the VAO then it doesn't seem to like drawing my triangle.
  • Popular Now