From c82371dfcb81d08a9fc49e67b8b5b869e157e9f1 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 5 Jun 2022 16:05:36 +0900 Subject: [PATCH] internal/graphicsdriver/directx: bug fix: disable fullscreen by Alt+Enter By default, DirectX 12 tries to make the window fullscreen by Alt+Enter. This caused application crashes. Let's disable this feature. Closes #2123 --- internal/graphicsdriver/directx/api_windows.go | 11 +++++++++++ internal/graphicsdriver/directx/graphics_windows.go | 7 ++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/internal/graphicsdriver/directx/api_windows.go b/internal/graphicsdriver/directx/api_windows.go index 5f32e7029..93520eba6 100644 --- a/internal/graphicsdriver/directx/api_windows.go +++ b/internal/graphicsdriver/directx/api_windows.go @@ -517,6 +517,9 @@ const ( _DXGI_CREATE_FACTORY_DEBUG = 0x01 _DXGI_ERROR_NOT_FOUND = windows.Errno(0x887A0002) + + _DXGI_MWA_NO_ALT_ENTER = 0x2 + _DXGI_MWA_NO_WINDOW_CHANGES = 0x1 ) var ( @@ -1900,6 +1903,14 @@ func (i *iDXGIFactory4) EnumWarpAdapter() (*iDXGIAdapter1, error) { return ptr, nil } +func (i *iDXGIFactory4) MakeWindowAssociation(windowHandle windows.HWND, flags uint32) error { + r, _, _ := syscall.Syscall(i.vtbl.MakeWindowAssociation, 3, uintptr(unsafe.Pointer(i)), uintptr(windowHandle), uintptr(flags)) + if uint32(r) != uint32(windows.S_OK) { + return fmt.Errorf("directx: IDXGIFactory4::MakeWIndowAssociation failed: HRESULT(%d)", uint32(r)) + } + return nil +} + func (i *iDXGIFactory4) Release() { syscall.Syscall(i.vtbl.Release, 1, uintptr(unsafe.Pointer(i)), 0, 0) } diff --git a/internal/graphicsdriver/directx/graphics_windows.go b/internal/graphicsdriver/directx/graphics_windows.go index 121be4a10..9817061a3 100644 --- a/internal/graphicsdriver/directx/graphics_windows.go +++ b/internal/graphicsdriver/directx/graphics_windows.go @@ -460,7 +460,12 @@ func (g *Graphics) initSwapChain(width, height int) (ferr error) { } }() - // TODO: Call factory.MakeWindowAssociation not to support fullscreen transitions? + // MakeWindowAssociation should be called after swap chain creation. + // https://docs.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgifactory-makewindowassociation + if err := g.factory.MakeWindowAssociation(g.window, _DXGI_MWA_NO_WINDOW_CHANGES | _DXGI_MWA_NO_ALT_ENTER); err != nil { + return err + } + // TODO: Get the current buffer index? if err := g.createRenderTargetViews(); err != nil {