Einzelnen Beitrag anzeigen

Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 13. Dez 2019, 12:11
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter (13. Dez 2019 um 12:49 Uhr)
  Mit Zitat antworten Zitat