From: Paul Gofman Subject: Re: [PATCH] wined3d: Avoid crash in swapchain_gl_present() if context could not be acquired. Message-Id: <15e38ef6-f114-0d16-f06b-bbbeb5912456@gmail.com> Date: Thu, 14 Nov 2019 19:34:58 +0300 In-Reply-To: References: <20191113151515.1455279-1-gofmanp@gmail.com> <725e09c0-1bdc-faaa-8eef-2400934fe57c@gmail.com> <217818f9-a056-424d-2bf8-ed187ea9c872@gmail.com> <127d5806-b0a1-6945-1a01-ba55b0568ffb@gmail.com> <9712e0c2-88fb-4cc9-4695-c2d759823513@gmail.com> On 11/14/19 18:23, Henri Verbeet wrote: > >> But the application is trying to present a swapchain into the window it >> specified, the resource is onscreen (if we imagine that it is going to >> draw something in some other case with a visible window, as here the >> window is 1x1 and invisible). Does it make sense if we create another >> invisible window instead and present something to the drawable obtained >> from it? >> > Somewhat, in the sense that it gives us the option of using e.g. > (gdi32) BitBlt() to still get the contents into the target window, if > we really needed to. > > That isn't entirely the point though. Part of the issue is that the > behaviour for creating a new context should be consistent with the > behaviour for reusing an existing one. Another part is that for better > or worse, the model we currently have is that provided OpenGL works at > all, context_acquire() isn't supposed to fail. It may make sense to > rethink that, but we have a lot more context_acquire() calls besides > the one in swapchain_gl_present(). > > The background is that the target window can go away at any given > point, and D3D is supposed to keep working when that happens. Modern > versions of OpenGL/GLX can make a context current without a drawable, > but originally the drawable was required. Provided FBOs are available > current wined3d always renders offscreen and only needs an onscreen > context for Present(), but in the past that was not the case either. > (I.e., think Opengl 1.x or 2.x and "backbuffer" ORM.) Thanks for the explanation, I see now. So I will make wined3d_context_gl_init() create backup context as well if it fails to set pixel format (and maybe as well if wglCreateContext() fails?).