Reviewed texture formats

This commit is contained in:
patrickvl 2021-06-13 23:05:52 +02:00 committed by PatrickvL
parent 9baea76494
commit f2529e8cb7
2 changed files with 83 additions and 64 deletions

View File

@ -5826,7 +5826,7 @@ void CreateHostResource(xbox::X_D3DResource *pResource, DWORD D3DUsage, int iTex
if (D3DUsage & D3DUSAGE_DEPTHSTENCIL) {
// If it was a depth stencil, fall back to a known supported depth format
EmuLog(LOG_LEVEL::WARNING, "Xbox %s Format %x will be converted to D3DFMT_D24S8", ResourceTypeName, X_Format);
PCFormat = D3DFMT_D24S8;
PCFormat = _9_11(D3DFMT_D24S8, DXGI_FORMAT_D24_UNORM_S8_UINT);
} else if (EmuXBFormatCanBeConvertedToARGB(X_Format)) {
EmuLog(LOG_LEVEL::WARNING, "Xbox %s Format %x will be converted to ARGB", ResourceTypeName, X_Format);
bConvertToARGB = true;
@ -5916,6 +5916,23 @@ void CreateHostResource(xbox::X_D3DResource *pResource, DWORD D3DUsage, int iTex
// Create the surface/volume/(volume/cube/)texture
switch (XboxResourceType) {
case xbox::X_D3DRTYPE_SURFACE: {
#ifdef CXBX_USE_D3D11
D3D11_TEXTURE2D_DESC desc;
desc.Width = hostWidth;
desc.Height = hostHeight;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = PCFormat;
desc.SampleDesc.Count = 1; // TODO : Use g_EmuCDPD.HostPresentationParameters.MultiSampleType ?
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | (D3DUsage & D3DUSAGE_DEPTHSTENCIL) ? D3D11_BIND_DEPTH_STENCIL : 0;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
hRet = g_pD3DDevice->CreateTexture2D(&desc, NULL, &pNewHostResource);
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->CreateTexture2D");
#else
if (D3DUsage & D3DUSAGE_DEPTHSTENCIL) {
hRet = g_pD3DDevice->CreateDepthStencilSurface(hostWidth, hostHeight, PCFormat,
g_EmuCDPD.HostPresentationParameters.MultiSampleType,
@ -5960,7 +5977,7 @@ void CreateHostResource(xbox::X_D3DResource *pResource, DWORD D3DUsage, int iTex
EmuLog(LOG_LEVEL::WARNING, "Trying Fallback");
hRet = g_pD3DDevice->CreateOffscreenPlainSurface(hostWidth, hostHeight, PCFormat, D3DPool, pNewHostSurface.GetAddressOf(), nullptr);
}
#endif
// If the fallback failed, show an error and exit execution.
if (hRet != D3D_OK) {
// We cannot safely continue in this state.
@ -5968,7 +5985,7 @@ void CreateHostResource(xbox::X_D3DResource *pResource, DWORD D3DUsage, int iTex
DXGetErrorString(hRet), DXGetErrorDescription(hRet));
}
SetHostSurface(pResource, pNewHostSurface.Get(), iTextureStage);
SetHostSurface(pResource, _9_11(pNewHostSurface, pNewHostResource).Get(), iTextureStage);
EmuLog(LOG_LEVEL::DEBUG, "CreateHostResource : Successfully created %s (0x%.08X, 0x%.08X)",
ResourceTypeName, pResource, pNewHostSurface.Get());
EmuLog(LOG_LEVEL::DEBUG, "CreateHostResource : Width : %d, Height : %d, Format : %d",
@ -5983,7 +6000,7 @@ void CreateHostResource(xbox::X_D3DResource *pResource, DWORD D3DUsage, int iTex
// So, we need to do this differently - we need to step up to the containing VolumeTexture,
// and retrieve and convert all of it's GetVolumeLevel() slices.
pNewHostVolume = nullptr;
// SetHostVolume(pResource, pNewHostVolume, iTextureStage);
// SetHostVolume(pResource, _9_11(pNewHostVolume, pNewHostResource), iTextureStage);
// EmuLog(LOG_LEVEL::DEBUG, "CreateHostResource : Successfully created %s (0x%.08X, 0x%.08X)",
// ResourceTypeName, pResource, pNewHostVolume);
break;
@ -6049,9 +6066,9 @@ void CreateHostResource(xbox::X_D3DResource *pResource, DWORD D3DUsage, int iTex
}
#endif
SetHostTexture(pResource, pNewHostTexture.Get(), iTextureStage);
SetHostTexture(pResource, _9_11(pNewHostTexture, pNewHostResource).Get(), iTextureStage);
EmuLog(LOG_LEVEL::DEBUG, "CreateHostResource : Successfully created %s (0x%.08X, 0x%.08X)",
ResourceTypeName, pResource, pNewHostTexture.Get());
ResourceTypeName, pResource, _9_11(pNewHostTexture, pNewHostResource).Get());
break;
}
@ -6091,7 +6108,7 @@ void CreateHostResource(xbox::X_D3DResource *pResource, DWORD D3DUsage, int iTex
}
#endif
SetHostVolumeTexture(pResource, pNewHostVolumeTexture.Get(), iTextureStage);
SetHostVolumeTexture(pResource, _9_11(pNewHostVolumeTexture, pNewHostResource).Get(), iTextureStage);
EmuLog(LOG_LEVEL::DEBUG, "CreateHostResource : Successfully created %s (0x%.08X, 0x%.08X)",
ResourceTypeName, pResource, pNewHostVolumeTexture.Get());
break;
@ -6138,7 +6155,7 @@ void CreateHostResource(xbox::X_D3DResource *pResource, DWORD D3DUsage, int iTex
DXGetErrorString(hRet), DXGetErrorDescription(hRet)*/);
}
SetHostCubeTexture(pResource, pNewHostCubeTexture.Get(), iTextureStage);
SetHostCubeTexture(pResource, _9_11(pNewHostCubeTexture, pNewHostResource).Get(), iTextureStage);
// TODO : Cube face surfaces can be used as a render-target,
// so we need to associate host surfaces to each surface of this cube texture
// However, we can't do it here: On Xbox, a new Surface is created on every call to
@ -6194,14 +6211,15 @@ void CreateHostResource(xbox::X_D3DResource *pResource, DWORD D3DUsage, int iTex
DWORD mip2dSize = dwMipRowPitch * numRows; // the size of one layer of the mip slice
DWORD mipSlicePitch = mip2dSize * pxMipDepth; // the total size of the mip slice (depth is only > 1 for volume textures)
// Lock the host resource
#ifdef CXBX_USE_D3D11
// Map the host resource
UINT Subresource = (face * dwMipMapLevels) + mipmap_level;
// See https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-subresources
D3D11_MAPPED_SUBRESOURCE MappedResource;
hRet = g_pD3DDeviceContext->Map(pNewHostResource, Subresource, D3D11_MAP_WRITE_DISCARD, D3D11_MAP_FLAG_DO_NOT_WAIT, &MappedResource);
#else
// Lock the host resource
D3DLOCKED_RECT LockedRect = {};
D3DLOCKED_BOX LockedBox = {};
DWORD D3DLockFlags = D3DLOCK_NOSYSLOCK;
@ -6313,10 +6331,11 @@ void CreateHostResource(xbox::X_D3DResource *pResource, DWORD D3DUsage, int iTex
}
}
// Unlock the host resource
#ifdef CXBX_USE_D3D11
// Unmap the host resource
g_pD3DDeviceContext->Unmap(pNewHostResource, Subresource);
#else
// Unlock the host resource
switch (XboxResourceType) {
case xbox::X_D3DRTYPE_SURFACE:
hRet = pNewHostSurface->UnlockRect();

View File

@ -878,72 +878,72 @@ static const FormatInfo FormatInfos[] = {
// D3D9 D3FFORMAT to D3D11 DXGI_FORMAT mapping : https://docs.microsoft.com/en-us/windows/win32/direct3d10/d3d10-graphics-programming-guide-resources-legacy-formats
#define DXGI_FORMAT_NOT_AVAILABLE DXGI_FORMAT_UNKNOWN // TODO : Replace below occurences with a suitable format and corresponding conversion
/* 0x00 X_D3DFMT_L8 */ { 8, Swzzld, ______L8, _9_11(D3DFMT_L8, DXGI_FORMAT_R8_UNORM) },
/* 0x01 X_D3DFMT_AL8 */ { 8, Swzzld, _____AL8, _9_11(D3DFMT_L8, DXGI_FORMAT_R8_UNORM) , Texture, "X_D3DFMT_AL8 -> D3DFMT_L8" },
/* 0x02 X_D3DFMT_A1R5G5B5 */ { 16, Swzzld, A1R5G5B5, _9_11(D3DFMT_A1R5G5B5, DXGI_FORMAT_B5G5R5A1_UNORM)},
/* 0x03 X_D3DFMT_X1R5G5B5 */ { 16, Swzzld, X1R5G5B5, _9_11(D3DFMT_X1R5G5B5, DXGI_FORMAT_NOT_AVAILABLE) , RenderTarget },
/* 0x04 X_D3DFMT_A4R4G4B4 */ { 16, Swzzld, A4R4G4B4, _9_11(D3DFMT_A4R4G4B4, DXGI_FORMAT_B4G4R4A4_UNORM)},
/* 0x05 X_D3DFMT_R5G6B5 */ { 16, Swzzld, __R5G6B5, _9_11(D3DFMT_R5G6B5, DXGI_FORMAT_B5G6R5_UNORM) , RenderTarget },
/* 0x06 X_D3DFMT_A8R8G8B8 */ { 32, Swzzld, A8R8G8B8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM), RenderTarget },
/* 0x07 X_D3DFMT_X8R8G8B8 */ { 32, Swzzld, X8R8G8B8, _9_11(D3DFMT_X8R8G8B8, DXGI_FORMAT_B8G8R8X8_UNORM), RenderTarget }, // Alias : X_D3DFMT_X8L8V8U8
/* 0x00 X_D3DFMT_L8 */ { 8, Swzzld, ______L8, _9_11(D3DFMT_L8, DXGI_FORMAT_R8_UNORM) },
/* 0x01 X_D3DFMT_AL8 */ { 8, Swzzld, _____AL8, _9_11(D3DFMT_L8, DXGI_FORMAT_R8_UNORM) , Texture, "X_D3DFMT_AL8 -> D3DFMT_L8" },
/* 0x02 X_D3DFMT_A1R5G5B5 */ { 16, Swzzld, A1R5G5B5, _9_11(D3DFMT_A1R5G5B5, DXGI_FORMAT_B5G5R5A1_UNORM) },
/* 0x03 X_D3DFMT_X1R5G5B5 */ { 16, Swzzld, X1R5G5B5, _9_11(D3DFMT_X1R5G5B5, DXGI_FORMAT_B5G5R5A1_UNORM) , RenderTarget }, // D3D11 TODO : Default A in shader
/* 0x04 X_D3DFMT_A4R4G4B4 */ { 16, Swzzld, A4R4G4B4, _9_11(D3DFMT_A4R4G4B4, DXGI_FORMAT_B4G4R4A4_UNORM) },
/* 0x05 X_D3DFMT_R5G6B5 */ { 16, Swzzld, __R5G6B5, _9_11(D3DFMT_R5G6B5, DXGI_FORMAT_B5G6R5_UNORM) , RenderTarget },
/* 0x06 X_D3DFMT_A8R8G8B8 */ { 32, Swzzld, A8R8G8B8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM) , RenderTarget },
/* 0x07 X_D3DFMT_X8R8G8B8 */ { 32, Swzzld, X8R8G8B8, _9_11(D3DFMT_X8R8G8B8, DXGI_FORMAT_B8G8R8X8_UNORM) , RenderTarget }, // Alias : X_D3DFMT_X8L8V8U8
/* 0x08 undefined */ {},
/* 0x09 undefined */ {},
/* 0x0A undefined */ {},
/* 0x0B X_D3DFMT_P8 */ { 8, Swzzld, ______P8, _9_11(D3DFMT_P8, DXGI_FORMAT_R8_UINT) , Texture, "X_D3DFMT_P8 -> D3DFMT_L8" }, // 8-bit palletized
/* 0x0C X_D3DFMT_DXT1 */ { 4, Cmprsd, ____DXT1, _9_11(D3DFMT_DXT1, DXGI_FORMAT_BC1_UNORM) }, // opaque/one-bit alpha // NOTE : DXT1 is half byte per pixel, so divide Size and Pitch calculations by two!
/* 0x0B X_D3DFMT_P8 */ { 8, Swzzld, ______P8, _9_11(D3DFMT_P8, DXGI_FORMAT_R8_UINT) , Texture, "X_D3DFMT_P8 -> D3DFMT_L8" }, // 8-bit palletized
/* 0x0C X_D3DFMT_DXT1 */ { 4, Cmprsd, ____DXT1, _9_11(D3DFMT_DXT1, DXGI_FORMAT_BC1_UNORM) }, // opaque/one-bit alpha // NOTE : DXT1 is half byte per pixel, so divide Size and Pitch calculations by two!
/* 0x0D undefined */ {},
/* 0x0E X_D3DFMT_DXT3 */ { 8, Cmprsd, ____DXT3, _9_11(D3DFMT_DXT3, DXGI_FORMAT_BC2_UNORM) }, // Alias : X_D3DFMT_DXT2 // linear alpha
/* 0x0F X_D3DFMT_DXT5 */ { 8, Cmprsd, ____DXT5, _9_11(D3DFMT_DXT5, DXGI_FORMAT_BC3_UNORM) }, // Alias : X_D3DFMT_DXT4 // interpolated alpha
/* 0x10 X_D3DFMT_LIN_A1R5G5B5 */ { 16, Linear, A1R5G5B5, _9_11(D3DFMT_A1R5G5B5, DXGI_FORMAT_B5G5R5A1_UNORM)},
/* 0x11 X_D3DFMT_LIN_R5G6B5 */ { 16, Linear, __R5G6B5, _9_11(D3DFMT_R5G6B5, DXGI_FORMAT_B5G6R5_UNORM) , RenderTarget },
/* 0x12 X_D3DFMT_LIN_A8R8G8B8 */ { 32, Linear, A8R8G8B8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM), RenderTarget },
/* 0x13 X_D3DFMT_LIN_L8 */ { 8, Linear, ______L8, _9_11(D3DFMT_L8, DXGI_FORMAT_R8_UNORM) , RenderTarget },
/* 0x0E X_D3DFMT_DXT3 */ { 8, Cmprsd, ____DXT3, _9_11(D3DFMT_DXT3, DXGI_FORMAT_BC2_UNORM) }, // Alias : X_D3DFMT_DXT2 // linear alpha
/* 0x0F X_D3DFMT_DXT5 */ { 8, Cmprsd, ____DXT5, _9_11(D3DFMT_DXT5, DXGI_FORMAT_BC3_UNORM) }, // Alias : X_D3DFMT_DXT4 // interpolated alpha
/* 0x10 X_D3DFMT_LIN_A1R5G5B5 */ { 16, Linear, A1R5G5B5, _9_11(D3DFMT_A1R5G5B5, DXGI_FORMAT_B5G5R5A1_UNORM) },
/* 0x11 X_D3DFMT_LIN_R5G6B5 */ { 16, Linear, __R5G6B5, _9_11(D3DFMT_R5G6B5, DXGI_FORMAT_B5G6R5_UNORM) , RenderTarget },
/* 0x12 X_D3DFMT_LIN_A8R8G8B8 */ { 32, Linear, A8R8G8B8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM) , RenderTarget },
/* 0x13 X_D3DFMT_LIN_L8 */ { 8, Linear, ______L8, _9_11(D3DFMT_L8, DXGI_FORMAT_R8_UNORM) , RenderTarget },
/* 0x14 undefined */ {},
/* 0x15 undefined */ {},
/* 0x16 X_D3DFMT_LIN_R8B8 */ { 16, Linear, ____R8B8, _9_11(D3DFMT_R5G6B5, DXGI_FORMAT_B5G6R5_UNORM) , Texture, "X_D3DFMT_LIN_R8B8 -> D3DFMT_R5G6B5" },
/* 0x17 X_D3DFMT_LIN_G8B8 */ { 16, Linear, ____G8B8, _9_11(D3DFMT_R5G6B5, DXGI_FORMAT_B5G6R5_UNORM) , RenderTarget, "X_D3DFMT_LIN_G8B8 -> D3DFMT_R5G6B5" }, // Alias : X_D3DFMT_LIN_V8U8
/* 0x16 X_D3DFMT_LIN_R8B8 */ { 16, Linear, ____R8B8, _9_11(D3DFMT_A8L8, DXGI_FORMAT_R8G8_UNORM) , Texture, "X_D3DFMT_LIN_R8B8 -> D3DFMT_R5G6B5" },
/* 0x17 X_D3DFMT_LIN_G8B8 */ { 16, Linear, ____G8B8, _9_11(D3DFMT_A8L8, DXGI_FORMAT_R8G8_UNORM) , RenderTarget, "X_D3DFMT_LIN_G8B8 -> D3DFMT_R5G6B5" }, // Alias : X_D3DFMT_LIN_V8U8
/* 0x18 undefined */ {},
/* 0x19 X_D3DFMT_A8 */ { 8, Swzzld, ______A8, _9_11(D3DFMT_A8, DXGI_FORMAT_A8_UNORM) , Texture, "X_D3DFMT_A8 -> D3DFMT_A8R8G8B8" }, // D3D9 sets RGB = 0 instead of 1
/* 0x1A X_D3DFMT_A8L8 */ { 16, Swzzld, ____A8L8, _9_11(D3DFMT_A8L8, DXGI_FORMAT_NOT_AVAILABLE) },
/* 0x1B X_D3DFMT_LIN_AL8 */ { 8, Linear, _____AL8, _9_11(D3DFMT_L8, DXGI_FORMAT_R8_UNORM) , Texture, "X_D3DFMT_LIN_AL8 -> D3DFMT_L8" },
/* 0x1C X_D3DFMT_LIN_X1R5G5B5 */ { 16, Linear, X1R5G5B5, _9_11(D3DFMT_X1R5G5B5, DXGI_FORMAT_NOT_AVAILABLE) , RenderTarget },
/* 0x1D X_D3DFMT_LIN_A4R4G4B4 */ { 16, Linear, A4R4G4B4, _9_11(D3DFMT_A4R4G4B4, DXGI_FORMAT_B4G4R4A4_UNORM)},
/* 0x1E X_D3DFMT_LIN_X8R8G8B8 */ { 32, Linear, X8R8G8B8, _9_11(D3DFMT_X8R8G8B8, DXGI_FORMAT_B8G8R8X8_UNORM), RenderTarget }, // Alias : X_D3DFMT_LIN_X8L8V8U8
/* 0x1F X_D3DFMT_LIN_A8 */ { 8, Linear, ______A8, _9_11(D3DFMT_A8, DXGI_FORMAT_A8_UNORM) , Texture, "X_D3DFMT_LIN_A8 -> D3DFMT_A8R8G8B8" }, // D3D9 sets RGB = 0 instead of 1
/* 0x20 X_D3DFMT_LIN_A8L8 */ { 16, Linear, ____A8L8, _9_11(D3DFMT_A8L8, DXGI_FORMAT_NOT_AVAILABLE) },
/* 0x19 X_D3DFMT_A8 */ { 8, Swzzld, ______A8, _9_11(D3DFMT_A8, DXGI_FORMAT_A8_UNORM) , Texture, "X_D3DFMT_A8 -> D3DFMT_A8R8G8B8" }, // D3D9 sets RGB = 0 instead of 1
/* 0x1A X_D3DFMT_A8L8 */ { 16, Swzzld, ____A8L8, _9_11(D3DFMT_A8L8, DXGI_FORMAT_R8G8_UNORM) },
/* 0x1B X_D3DFMT_LIN_AL8 */ { 8, Linear, _____AL8, _9_11(D3DFMT_L8, DXGI_FORMAT_R8_UNORM) , Texture, "X_D3DFMT_LIN_AL8 -> D3DFMT_L8" },
/* 0x1C X_D3DFMT_LIN_X1R5G5B5 */ { 16, Linear, X1R5G5B5, _9_11(D3DFMT_X1R5G5B5, DXGI_FORMAT_B5G5R5A1_UNORM) , RenderTarget }, // D3D11 TODO : Default A in shader
/* 0x1D X_D3DFMT_LIN_A4R4G4B4 */ { 16, Linear, A4R4G4B4, _9_11(D3DFMT_A4R4G4B4, DXGI_FORMAT_B4G4R4A4_UNORM) },
/* 0x1E X_D3DFMT_LIN_X8R8G8B8 */ { 32, Linear, X8R8G8B8, _9_11(D3DFMT_X8R8G8B8, DXGI_FORMAT_B8G8R8X8_UNORM) , RenderTarget }, // Alias : X_D3DFMT_LIN_X8L8V8U8
/* 0x1F X_D3DFMT_LIN_A8 */ { 8, Linear, ______A8, _9_11(D3DFMT_A8, DXGI_FORMAT_A8_UNORM) , Texture, "X_D3DFMT_LIN_A8 -> D3DFMT_A8R8G8B8" }, // D3D9 sets RGB = 0 instead of 1
/* 0x20 X_D3DFMT_LIN_A8L8 */ { 16, Linear, ____A8L8, _9_11(D3DFMT_A8L8, DXGI_FORMAT_R8G8_UNORM) },
/* 0x21 undefined */ {},
/* 0x22 undefined */ {},
/* 0x23 undefined */ {},
/* 0x24 X_D3DFMT_YUY2 */ { 16, Linear, ____YUY2, _9_11(D3DFMT_YUY2, DXGI_FORMAT_YUY2) }, // DXGI_FORMAT_NOT_AVAILABLE ?
/* 0x25 X_D3DFMT_UYVY */ { 16, Linear, ____UYVY, _9_11(D3DFMT_UYVY, DXGI_FORMAT_NOT_AVAILABLE) },
/* 0x24 X_D3DFMT_YUY2 */ { 16, Linear, ____YUY2, _9_11(D3DFMT_YUY2, DXGI_FORMAT_YUY2) }, // DXGI_FORMAT_NOT_AVAILABLE ?
/* 0x25 X_D3DFMT_UYVY */ { 16, Linear, ____UYVY, _9_11(D3DFMT_UYVY, DXGI_FORMAT_NOT_AVAILABLE) },
/* 0x26 undefined */ {},
/* 0x27 X_D3DFMT_L6V5U5 */ { 16, Swzzld, __R6G5B5, _9_11(D3DFMT_L6V5U5, DXGI_FORMAT_NOT_AVAILABLE) }, // Alias : X_D3DFMT_R6G5B5 // XQEMU NOTE : This might be signed
/* 0x28 X_D3DFMT_V8U8 */ { 16, Swzzld, ____G8B8, _9_11(D3DFMT_V8U8, DXGI_FORMAT_R8G8_SNORM) }, // Alias : X_D3DFMT_G8B8 // XQEMU NOTE : This might be signed
/* 0x29 X_D3DFMT_R8B8 */ { 16, Swzzld, ____R8B8, _9_11(D3DFMT_R5G6B5, DXGI_FORMAT_B5G6R5_UNORM) , Texture, "X_D3DFMT_R8B8 -> D3DFMT_R5G6B5" }, // XQEMU NOTE : This might be signed
/* 0x2A X_D3DFMT_D24S8 */ { 32, Swzzld, NoCmpnts, _9_11(D3DFMT_D24S8, DXGI_FORMAT_NOT_AVAILABLE) , DepthBuffer },
/* 0x2B X_D3DFMT_F24S8 */ { 32, Swzzld, NoCmpnts, _9_11(D3DFMT_D24FS8, DXGI_FORMAT_NOT_AVAILABLE) , DepthBuffer },
/* 0x2C X_D3DFMT_D16 */ { 16, Swzzld, NoCmpnts, _9_11(D3DFMT_D16, DXGI_FORMAT_D16_UNORM) , DepthBuffer }, // Note : X_D3DFMT_D16 is always lockable on Xbox, D3DFMT_D16 on host is not, but D3DFMT_D16_LOCKABLE often fails SetRenderTarget.
/* 0x2D X_D3DFMT_F16 */ { 16, Swzzld, NoCmpnts, _9_11(D3DFMT_D16, DXGI_FORMAT_D16_UNORM) , DepthBuffer, "X_D3DFMT_F16 -> D3DFMT_D16" }, // HACK : PC doesn't have D3DFMT_F16 (Float vs Int) // TODO : Use D3DFMT_R16F?
/* 0x2E X_D3DFMT_LIN_D24S8 */ { 32, Linear, NoCmpnts, _9_11(D3DFMT_D24S8, DXGI_FORMAT_NOT_AVAILABLE) , DepthBuffer },
/* 0x2F X_D3DFMT_LIN_F24S8 */ { 32, Linear, NoCmpnts, _9_11(D3DFMT_D24FS8, DXGI_FORMAT_NOT_AVAILABLE) , DepthBuffer },
/* 0x30 X_D3DFMT_LIN_D16 */ { 16, Linear, NoCmpnts, _9_11(D3DFMT_D16, DXGI_FORMAT_D16_UNORM) , DepthBuffer }, // Note : X_D3DFMT_D16 is always lockable on Xbox, D3DFMT_D16 on host is not, but D3DFMT_D16_LOCKABLE often fails SetRenderTarget.
/* 0x31 X_D3DFMT_LIN_F16 */ { 16, Linear, NoCmpnts, _9_11(D3DFMT_D16, DXGI_FORMAT_D16_UNORM) , DepthBuffer, "X_D3DFMT_LIN_F16 -> D3DFMT_D16" }, // HACK : PC doesn't have D3DFMT_F16 (Float vs Int) // TODO : Use D3DFMT_R16F?
/* 0x32 X_D3DFMT_L16 */ { 16, Swzzld, _____L16, _9_11(D3DFMT_L16, DXGI_FORMAT_R16_UNORM) },
/* 0x33 X_D3DFMT_V16U16 */ { 32, Swzzld, NoCmpnts, _9_11(D3DFMT_V16U16, DXGI_FORMAT_R16G16_SNORM) },
/* 0x27 X_D3DFMT_L6V5U5 */ { 16, Swzzld, __R6G5B5, _9_11(D3DFMT_L6V5U5, DXGI_FORMAT_NOT_AVAILABLE) }, // Alias : X_D3DFMT_R6G5B5 // XQEMU NOTE : This might be signed
/* 0x28 X_D3DFMT_V8U8 */ { 16, Swzzld, ____G8B8, _9_11(D3DFMT_V8U8, DXGI_FORMAT_R8G8_SNORM) }, // Alias : X_D3DFMT_G8B8 // XQEMU NOTE : This might be signed
/* 0x29 X_D3DFMT_R8B8 */ { 16, Swzzld, ____R8B8, _9_11(D3DFMT_A8L8, DXGI_FORMAT_R8G8_UNORM) , Texture, "X_D3DFMT_R8B8 -> D3DFMT_R5G6B5" }, // XQEMU NOTE : This might be signed
/* 0x2A X_D3DFMT_D24S8 */ { 32, Swzzld, NoCmpnts, _9_11(D3DFMT_D24S8, DXGI_FORMAT_D24_UNORM_S8_UINT), DepthBuffer },
/* 0x2B X_D3DFMT_F24S8 */ { 32, Swzzld, NoCmpnts, _9_11(D3DFMT_D24FS8, DXGI_FORMAT_R24G8_TYPELESS) , DepthBuffer },
/* 0x2C X_D3DFMT_D16 */ { 16, Swzzld, NoCmpnts, _9_11(D3DFMT_D16, DXGI_FORMAT_D16_UNORM) , DepthBuffer }, // Note : X_D3DFMT_D16 is always lockable on Xbox, D3DFMT_D16 on host is not, but D3DFMT_D16_LOCKABLE often fails SetRenderTarget.
/* 0x2D X_D3DFMT_F16 */ { 16, Swzzld, NoCmpnts, _9_11(D3DFMT_R16F, DXGI_FORMAT_R16_FLOAT) , DepthBuffer, "X_D3DFMT_F16 -> D3DFMT_R16F" }, // HACK : PC doesn't have D3DFMT_F16 (Float vs Int) // TODO : Use D3DFMT_R16F?
/* 0x2E X_D3DFMT_LIN_D24S8 */ { 32, Linear, NoCmpnts, _9_11(D3DFMT_D24S8, DXGI_FORMAT_D24_UNORM_S8_UINT), DepthBuffer },
/* 0x2F X_D3DFMT_LIN_F24S8 */ { 32, Linear, NoCmpnts, _9_11(D3DFMT_D24FS8, DXGI_FORMAT_R24G8_TYPELESS) , DepthBuffer },
/* 0x30 X_D3DFMT_LIN_D16 */ { 16, Linear, NoCmpnts, _9_11(D3DFMT_D16, DXGI_FORMAT_D16_UNORM) , DepthBuffer }, // Note : X_D3DFMT_D16 is always lockable on Xbox, D3DFMT_D16 on host is not, but D3DFMT_D16_LOCKABLE often fails SetRenderTarget.
/* 0x31 X_D3DFMT_LIN_F16 */ { 16, Linear, NoCmpnts, _9_11(D3DFMT_R16F, DXGI_FORMAT_R16_FLOAT) , DepthBuffer, "X_D3DFMT_LIN_F16 -> D3DFMT_R16F" }, // HACK : PC doesn't have D3DFMT_F16 (Float vs Int) // TODO : Use D3DFMT_R16F?
/* 0x32 X_D3DFMT_L16 */ { 16, Swzzld, _____L16, _9_11(D3DFMT_L16, DXGI_FORMAT_R16_UNORM) },
/* 0x33 X_D3DFMT_V16U16 */ { 32, Swzzld, NoCmpnts, _9_11(D3DFMT_V16U16, DXGI_FORMAT_R16G16_SNORM) },
/* 0x34 undefined */ {},
/* 0x35 X_D3DFMT_LIN_L16 */ { 16, Linear, _____L16, _9_11(D3DFMT_L16, DXGI_FORMAT_R16_UNORM) },
/* 0x36 X_D3DFMT_LIN_V16U16 */ { 32, Linear, NoCmpnts, _9_11(D3DFMT_V16U16, DXGI_FORMAT_R16G16_SNORM) }, // Note : Seems unused on Xbox
/* 0x37 X_D3DFMT_LIN_L6V5U5 */ { 16, Linear, __R6G5B5, _9_11(D3DFMT_L6V5U5, DXGI_FORMAT_NOT_AVAILABLE) }, // Alias : X_D3DFMT_LIN_R6G5B5
/* 0x38 X_D3DFMT_R5G5B5A1 */ { 16, Swzzld, R5G5B5A1, _9_11(D3DFMT_A1R5G5B5, DXGI_FORMAT_B5G5R5A1_UNORM), Texture, "X_D3DFMT_R5G5B5A1 -> D3DFMT_A1R5G5B5" },
/* 0x39 X_D3DFMT_R4G4B4A4 */ { 16, Swzzld, R4G4B4A4, _9_11(D3DFMT_A4R4G4B4, DXGI_FORMAT_B4G4R4A4_UNORM), Texture, "X_D3DFMT_R4G4B4A4 -> D3DFMT_A4R4G4B4" },
/* 0x3A X_D3DFMT_Q8W8V8U8 */ { 32, Swzzld, A8B8G8R8, _9_11(D3DFMT_Q8W8V8U8, DXGI_FORMAT_R8G8B8A8_SNORM)}, // Alias : X_D3DFMT_A8B8G8R8 // Note : D3DFMT_A8B8G8R8=32 D3DFMT_Q8W8V8U8=63 // TODO : Needs testcase.
/* 0x3B X_D3DFMT_B8G8R8A8 */ { 32, Swzzld, B8G8R8A8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM), Texture, "X_D3DFMT_B8G8R8A8 -> D3DFMT_A8R8G8B8" },
/* 0x3C X_D3DFMT_R8G8B8A8 */ { 32, Swzzld, R8G8B8A8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM), Texture, "X_D3DFMT_R8G8B8A8 -> D3DFMT_A8R8G8B8" },
/* 0x3D X_D3DFMT_LIN_R5G5B5A1 */ { 16, Linear, R5G5B5A1, _9_11(D3DFMT_A1R5G5B5, DXGI_FORMAT_B5G5R5A1_UNORM), Texture, "X_D3DFMT_LIN_R5G5B5A1 -> D3DFMT_A1R5G5B5" },
/* 0x3E X_D3DFMT_LIN_R4G4B4A4 */ { 16, Linear, R4G4B4A4, _9_11(D3DFMT_A4R4G4B4, DXGI_FORMAT_B4G4R4A4_UNORM), Texture, "X_D3DFMT_LIN_R4G4B4A4 -> D3DFMT_A4R4G4B4" },
/* 0x3F X_D3DFMT_LIN_A8B8G8R8 */ { 32, Linear, A8B8G8R8, _9_11(D3DFMT_A8B8G8R8, DXGI_FORMAT_R8G8B8A8_UNORM)}, // Note : D3DFMT_A8B8G8R8=32 D3DFMT_Q8W8V8U8=63 // TODO : Needs testcase.
/* 0x40 X_D3DFMT_LIN_B8G8R8A8 */ { 32, Linear, B8G8R8A8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM), Texture, "X_D3DFMT_LIN_B8G8R8A8 -> D3DFMT_A8R8G8B8" },
/* 0x41 X_D3DFMT_LIN_R8G8B8A8 */ { 32, Linear, R8G8B8A8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM), Texture, "X_D3DFMT_LIN_R8G8B8A8 -> D3DFMT_A8R8G8B8" },
/* 0x35 X_D3DFMT_LIN_L16 */ { 16, Linear, _____L16, _9_11(D3DFMT_L16, DXGI_FORMAT_R16_UNORM) },
/* 0x36 X_D3DFMT_LIN_V16U16 */ { 32, Linear, NoCmpnts, _9_11(D3DFMT_V16U16, DXGI_FORMAT_R16G16_SNORM) }, // Note : Seems unused on Xbox
/* 0x37 X_D3DFMT_LIN_L6V5U5 */ { 16, Linear, __R6G5B5, _9_11(D3DFMT_L6V5U5, DXGI_FORMAT_NOT_AVAILABLE) }, // Alias : X_D3DFMT_LIN_R6G5B5
/* 0x38 X_D3DFMT_R5G5B5A1 */ { 16, Swzzld, R5G5B5A1, _9_11(D3DFMT_A1R5G5B5, DXGI_FORMAT_B5G5R5A1_UNORM) , Texture, "X_D3DFMT_R5G5B5A1 -> D3DFMT_A1R5G5B5" },
/* 0x39 X_D3DFMT_R4G4B4A4 */ { 16, Swzzld, R4G4B4A4, _9_11(D3DFMT_A4R4G4B4, DXGI_FORMAT_B4G4R4A4_UNORM) , Texture, "X_D3DFMT_R4G4B4A4 -> D3DFMT_A4R4G4B4" },
/* 0x3A X_D3DFMT_Q8W8V8U8 */ { 32, Swzzld, A8B8G8R8, _9_11(D3DFMT_Q8W8V8U8, DXGI_FORMAT_R8G8B8A8_SNORM) }, // Alias : X_D3DFMT_A8B8G8R8 // Note : D3DFMT_A8B8G8R8=32 D3DFMT_Q8W8V8U8=63 // TODO : Needs testcase.
/* 0x3B X_D3DFMT_B8G8R8A8 */ { 32, Swzzld, B8G8R8A8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM) , Texture, "X_D3DFMT_B8G8R8A8 -> D3DFMT_A8R8G8B8" },
/* 0x3C X_D3DFMT_R8G8B8A8 */ { 32, Swzzld, R8G8B8A8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM) , Texture, "X_D3DFMT_R8G8B8A8 -> D3DFMT_A8R8G8B8" },
/* 0x3D X_D3DFMT_LIN_R5G5B5A1 */ { 16, Linear, R5G5B5A1, _9_11(D3DFMT_A1R5G5B5, DXGI_FORMAT_B5G5R5A1_UNORM) , Texture, "X_D3DFMT_LIN_R5G5B5A1 -> D3DFMT_A1R5G5B5" },
/* 0x3E X_D3DFMT_LIN_R4G4B4A4 */ { 16, Linear, R4G4B4A4, _9_11(D3DFMT_A4R4G4B4, DXGI_FORMAT_B4G4R4A4_UNORM) , Texture, "X_D3DFMT_LIN_R4G4B4A4 -> D3DFMT_A4R4G4B4" },
/* 0x3F X_D3DFMT_LIN_A8B8G8R8 */ { 32, Linear, A8B8G8R8, _9_11(D3DFMT_A8B8G8R8, DXGI_FORMAT_R8G8B8A8_UNORM) }, // Note : D3DFMT_A8B8G8R8=32 D3DFMT_Q8W8V8U8=63 // TODO : Needs testcase.
/* 0x40 X_D3DFMT_LIN_B8G8R8A8 */ { 32, Linear, B8G8R8A8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM) , Texture, "X_D3DFMT_LIN_B8G8R8A8 -> D3DFMT_A8R8G8B8" },
/* 0x41 X_D3DFMT_LIN_R8G8B8A8 */ { 32, Linear, R8G8B8A8, _9_11(D3DFMT_A8R8G8B8, DXGI_FORMAT_B8G8R8A8_UNORM) , Texture, "X_D3DFMT_LIN_R8G8B8A8 -> D3DFMT_A8R8G8B8" },
#if 0
/* 0x42 to 0x63 undefined */ {},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},
/* 0x64 X_D3DFMT_VERTEXDATA */ { 8, Linear, NoCmpnts, D3DFMT_VERTEXDATA },