From 0ceccf3c934b45f0a75b1ea660344ad3d3942729 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sat, 29 Feb 2020 12:57:21 +0100 Subject: [PATCH] app/internal/d3d11: try more floating point formats Signed-off-by: Elias Naur --- app/internal/d3d11/backend_windows.go | 36 +++++++++++++++++++-------- app/internal/d3d11/d3d11_windows.go | 2 ++ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/app/internal/d3d11/backend_windows.go b/app/internal/d3d11/backend_windows.go index 77586c21..b04b8c29 100644 --- a/app/internal/d3d11/backend_windows.go +++ b/app/internal/d3d11/backend_windows.go @@ -120,23 +120,37 @@ func NewDevice() (*Device, error) { _IUnknownRelease(unsafe.Pointer(d3dctx), d3dctx.vtbl.Release) return nil, fmt.Errorf("d3d11: feature level too low: %d", featLvl) } - format := uint32(_DXGI_FORMAT_R16_FLOAT) - need := uint32(_D3D11_FORMAT_SUPPORT_TEXTURE2D | _D3D11_FORMAT_SUPPORT_RENDER_TARGET) - if use, _ := d3ddev.CheckFormatSupport(format); use&need == 0 { - // Fall back to a d3d 9.2 format. - format = _DXGI_FORMAT_R32_FLOAT - if use, _ = d3ddev.CheckFormatSupport(format); use&need == 0 { - _IUnknownRelease(unsafe.Pointer(d3ddev), d3ddev.vtbl.Release) - _IUnknownRelease(unsafe.Pointer(d3dctx), d3dctx.vtbl.Release) - return nil, fmt.Errorf("d3d11: no available floating point formats") - } + floatFormat, ok := detectFloatFormat(d3ddev) + if !ok { + _IUnknownRelease(unsafe.Pointer(d3ddev), d3ddev.vtbl.Release) + _IUnknownRelease(unsafe.Pointer(d3dctx), d3dctx.vtbl.Release) + return nil, fmt.Errorf("d3d11: no available floating point formats") } - dev.floatFormat = format + dev.floatFormat = floatFormat dev.depthStates = make(map[depthState]*_ID3D11DepthStencilState) dev.blendStates = make(map[blendState]*_ID3D11BlendState) return dev, nil } +func detectFloatFormat(dev *_ID3D11Device) (uint32, bool) { + formats := []uint32{ + _DXGI_FORMAT_R16_FLOAT, + _DXGI_FORMAT_R32_FLOAT, + _DXGI_FORMAT_R16G16_FLOAT, + _DXGI_FORMAT_R32G32_FLOAT, + // These last two are really wasteful, but c'est la vie. + _DXGI_FORMAT_R16G16B16A16_FLOAT, + _DXGI_FORMAT_R32G32B32A32_FLOAT, + } + for _, format := range formats { + need := uint32(_D3D11_FORMAT_SUPPORT_TEXTURE2D | _D3D11_FORMAT_SUPPORT_RENDER_TARGET) + if support, _ := dev.CheckFormatSupport(format); support&need == need { + return format, true + } + } + return 0, false +} + func (d *Device) CreateSwapChain(hwnd windows.Handle) (*SwapChain, error) { dxgiDev, err := _IUnknownQueryInterface(unsafe.Pointer(d.dev), d.dev.vtbl.QueryInterface, &_IID_IDXGIDevice) if err != nil { diff --git a/app/internal/d3d11/d3d11_windows.go b/app/internal/d3d11/d3d11_windows.go index 0ac17c6d..f84e8f25 100644 --- a/app/internal/d3d11/d3d11_windows.go +++ b/app/internal/d3d11/d3d11_windows.go @@ -567,6 +567,8 @@ const ( _DXGI_FORMAT_R16G16_SINT = 38 _DXGI_FORMAT_R16_UINT = 57 _DXGI_FORMAT_D24_UNORM_S8_UINT = 45 + _DXGI_FORMAT_R16G16_FLOAT = 34 + _DXGI_FORMAT_R16G16B16A16_FLOAT = 10 _D3D11_FORMAT_SUPPORT_TEXTURE2D = 0x20 _D3D11_FORMAT_SUPPORT_RENDER_TARGET = 0x4000