ComputeShader for MonoGame !

This is a huge commit for monogame.

First mark - its worked - I tested - and do not conflict with other platforms.
Second mark - Im not added cs files to project solution simply because I dont know how to do it. You can fix these bugs later.
Third mark - I dont know how to implement Content routine(which eliminate much of code below). You can add this later anyways.
Forth mark. Its only for DirectX for now(Windows8). opengl 4.3 i left to future.(oh Opentk is not support it ?)
Fifth mark. I didnt added license(only on 1 file). If you want I can add it later to all.
Six mark. It must be acceptable to win store because it not using D3DCompiler, only the compiled code (cso).
Seven mark - its pretty easy to use.
 
First of all - its only a beginning. Much of the features can be added to it.
Description - Added ComputeShader - the object which used compiled compute shader and bring output to ComputeSurface. 
-ComputeSurface2D - From compute surface you can simple extract data to color array or Texture2D.   
-ComputeSurface3D - From compute surface you can simple extract data to Texture3D.   
-few internal changes to textures - only for support new functionality.

Heres example of WinRT Game with my compute shader.

notes - xnb is renamed cso file which can easily generated in C++ visual studio environment - this example used compiled compute shader code described below.
 
///////////////////////////////////////////////////////////////////////////////////////

<code>
RWTexture2D < float4 > Output;
[numthreads(32, 32, 1)]
void main( uint3 threadID : SV_DispatchThreadID )
{
    Output[threadID.xy] = float4(threadID.xy / 1024.0f, 0, 1);
}  
</code>

///////////////////////////////////////////////////////////////////////////////////////

 <code>
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Windows.ApplicationModel;
using Windows.Storage;
using Windows.Storage.Streams;
namespace ComputeShaderTest
{
public class Game1 : Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
ComputeShader computeShader;
ComputeSurface2D computeSurface2D;
Texture2D output;
IBuffer buffer;
bool done = false;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override async void Initialize()
{ 
computeSurface2D = new ComputeSurface2D(GraphicsDevice, 1024, 1024, true, SurfaceFormat.Color);
output = new Texture2D(GraphicsDevice, 1024, 1024, true, SurfaceFormat.Color);
var file = await Package.Current.InstalledLocation.GetFileAsync(@"Content\cs.xnb");
buffer = await FileIO.ReadBufferAsync(file);
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
//computeShader = Content.Load<ComputeShader>("cs");
}
protected override void UnloadContent()
{
computeShader.Dispose();
computeSurface2D.Dispose();
output.Dispose();
}
protected override void Update(GameTime gameTime)
{
if (!done && buffer != null)
{
byte[] arr = new byte[buffer.Length];
Windows.Storage.Streams.DataReader.FromBuffer(buffer).ReadBytes(arr);
computeShader = ComputeShader.CreateFromCompiledBytecode(GraphicsDevice, arr);
computeShader.SetOutputSurface(computeSurface2D);
computeShader.Compute(32, 32, 1);
Color[] data = new Color[1024 * 1024];
computeSurface2D.Texture.GetData(data);
output.SetData(data);
done = true;
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
if (spriteBatch != null)
{
spriteBatch.Begin();
if (done)
{
spriteBatch.Draw(output, new Vector2(0, 0), Color.White);
}
spriteBatch.End();
}
base.Draw(gameTime);
}
}
}
</code>

And here is the result http://imageshack.us/photo/my-images/827/testami.png/


You could easily extend this after accept. (eg added access to constant buffers etc). 
I do a hard work and really want to help monogame !