DirectX Firefox Плагин рендеринга артефактов - PullRequest
1 голос
/ 21 августа 2009

БЫСТРЫЙ ОТВЕТ : Для тех из вас, кто заходит на эту страницу через Google, ищет решение той же проблемы, попробуйте это быстрое решение (предложено Гозом) - Добавьте D3DCREATE_FPU_PRESERVE к флаги поведения на вашем CreateDevice () вызов. Это прояснило это для меня!

Я создаю подключаемый модуль NPAPI на основе DirectX 9. Похоже, что он хорошо работает в Chrome и Opera, но в Firefox я получаю странные артефакты рендеринга. После инициализации DirectX (не нужно выполнять рендеринг для появления артефакта) весь интерфейс Firefox или его части станут черными. Изменение размера окна (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 );

1 Ответ

2 голосов
/ 24 августа 2009

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

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

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

...