diff --git a/src/d3d8/d3d8_device.cpp b/src/d3d8/d3d8_device.cpp index c3ad1396558..8b4e4547f93 100644 --- a/src/d3d8/d3d8_device.cpp +++ b/src/d3d8/d3d8_device.cpp @@ -435,15 +435,20 @@ namespace dxvk { return res; } - HRESULT STDMETHODCALLTYPE D3D8Device::CreateImageSurface(UINT Width, UINT Height, D3DFORMAT Format, IDirect3DSurface8** ppSurface) { + HRESULT STDMETHODCALLTYPE D3D8Device::CreateImageSurface( + UINT Width, + UINT Height, + D3DFORMAT Format, + IDirect3DSurface8** ppSurface) { + // FIXME: Handle D3DPOOL_SCRATCH in CopyRects + D3DPOOL pool = isUnsupportedSurfaceFormat(Format) ? D3DPOOL_SCRATCH : D3DPOOL_SYSTEMMEM; Com pSurf = nullptr; HRESULT res = GetD3D9()->CreateOffscreenPlainSurface( Width, Height, d3d9::D3DFORMAT(Format), - // FIXME: D3DPOOL_SCRATCH is said to be dx8 compatible, but currently won't work with CopyRects - d3d9::D3DPOOL_SYSTEMMEM, + d3d9::D3DPOOL(pool), &pSurf, NULL); diff --git a/src/d3d8/d3d8_format.h b/src/d3d8/d3d8_format.h index 6bc2c8b487a..b7525b6ff51 100644 --- a/src/d3d8/d3d8_format.h +++ b/src/d3d8/d3d8_format.h @@ -15,6 +15,17 @@ namespace dxvk { return isDXT(D3DFORMAT(fmt)); } + inline constexpr bool isUnsupportedSurfaceFormat(D3DFORMAT fmt) { + // mirror what dxvk doesn't support in terms of d3d9 surface formats + return fmt == D3DFMT_R8G8B8 + || fmt == D3DFMT_R3G3B2 + || fmt == D3DFMT_A8R3G3B2 + || fmt == D3DFMT_A8P8 + || fmt == D3DFMT_P8; + // not included in the d3d8 spec + //|| fmt == D3DFMT_CXV8U8; + } + inline constexpr bool isSupportedDepthStencilFormat(D3DFORMAT fmt) { // native d3d8 doesn't support D3DFMT_D32, D3DFMT_D15S1 or D3DFMT_D24X4S4 return fmt == D3DFMT_D16_LOCKABLE