Browse Source

Fix immediate geometry rendering in D2D.

scenegraph-after-breakage
Steven Kirk 10 years ago
parent
commit
f6b344dcf6
  1. 20
      src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs
  2. 8
      src/Windows/Avalonia.Direct2D1/HwndRenderTarget.cs

20
src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs

@ -27,22 +27,25 @@ namespace Avalonia.Direct2D1
{ {
private static readonly Direct2D1Platform s_instance = new Direct2D1Platform(); private static readonly Direct2D1Platform s_instance = new Direct2D1Platform();
private static readonly SharpDX.Direct2D1.Factory s_d2D1Factory = private static readonly SharpDX.Direct2D1.Factory1 s_d2D1Factory =
#if DEBUG #if DEBUG
new SharpDX.Direct2D1.Factory(SharpDX.Direct2D1.FactoryType.MultiThreaded, SharpDX.Direct2D1.DebugLevel.Error); new SharpDX.Direct2D1.Factory1(SharpDX.Direct2D1.FactoryType.MultiThreaded, SharpDX.Direct2D1.DebugLevel.Error);
#else #else
new SharpDX.Direct2D1.Factory(SharpDX.Direct2D1.FactoryType.MultiThreaded, SharpDX.Direct2D1.DebugLevel.None); new SharpDX.Direct2D1.Factory1(SharpDX.Direct2D1.FactoryType.MultiThreaded, SharpDX.Direct2D1.DebugLevel.None);
#endif #endif
private static readonly SharpDX.DirectWrite.Factory s_dwfactory = new SharpDX.DirectWrite.Factory(); private static readonly SharpDX.DirectWrite.Factory s_dwfactory = new SharpDX.DirectWrite.Factory();
private static readonly SharpDX.WIC.ImagingFactory s_imagingFactory = new SharpDX.WIC.ImagingFactory(); private static readonly SharpDX.WIC.ImagingFactory s_imagingFactory = new SharpDX.WIC.ImagingFactory();
public static bool UseImmediateRenderer { get; set; }
public static void Initialize() public static void Initialize()
{ {
AvaloniaLocator.CurrentMutable AvaloniaLocator.CurrentMutable
.Bind<IPlatformRenderInterface>().ToConstant(s_instance) .Bind<IPlatformRenderInterface>().ToConstant(s_instance)
.Bind<IRendererFactory>().ToConstant(s_instance) .Bind<IRendererFactory>().ToConstant(s_instance)
.BindToSelf(s_d2D1Factory) .Bind<SharpDX.Direct2D1.Factory>().ToConstant(s_d2D1Factory)
.Bind<SharpDX.Direct2D1.Factory1>().ToConstant(s_d2D1Factory)
.BindToSelf(s_dwfactory) .BindToSelf(s_dwfactory)
.BindToSelf(s_imagingFactory); .BindToSelf(s_imagingFactory);
SharpDX.Configuration.EnableReleaseOnFinalizer = true; SharpDX.Configuration.EnableReleaseOnFinalizer = true;
@ -76,7 +79,14 @@ namespace Avalonia.Direct2D1
public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop)
{ {
return new DeferredRenderer(root, renderLoop); if (UseImmediateRenderer)
{
return new ImmediateRenderer(root, renderLoop);
}
else
{
return new DeferredRenderer(root, renderLoop);
}
} }
public IRenderTarget CreateRenderTarget(IPlatformHandle handle) public IRenderTarget CreateRenderTarget(IPlatformHandle handle)

8
src/Windows/Avalonia.Direct2D1/HwndRenderTarget.cs

@ -27,9 +27,11 @@ namespace Avalonia.Direct2D1
public HwndRenderTarget(IntPtr hwnd) public HwndRenderTarget(IntPtr hwnd)
{ {
_hwnd = hwnd; _hwnd = hwnd;
Direct2DFactory = AvaloniaLocator.Current.GetService<Factory>(); Direct2DFactory = AvaloniaLocator.Current.GetService<Factory1>();
DirectWriteFactory = AvaloniaLocator.Current.GetService<SharpDX.DirectWrite.Factory>(); DirectWriteFactory = AvaloniaLocator.Current.GetService<SharpDX.DirectWrite.Factory>();
System.Diagnostics.Debug.WriteLine("Created HwndRenderTarget");
var featureLevels = new[] var featureLevels = new[]
{ {
SharpDX.Direct3D.FeatureLevel.Level_12_1, SharpDX.Direct3D.FeatureLevel.Level_12_1,
@ -56,7 +58,7 @@ namespace Avalonia.Direct2D1
/// <summary> /// <summary>
/// Gets the Direct2D factory. /// Gets the Direct2D factory.
/// </summary> /// </summary>
public Factory Direct2DFactory public Factory1 Direct2DFactory
{ {
get; get;
} }
@ -99,7 +101,7 @@ namespace Avalonia.Direct2D1
_dpi = dpi; _dpi = dpi;
using (var dxgiDevice = _d3dDevice.QueryInterface<SharpDX.DXGI.Device>()) using (var dxgiDevice = _d3dDevice.QueryInterface<SharpDX.DXGI.Device>())
using (var d2dDevice = new Device(dxgiDevice)) using (var d2dDevice = new Device(Direct2DFactory, dxgiDevice))
using (var dxgiAdaptor = dxgiDevice.Adapter) using (var dxgiAdaptor = dxgiDevice.Adapter)
using (var dxgiFactory = dxgiAdaptor.GetParent<SharpDX.DXGI.Factory2>()) using (var dxgiFactory = dxgiAdaptor.GetParent<SharpDX.DXGI.Factory2>())
{ {

Loading…
Cancel
Save