@ -15,6 +15,7 @@
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2024-02-12: DirectX9: Using RGBA format when supported by the driver to avoid CPU side conversion. (#6575)
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-06-25: DirectX9: Explicitly disable texture state stages after >= 1.
@ -312,6 +313,24 @@ void ImGui_ImplDX9_Shutdown()
IM_DELETE ( bd ) ;
}
static bool ImGui_ImplDX9_CheckFormatSupport ( IDirect3DDevice9 * pDevice , D3DFORMAT format )
{
IDirect3D9 * pd3d = nullptr ;
if ( pDevice - > GetDirect3D ( & pd3d ) ! = D3D_OK )
return false ;
D3DDEVICE_CREATION_PARAMETERS param = { } ;
D3DDISPLAYMODE mode = { } ;
if ( pDevice - > GetCreationParameters ( & param ) ! = D3D_OK | | pDevice - > GetDisplayMode ( 0 , & mode ) ! = D3D_OK )
{
pd3d - > Release ( ) ;
return false ;
}
// Font texture should support linear filter, color blend and write to render-target
bool support = ( pd3d - > CheckDeviceFormat ( param . AdapterOrdinal , param . DeviceType , mode . Format , D3DUSAGE_DYNAMIC | D3DUSAGE_QUERY_FILTER | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING , D3DRTYPE_TEXTURE , format ) ) = = D3D_OK ;
pd3d - > Release ( ) ;
return support ;
}
static bool ImGui_ImplDX9_CreateFontsTexture ( )
{
// Build texture atlas
@ -323,18 +342,21 @@ static bool ImGui_ImplDX9_CreateFontsTexture()
// Convert RGBA32 to BGRA32 (because RGBA32 is not well supported by DX9 devices)
# ifndef IMGUI_USE_BGRA_PACKED_COLOR
if ( io . Fonts - > TexPixelsUseColors )
const bool rgba_support = ImGui_ImplDX9_CheckFormatSupport ( bd - > pd3dDevice , D3DFMT_A8B8G8R8 ) ;
if ( ! rgba_support & & io . Fonts - > TexPixelsUseColors )
{
ImU32 * dst_start = ( ImU32 * ) ImGui : : MemAlloc ( ( size_t ) width * height * bytes_per_pixel ) ;
for ( ImU32 * src = ( ImU32 * ) pixels , * dst = dst_start , * dst_end = dst_start + ( size_t ) width * height ; dst < dst_end ; src + + , dst + + )
* dst = IMGUI_COL_TO_DX9_ARGB ( * src ) ;
pixels = ( unsigned char * ) dst_start ;
}
# else
const bool rgba_support = false ;
# endif
// Upload texture to graphics system
bd - > FontTexture = nullptr ;
if ( bd - > pd3dDevice - > CreateTexture ( width , height , 1 , D3DUSAGE_DYNAMIC , D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & bd - > FontTexture , nullptr ) < 0 )
if ( bd - > pd3dDevice - > CreateTexture ( width , height , 1 , D3DUSAGE_DYNAMIC , rgba_support ? D3DFMT_A8B8G8R8 : D3DFMT_A8R8G8B8 , D3DPOOL_DEFAULT , & bd - > FontTexture , nullptr ) < 0 )
return false ;
D3DLOCKED_RECT tex_locked_rect ;
if ( bd - > FontTexture - > LockRect ( 0 , & tex_locked_rect , nullptr , 0 ) ! = D3D_OK )
@ -347,7 +369,7 @@ static bool ImGui_ImplDX9_CreateFontsTexture()
io . Fonts - > SetTexID ( ( ImTextureID ) bd - > FontTexture ) ;
# ifndef IMGUI_USE_BGRA_PACKED_COLOR
if ( io . Fonts - > TexPixelsUseColors )
if ( ! rgba_support & & io . Fonts - > TexPixelsUseColors )
ImGui : : MemFree ( pixels ) ;
# endif