DirectX Firefox插件呈现工件

DirectX Firefox插件呈现工件,directx,firefox-3,npapi,Directx,Firefox 3,Npapi,快速回答:适用于通过谷歌进入本页面寻找 要解决同一问题,请尝试 此快速修复(由Goz建议)- 将D3D创建FPU保存添加到 CreateDevice()上的行为标志 呼叫这对我来说是清白的 我正在创建一个基于DirectX 9的NPAPI插件。它似乎在Chrome和Opera中运行良好,但在Firefox中我得到了奇怪的渲染工件。初始化DirectX后(不需要进行渲染即可显示工件),Firefox UI的全部或部分将变为黑色。调整窗口大小(即:启动重新绘制)可以清除工件,插件在这一点上似乎工作正

快速回答:适用于通过谷歌进入本页面寻找 要解决同一问题,请尝试 此快速修复(由Goz建议)- 将D3D创建FPU保存添加到 CreateDevice()上的行为标志 呼叫这对我来说是清白的

我正在创建一个基于DirectX 9的NPAPI插件。它似乎在Chrome和Opera中运行良好,但在Firefox中我得到了奇怪的渲染工件。初始化DirectX后(不需要进行渲染即可显示工件),Firefox UI的全部或部分将变为黑色。调整窗口大小(即:启动重新绘制)可以清除工件,插件在这一点上似乎工作正常,但这显然不是一个理想的“特性”。我发现网上还有几个人提到了这个问题,大多数人都声称它是从Firefox3开始的。只提到了正在找到的任何解决方案,但作者似乎并不想透露如何找到

有人熟悉这个问题和可能的解决方案吗?从链接的帖子来看,它似乎与DX的初始化方式有关,但我还没有找到一个组合来防止这个问题

这是我正在使用的DX初始化代码(为清晰起见,已删除错误处理):


我能想到的唯一一件事就是在设备创建时设置“D3DCREATE_NOWINDOWCHANGES”行为标志

Edit1: 您可以尝试将backbufferwidth和height设置为0,并让它从窗口继承信息


可能还值得尝试设置D3DCREATE_FPU_PRESERVE标志和D3DCREATE_多线程。

是否向我们显示您的DX初始化代码?愿望已实现。我本来会早点做的,但我想清理一下,再检查几件事。希望这有帮助!猜得不错,但这似乎没什么区别。真可惜,我希望它会的!:(令人震惊的是,D3DCREATE_FPU_PRESERVE做到了!哇!这实际上向我指出了Firefox中的一个问题,但至少这提供了一个解决办法。谢谢谢谢谢谢!我从来没有想过自己会尝试这样做!我突然意识到Firefox可能会期待某个FPU选项,D3D的FPU精度相当高奇怪的是,很高兴你被分类:)我曾经在Firefox3.0中遇到过与黑色UI元素完全相同的问题。更糟糕的是,Firefox 3.5因插件未使用D3DCREATE_FPU_PRESERVE而崩溃(请参阅)。使用D3DCREATE_FPU_PRESERVE修复了这两个问题。
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 );