2009-08-21 21 views
1

schnelle Antwort: Für diejenigen von Ihnen, die diese Seite über Google für eine Lösung für das gleiche Problem suchen erreichen, versuchen diese schnelle Lösung (von Goz vorgeschlagen) - D3DCREATE_FPU_PRESERVE hinzufügen zu den Verhaltensflags auf Ihrem CreateDevice() Aufruf. Das hat es für mich geklärt!DirectX Firefox Plugin Rendering-Artefakte

Ich erstelle ein DirectX 9-basiertes NPAPI-Plugin. Es scheint in Chrome und Opera gut zu funktionieren, aber in Firefox bekomme ich seltsame Rendering-Artefakte. Nach der Initialisierung von DirectX (es muss kein Rendering durchgeführt werden, damit das Artefakt angezeigt wird) werden alle oder Teile der Firefox-Benutzeroberfläche schwarz. Die Größenänderung des Fensters (IE: Repaint initiieren) löscht die Artefakte und das Plugin scheint zu diesem Zeitpunkt richtig zu funktionieren, aber das ist offensichtlich kein wünschenswertes "Feature". Ich habe festgestellt, dass mehrere andere online dieses Thema erwähnt haben, die meisten behaupten, dass es mit Firefox 3 begann. Nur one post erwähnt, dass irgendeine Lösung gefunden wird, aber der Autor scheint nicht daran interessiert zu sein, wie.

Kennt jemand dieses Problem und eine mögliche Lösung? Von dem verlinkten Post scheint es mit der Art und Weise, wie DX initialisiert wird, in Verbindung zu stehen, aber ich muss noch eine Kombination finden, die das Problem verhindert.

Dies ist der DX-Initialisierung Code Ich verwende (Fehler aus Gründen der Klarheit entfernt Abwicklung):

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

Möchten Sie uns Ihren DX-Initialisierungscode zeigen? – Goz

+0

Wunsch gewährt. Ich hätte das früher getan, aber ich wollte aufräumen und ein paar Dinge überprüfen. Hoffe das hilft! – Toji

Antwort

2

Das einzige, was ich aus der Spitze von meinem Kopf denken kann, ist die „D3DCREATE_NOWINDOWCHANGES“ Verhalten Flags bei der Geräteerstellung.

Edit1: Sie könnten versuchen, Backbufferwidth und Höhe auf 0 setzen und es die Informationen aus dem Fenster erben lassen.

Es könnte sich auch lohnen, den D3DCREATE_FPU_PRESERVE-Flag und D3DCREATE_MULTITHREADED zu setzen.

+0

Keine schlechte Vermutung, aber das scheint keinen Unterschied zu machen. Schade, ich hatte gehofft, es würde! :( – Toji

+0

Schockierend, D3DCREATE_FPU_PRESERVE hat es geschafft! Wow! Das deutet auf ein Problem in Firefox für mich hin, aber zumindest bietet dies eine Umgehungslösung. Danke, danke, danke! Ich hätte nie gedacht, das auf eigene Faust zu versuchen! – Toji

+0

It Plötzlich dämmerte mir, dass Firefox eine bestimmte FPU-Prognose erwarten würde und D3D mit FPU-Präzision ziemlich bizarr spielt .. Froh, dass Sie sortiert sind :) – Goz