2009-08-21 1 views
1

БЫСТРЫЙ ОТВЕТ: Для тех из вас, кто попасть на эту страницу с помощью 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); 
+0

Вы хотите показать нам код инициализации DX? – Goz

+0

Желание предоставляется. Я бы сделал это раньше, но я хотел очистить и дважды проверить несколько вещей. Надеюсь это поможет! – Toji

ответ

2

Единственное, что я могу вспомнить с верхней части моей головы установки «D3DCREATE_NOWINDOWCHANGES» флаг поведение при создании устройства.

Редактировать 1: Вы можете попробовать установить backbufferwidth и height в 0 и позволить ему наследовать информацию из окна.

Возможно, стоит попробовать установить флаг D3DCREATE_FPU_PRESERVE и D3DCREATE_MULTITHREADED.

+0

Неплохое предположение, но это, похоже, не имеет никакого значения. Позор, я надеялся! :( – Toji

+0

Ужасно, D3DCREATE_FPU_PRESERVE сделал это! Вау! Это на самом деле указывает на проблему в Firefox для меня, но по крайней мере это обеспечивает обходное решение. Спасибо, спасибо, спасибо! Я бы никогда не подумал попробовать это самостоятельно! – Toji

+0

It неожиданно рассердился на меня, что Firefox может ожидать некоторую привязку FPU, а D3D играет с точностью FPU довольно странно. Рад, что вы отсортированы :) – Goz