[Mono-dev] Managed DirectX

Brian Crowell mono-devel at fluggo.com
Wed Oct 25 12:34:21 EDT 2006

Stefan Dösinger wrote:
> I am one of the programmers of the Wine Direct3D implementation, and I 
> wondered if there are any plans to implement Managed DirectX in Mono, and if 
> it is possible to share efforts between wine and mono?


I started on an open implementation of the XNA libraries. Mostly because I was cheesed at the lack of good error messages. I know that isn't Managed DirectX, but Microsoft never really seemed interested in supporting that. The good news is that they're not terribly different from each other.

The only catch is that it's implemented in C++/CLI, which at present is really the best way to do it. I wouldn't attempt it in C#, unless you could figure out a better way to do all the calli instructions. I thought at one point about doing a simple wrapper around the COM implementation and doing the rest in C#, but even that's not all that great, and you still have the C++/CLI dependency.

Here, I'll give you a good example:

_device->CreateTexture( width, height, levels, (DWORD) usage, (D3DFORMAT) format, (D3DPOOL) pool, &tex, NULL )


  IL_0006:  ldarg.0
  IL_0007:  ldfld      valuetype IDirect3DDevice9* Fluggo.Graphics.Direct3D.GraphicsDevice::_device
  IL_000c:  ldarg.1
  IL_000d:  ldarg.2
  IL_000e:  ldarg.3
  IL_000f:  ldarg.s    usage
  IL_0011:  ldarg.s    format
  IL_0013:  ldarg.s    pool
  IL_0015:  ldloca.s   tex
  IL_0017:  ldc.i4.0
  IL_0018:  ldarg.0
  IL_0019:  ldfld      valuetype IDirect3DDevice9* Fluggo.Graphics.Direct3D.GraphicsDevice::_device
  IL_001e:  ldind.i4
  IL_001f:  ldc.i4.s   92
  IL_0021:  add
  IL_0022:  ldind.i4
  IL_0023:  calli      unmanaged stdcall int32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong) modopt([mscorlib]System.Runtime.CompilerServices.CallConvStdcall)(native int,uint32,uint32,uint32,uint32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong),valuetype _D3DFORMAT,valuetype _D3DPOOL,valuetype IDirect3DTexture9**,void**)

Here, you can see C++ calculating the address of the pointer to the function, loading it, then issuing a calli. I don't know of a way to do that in C#, at least, not one that will give you any kind of good performance.


More information about the Mono-devel-list mailing list