快速解答:对于那些通过 Google 访问此页面并寻找相同问题解决方案的人,请尝试此快速修复(由 Goz 建议) - 将D3DCREATE_FPU_PRESERVE添加到 CreateDevice() 调用的行为标志中。这为我清除了它!
我正在创建一个基于 DirectX 9 的 NPAPI 插件。它似乎在 Chrome 和 Opera 中运行良好,但在 Firefox 中我得到了奇怪的渲染工件。初始化 DirectX 后(不需要为工件进行渲染),Firefox UI 的全部或部分将变黑。调整窗口大小(IE:启动重绘)清除了工件,插件似乎在此时正常工作,但这显然不是一个理想的“功能”。我发现网上有其他几个人提到了这个问题,大多数人声称它是从 Firefox 3 开始的。只有一篇文章提到了找到的任何解决方案,但作者似乎并不热衷于透露如何解决。
有没有人熟悉这个问题和可能的解决方案?从链接的帖子来看,它似乎与 DX 的初始化方式有关,但我还没有找到可以防止该问题的组合。
这是我正在使用的 DX 初始化代码(为清楚起见,删除了错误处理):
RECT rc;
GetClientRect(pluginHwnd, &rc);
D3DPRESENT_PARAMETERS d3d9PresentParams;
ZeroMemory(&d3d9PresentParams, sizeof(D3DPRESENT_PARAMETERS));
d3d9PresentParams.hDeviceWindow = pluginHwnd;
d3d9PresentParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3d9PresentParams.Flags = D3DPRESENTFLAG_DEVICECLIP; // Failed attempt to solve FF issue
d3d9PresentParams.EnableAutoDepthStencil = FALSE; // No depth testing
d3d9PresentParams.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // Use Vsync
d3d9PresentParams.MultiSampleType = D3DMULTISAMPLE_NONE; // Don't care about Multisampling
d3d9PresentParams.MultiSampleQuality = 0;
d3d9PresentParams.BackBufferCount = 1;
d3d9PresentParams.BackBufferWidth = rc.right - rc.left;
d3d9PresentParams.BackBufferHeight = rc.bottom - rc.top;
d3d9PresentParams.BackBufferFormat = D3DFMT_UNKNOWN; // Use the same color format as windows
d3d9PresentParams.Windowed = TRUE; // Explicitly windowed
d3d9PresentParams.FullScreen_RefreshRateInHz = 0;
d3d9->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, pluginHwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3d9PresentParams, &d3d9Device );