БЫСТРЫЙ ОТВЕТ: Для тех из вас, кто попасть на эту страницу с помощью Google ищет решение той же проблемы, попробуйте это быстрое решение (предложенный Гоз) - Добавить D3DCREATE_FPU_PRESERVE - флаги поведения на вашем CreateDevice() call. Это прояснилось для меня!DirectX Firefox плагин визуализации артефактов
Я создаю плагин NPAPI на базе DirectX 9. Кажется, он хорошо работает в Chrome и Opera, но в Firefox я получаю странные артефакты рендеринга. После инициализации DirectX (для отображения артефакта не требуется рендеринг) все или части пользовательского интерфейса Firefox станут черными. Изменение размера окна (IE: инициирование перерисовки) очищает артефакты, и плагин, похоже, работает правильно в этот момент, но это, очевидно, не является желательной «особенностью». Я обнаружил, что некоторые другие пользователи в Интернете упомянули об этой проблеме, большинство из которых утверждают, что она началась с Firefox 3. Только one post упоминает любое найденное решение, но автор, похоже, не стремится разглашать его.
Кто-нибудь знаком с этой проблемой и возможным решением? Из связанного сообщения это, похоже, связано с тем, как инициализируется DX, но мне еще предстоит найти комбинацию, которая предотвращает проблему.
Это код DX Initialization Я использую (Error Handling для наглядности):
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);
Вы хотите показать нам код инициализации DX? – Goz
Желание предоставляется. Я бы сделал это раньше, но я хотел очистить и дважды проверить несколько вещей. Надеюсь это поможет! – Toji