Nachtrag: Ursache gefunden!
In der SynEdit.pas in der function TCustomSynEdit.CreateD2DCanvas folgende Zeile suchen:
Delphi-Quellcode:
HR := D2DFactory.CreateHwndRenderTarget(D2D1RenderTargetProperties,
D2D1HwndRenderTargetProperties(
Handle, Size), FRenderTarget);
und wie folgt ergänzen:
Delphi-Quellcode:
HR := D2DFactory.CreateHwndRenderTarget(D2D1RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_SOFTWARE),
D2D1HwndRenderTargetProperties(
Handle, Size), FRenderTarget);,
Das scheint also wirklich ein Treiberproblem zu sein. Denn laut
MSDN heißt es
Zitat von
MSDN:
The render target uses hardware rendering, if available; otherwise, it uses software rendering.
Wenn ich nun explizit D2D1_RENDER_TARGET_TYPE_HARDWARE angebe, bekomme ich genau die selben Exceptions. Erzwinge ich Software-Rendering (D2D1_RENDER_TARGET_TYPE_SOFTWARE), dann funktioniert es. Scheinbar melden manche Treiber inkorrekterweise, sie könnten D2D-Hardware-Rendering, obwohl es nicht stimmt. Dadurch erfolgt das notwendige Fallback auf Software-Rendering nicht. Dann kracht es irgendwo in der GPU, wo der Debugger nicht mit kommt und nur noch ratlos das CPU-Fenster anzeigt. So erkläre ich mir das jedenfalls. Vielleicht findet sich ja hier jemand, der das Ganze etwas besser erklären kann.
Noch ein Nachtrag: Ich denke ich habe die Erklärung gefunden. Vor langer Zeit wurde das in SynEdit implementiert. Damals gab es damals nur DirectX9. Irgendwann kam DX10 und wurde in der
Winapi.D2D1.pas ergänzt. Nur wurde SynEdit nie daran angepasst. So wie es in SynEdit implementiert ist, fällt die Initialisierung auf DX9-Featurelevel zurück. Manche Graka-Treiber bieten aber
nur DX10. Man kann DX10 erzwingen, wenn man die oben genannte Zeile wie folgt ändert:
Delphi-Quellcode:
HR := D2DFactory.CreateHwndRenderTarget(
D2D1RenderTargetProperties(
D2D1_RENDER_TARGET_TYPE_DEFAULT,
D2D1PixelFormat(),
0, 0,
D2D1_RENDER_TARGET_USAGE_NONE,
D2D1_FEATURE_LEVEL_10
),
D2D1HwndRenderTargetProperties(
Handle, Size), FRenderTarget
);
Entscheidend ist D2D1_FEATURE_LEVEL_10 anzugeben, wenn man ein DX10-System hat und D2D1_FEATURE_LEVEL_9 wenn man ein DX9-System hat. Jetzt habe ich aber spontan nichts
gescheites gefunden, wie man die
DirectX-Version ermitteln könnte. Außer in der Registry rumzustöbern.