Skip to content

Commit

Permalink
[d3d8] Use D3DPOOL_SCRATCH in CreateImageSurface
Browse files Browse the repository at this point in the history
  • Loading branch information
WinterSnowfall authored and AlpyneDreams committed Jul 7, 2024
1 parent f73a82e commit 5fdd98f
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 3 deletions.
12 changes: 9 additions & 3 deletions src/d3d8/d3d8_device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -434,14 +434,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<d3d9::IDirect3DSurface9> 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);

Expand Down
11 changes: 11 additions & 0 deletions src/d3d8/d3d8_format.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,17 @@ namespace dxvk {
return isDXT(D3DFORMAT(fmt));
}

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;
}

constexpr bool isSupportedDepthStencilFormat(D3DFORMAT fmt) {
// native d3d8 doesn't support D3DFMT_D32, D3DFMT_D15S1 or D3DFMT_D24X4S4
return fmt == D3DFMT_D16_LOCKABLE
Expand Down

0 comments on commit 5fdd98f

Please sign in to comment.