internal Texture2d(SlimDX.Direct3D11.Device device, string fileName) { #if ASSERT if (device == null) { throw new ArgumentNullException("device"); } #endif texture2d = SlimDX.Direct3D11.Texture2D.FromFile(device, fileName); shaderResourceView = new SlimDX.Direct3D11.ShaderResourceView(device, texture2d); uniqueId = new UniqueId<Texture2d>(); }
public void Dispose() { if (shaderResourceView != null) { shaderResourceView.Dispose(); shaderResourceView = null; } if (texture2d != null) { texture2d.Dispose(); texture2d = null; } }
public void SetRenderTargetDX11(SlimDX.Direct3D11.Texture2D renderTarget) { if (this.RenderTarget != null) { this.RenderTarget = null; base.Lock(); base.SetBackBuffer(D3DResourceType.IDirect3DSurface9, IntPtr.Zero); base.Unlock(); } if (renderTarget == null) { return; } if (!IsShareable(renderTarget)) { throw new ArgumentException("Texture must be created with ResourceOptionFlags.Shared"); } Format format = DX11ImageSource.TranslateFormat(renderTarget); if (format == Format.Unknown) { throw new ArgumentException("Texture format is not compatible with OpenSharedResource"); } IntPtr handle = GetSharedHandle(renderTarget); if (handle == IntPtr.Zero) { throw new ArgumentNullException("Handle"); } this.RenderTarget = new Texture(DX11ImageSource.D3DDevice, renderTarget.Description.Width, renderTarget.Description.Height, 1, Usage.RenderTarget, format, Pool.Default, ref handle); this.RenderTargetSurface = this.RenderTarget.GetSurfaceLevel(0); base.Lock(); base.SetBackBuffer(D3DResourceType.IDirect3DSurface9, RenderTargetSurface.ComPointer); // Changed NativePtr to ComPtr base.Unlock(); }
private void CreateCharTable(byte bytePrefix) { var TableDesc = new CharTableDescription(); //Get appropriate texture size int sizeX = (int)(Font.FontSize * 12); sizeX = (int)Math.Pow(2, Math.Ceiling(Math.Log(sizeX, 2))); //Try how many lines are needed: var tl = new TextLayout[256]; int line = 0, xPos = 0, yPos = 0; for (int i = 0; i < 256; ++i) { tl[i] = new TextLayout(ModelEx.FontManager.Instance.WriteFactory, Convert.ToChar(i + (bytePrefix << 8)).ToString(), Font); int charWidth = 2 + (int)Math.Ceiling(tl[i].Metrics.LayoutWidth + tl[i].OverhangMetrics.Left + tl[i].OverhangMetrics.Right); int charHeight = 2 + (int)Math.Ceiling(tl[i].Metrics.LayoutHeight + tl[i].OverhangMetrics.Top + tl[i].OverhangMetrics.Bottom); line = Math.Max(line, charHeight); if (xPos + charWidth >= sizeX) { xPos = 0; yPos += line; line = 0; } xPos += charWidth; } int sizeY = (int)(line + yPos); sizeY = (int)Math.Pow(2, Math.Ceiling(Math.Log(sizeY, 2))); //Create Texture var TexDesc = new Texture2DDescription() { ArraySize = 1, BindFlags = BindFlags.ShaderResource | BindFlags.RenderTarget, CpuAccessFlags = CpuAccessFlags.None, Format = Format.R8G8B8A8_UNorm, Height = sizeY, Width = sizeX, MipLevels = 1, OptionFlags = ResourceOptionFlags.Shared, SampleDescription = new SampleDescription(1, 0), Usage = ResourceUsage.Default }; var texture = new Texture2D(ModelEx.FontManager.Instance.D3DDevice10, TexDesc); var rtv = new RenderTargetView(ModelEx.FontManager.Instance.D3DDevice10, texture); ModelEx.FontManager.Instance.D3DDevice10.ClearRenderTargetView(rtv, new SlimDX.Color4(0, 1, 1, 1)); //D3DDevice10.ClearRenderTargetView(rtv, new SlimDX.Color4(1, 0, 0, 0)); Surface surface = texture.AsSurface(); var target = RenderTarget.FromDXGI(ModelEx.FontManager.Instance.D2DFactory, surface, rtp); var color = new SolidColorBrush(target, new SlimDX.Color4(1, 1, 1, 1)); target.BeginDraw(); line = 0; xPos = 0; yPos = 0; //for (int i = 0; i < 256; ++i) for (int i = 0; i < 256; ++i) { //1 additional pixel on each side int charWidth = 2 + (int)Math.Ceiling(tl[i].Metrics.LayoutWidth + tl[i].OverhangMetrics.Left + tl[i].OverhangMetrics.Right); int charHeight = 2 + (int)Math.Ceiling(tl[i].Metrics.LayoutHeight + tl[i].OverhangMetrics.Top + tl[i].OverhangMetrics.Bottom); line = Math.Max(line, charHeight); if (xPos + charWidth >= sizeX) { xPos = 0; yPos += line; line = 0; } var charDesc = new CharDescription(); charDesc.CharSize = new Vector2(tl[i].Metrics.WidthIncludingTrailingWhitespace, tl[i].Metrics.Height); charDesc.OverhangLeft = tl[i].OverhangMetrics.Left + 1; charDesc.OverhangTop = tl[i].OverhangMetrics.Top + 1; //Make XPos + CD.Overhang.Left an integer number in order to draw at integer positions charDesc.OverhangLeft += (float)Math.Ceiling(xPos + charDesc.OverhangLeft) - (xPos + charDesc.OverhangLeft); //Make YPos + CD.Overhang.Top an integer number in order to draw at integer positions charDesc.OverhangTop += (float)Math.Ceiling(yPos + charDesc.OverhangTop) - (yPos + charDesc.OverhangTop); charDesc.OverhangRight = charWidth - charDesc.CharSize.X - charDesc.OverhangLeft; charDesc.OverhangBottom = charHeight - charDesc.CharSize.Y - charDesc.OverhangTop; charDesc.TexCoordsStart = new Vector2(((float)xPos / sizeX), ((float)yPos / sizeY)); charDesc.TexCoordsSize = new Vector2((float)charWidth / sizeX, (float)charHeight / sizeY); charDesc.TableDescription = TableDesc; TableDesc.Chars[i] = charDesc; target.DrawTextLayout(new PointF(xPos + charDesc.OverhangLeft, yPos + charDesc.OverhangTop), tl[i], color); xPos += charWidth; tl[i].Dispose(); } target.EndDraw(); color.Dispose(); //This is a workaround for Windows 8.1 machines. //If these lines would not be present, the shared resource would be empty. //TODO: find a nicer solution using (var ms = new MemoryStream()) Texture2D.ToStream(texture, ImageFileFormat.Bmp, ms); System.Threading.Monitor.Enter(D3DDevice11); var dxgiResource = new SlimDX.DXGI.Resource(texture); SlimDX.Direct3D11.Texture2D Texture11; if (PixCompatible) { Texture11 = new SlimDX.Direct3D11.Texture2D(D3DDevice11, new SlimDX.Direct3D11.Texture2DDescription() { ArraySize = 1, BindFlags = SlimDX.Direct3D11.BindFlags.ShaderResource | SlimDX.Direct3D11.BindFlags.RenderTarget, CpuAccessFlags = SlimDX.Direct3D11.CpuAccessFlags.None, Format = Format.R8G8B8A8_UNorm, Height = sizeY, Width = sizeX, MipLevels = 1, OptionFlags = SlimDX.Direct3D11.ResourceOptionFlags.Shared, SampleDescription = new SampleDescription(1, 0), Usage = SlimDX.Direct3D11.ResourceUsage.Default }); } else { Texture11 = D3DDevice11.OpenSharedResource <SlimDX.Direct3D11.Texture2D>(dxgiResource.SharedHandle); } var srv = new SlimDX.Direct3D11.ShaderResourceView(D3DDevice11, Texture11); TableDesc.Texture = Texture11; TableDesc.SRV = srv; rtv.Dispose(); System.Threading.Monitor.Exit(D3DDevice11); System.Diagnostics.Debug.WriteLine("Created Char Table " + bytePrefix + " in " + sizeX + " x " + sizeY); //System.Threading.Monitor.Enter(D3DDevice11); //SlimDX.Direct3D11.Texture2D.SaveTextureToFile(Sprite.Device.ImmediateContext, Texture11, SlimDX.Direct3D11.ImageFileFormat.Png, Font.FontFamilyName + "Table" + BytePrefix + ".png"); //System.Threading.Monitor.Exit(D3DDevice11); CharTables.Add(bytePrefix, TableDesc); dxgiResource.Dispose(); target.Dispose(); surface.Dispose(); texture.Dispose(); }
private static bool IsShareable(SlimDX.Direct3D11.Texture2D Texture) { return((Texture.Description.OptionFlags & SlimDX.Direct3D11.ResourceOptionFlags.Shared) != 0); }
public TextRenderer(Device device) { using (var factory = new SlimDX.DXGI.Factory1()) { using (var adapter = factory.GetAdapter1(0)) { this.device = new SlimDX.Direct3D10_1.Device1( adapter, SlimDX.Direct3D10.DriverType.Hardware, SlimDX.Direct3D10.DeviceCreationFlags.BgraSupport, SlimDX.Direct3D10_1.FeatureLevel.Level_10_0 ); // Create the DirectX11 texture2D. This texture will be shared with the DirectX10 // device. The DirectX10 device will be used to render text onto this texture. DirectX11 // will then draw this texture (blended) onto the screen. // The KeyedMutex flag is required in order to share this resource. textureD3D11 = new SlimDX.Direct3D11.Texture2D(device.Handle, new SlimDX.Direct3D11.Texture2DDescription { Width = device.Form.Width, Height = device.Form.Height, MipLevels = 1, ArraySize = 1, Format = SlimDX.DXGI.Format.B8G8R8A8_UNorm, SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0), Usage = SlimDX.Direct3D11.ResourceUsage.Default, BindFlags = SlimDX.Direct3D11.BindFlags.RenderTarget | SlimDX.Direct3D11.BindFlags.ShaderResource, CpuAccessFlags = SlimDX.Direct3D11.CpuAccessFlags.None, OptionFlags = SlimDX.Direct3D11.ResourceOptionFlags.KeyedMutex }); // A DirectX10 Texture2D sharing the DirectX11 Texture2D var sharedResource = new SlimDX.DXGI.Resource(textureD3D11); var textureD3D10 = this.device.OpenSharedResource<SlimDX.Direct3D10.Texture2D>(sharedResource.SharedHandle); // The KeyedMutex is used just prior to writing to textureD3D11 or textureD3D10. // This is how DirectX knows which DirectX (10 or 11) is supposed to be writing // to the shared texture. The keyedMutex is just defined here, they will be used // a bit later. mutex10 = new SlimDX.DXGI.KeyedMutex(textureD3D10); mutex11 = new SlimDX.DXGI.KeyedMutex(textureD3D11); // Direct2D Factory SlimDX.Direct2D.Factory d2Factory = new SlimDX.Direct2D.Factory( SlimDX.Direct2D.FactoryType.SingleThreaded, SlimDX.Direct2D.DebugLevel.Information ); // Direct Write factory SlimDX.DirectWrite.Factory dwFactory = new SlimDX.DirectWrite.Factory( SlimDX.DirectWrite.FactoryType.Isolated ); // The textFormat we will use to draw text with textFormat = new SlimDX.DirectWrite.TextFormat( dwFactory, "Arial", SlimDX.DirectWrite.FontWeight.Normal, SlimDX.DirectWrite.FontStyle.Normal, SlimDX.DirectWrite.FontStretch.Normal, 24, "en-US" ); textFormat.TextAlignment = SlimDX.DirectWrite.TextAlignment.Center; textFormat.ParagraphAlignment = SlimDX.DirectWrite.ParagraphAlignment.Center; // Query for a IDXGISurface. // DirectWrite and DirectX10 can interoperate thru DXGI. var surface = textureD3D10.AsSurface(); var rtp = new SlimDX.Direct2D.RenderTargetProperties(); rtp.MinimumFeatureLevel = SlimDX.Direct2D.FeatureLevel.Direct3D10; rtp.Type = SlimDX.Direct2D.RenderTargetType.Hardware; rtp.Usage = SlimDX.Direct2D.RenderTargetUsage.None; rtp.PixelFormat = new SlimDX.Direct2D.PixelFormat(SlimDX.DXGI.Format.Unknown, SlimDX.Direct2D.AlphaMode.Premultiplied); dwRenderTarget = SlimDX.Direct2D.RenderTarget.FromDXGI(d2Factory, surface, rtp); // Brush used to DrawText brushSolidWhite = new SlimDX.Direct2D.SolidColorBrush( dwRenderTarget, new SlimDX.Color4(1, 1, 1, 1) ); // Think of the shared textureD3D10 as an overlay. // The overlay needs to show the text but let the underlying triangle (or whatever) // show thru, which is accomplished by blending. var bsd = new SlimDX.Direct3D11.BlendStateDescription(); bsd.RenderTargets[0].BlendEnable = true; bsd.RenderTargets[0].SourceBlend = SlimDX.Direct3D11.BlendOption.SourceAlpha; bsd.RenderTargets[0].DestinationBlend = SlimDX.Direct3D11.BlendOption.InverseSourceAlpha; bsd.RenderTargets[0].BlendOperation = SlimDX.Direct3D11.BlendOperation.Add; bsd.RenderTargets[0].SourceBlendAlpha = SlimDX.Direct3D11.BlendOption.One; bsd.RenderTargets[0].DestinationBlendAlpha = SlimDX.Direct3D11.BlendOption.Zero; bsd.RenderTargets[0].BlendOperationAlpha = SlimDX.Direct3D11.BlendOperation.Add; bsd.RenderTargets[0].RenderTargetWriteMask = SlimDX.Direct3D11.ColorWriteMaskFlags.All; BlendState_Transparent = SlimDX.Direct3D11.BlendState.FromDescription(device.Handle, bsd); // Load Effect. This includes both the vertex and pixel shaders. // Also can include more than one technique. var shaderByteCode = SlimDX.D3DCompiler.ShaderBytecode.CompileFromFile( "texteffect.fx", "fx_5_0", SlimDX.D3DCompiler.ShaderFlags.EnableStrictness, SlimDX.D3DCompiler.EffectFlags.None); effect = new SlimDX.Direct3D11.Effect(device.Handle, shaderByteCode); // create triangle vertex data, making sure to rewind the stream afterward var verticesTriangle = new SlimDX.DataStream(30 * 3, true, true); verticesTriangle.Write(new SlimDX.Vector3(0.0f, 0.5f, 0.5f)); verticesTriangle.Write(new SlimDX.Color4(1.0f, 0.0f, 0.0f, 1.0f)); verticesTriangle.Write(new SlimDX.Vector3(0.5f, -0.5f, 0.5f)); verticesTriangle.Write(new SlimDX.Color4(0.0f, 1.0f, 0.0f, 1.0f)); verticesTriangle.Write(new SlimDX.Vector3(-0.5f, -0.5f, 0.5f)); verticesTriangle.Write(new SlimDX.Color4(0.0f, 0.0f, 1.0f, 1.0f)); verticesTriangle.Position = 0; // create the triangle vertex layout and buffer var inputElements = new SlimDX.Direct3D11.InputElement[] { new SlimDX.Direct3D11.InputElement("POSITION", 0, SlimDX.DXGI.Format.R32G32B32A32_Float, 0, 0), new SlimDX.Direct3D11.InputElement("COLOR",0,SlimDX.DXGI.Format.R32G32B32A32_Float,16,0) }; var layoutColor = new SlimDX.Direct3D11.InputLayout(device.Handle, effect.GetTechniqueByName("Color").GetPassByIndex(0).Description.Signature, inputElements); var vertexBufferColor = new SlimDX.Direct3D11.Buffer(device.Handle, verticesTriangle, (int)verticesTriangle.Length, SlimDX.Direct3D11.ResourceUsage.Default, SlimDX.Direct3D11.BindFlags.VertexBuffer, SlimDX.Direct3D11.CpuAccessFlags.None, SlimDX.Direct3D11.ResourceOptionFlags.None, 0); verticesTriangle.Close(); // create text vertex data, making sure to rewind the stream afterward // Top Left of screen is -1, +1 // Bottom Right of screen is +1, -1 var verticesText = new SlimDX.DataStream(30 * 4, true, true); verticesText.Write(new SlimDX.Vector3(-1, 1, 0)); verticesText.Write(new SlimDX.Vector2(0, 0f)); verticesText.Write(new SlimDX.Vector3(1, 1, 0)); verticesText.Write(new SlimDX.Vector2(1, 0)); verticesText.Write(new SlimDX.Vector3(-1, -1, 0)); verticesText.Write(new SlimDX.Vector2(0, 1)); verticesText.Write(new SlimDX.Vector3(1, -1, 0)); verticesText.Write(new SlimDX.Vector2(1, 1)); verticesText.Position = 0; // create the text vertex layout and buffer layoutText = new SlimDX.Direct3D11.InputLayout(device.Handle, effect.GetTechniqueByName("Text").GetPassByIndex(0).Description.Signature, inputElements); vertexBufferText = new SlimDX.Direct3D11.Buffer(device.Handle, verticesText, (int)verticesText.Length, SlimDX.Direct3D11.ResourceUsage.Default, SlimDX.Direct3D11.BindFlags.VertexBuffer, SlimDX.Direct3D11.CpuAccessFlags.None, SlimDX.Direct3D11.ResourceOptionFlags.None, 0); verticesText.Close(); } } }
public static SlimDX.Direct3D11.Texture2D TextureFromColor(SlimDX.Direct3D11.Device device, Color4 color, out SlimDX.Direct3D11.ShaderResourceView srv) { /*SlimDX.Direct3D11.Texture2DDescription desc2 = new SlimDX.Direct3D11.Texture2DDescription(); desc2.SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0); desc2.Width = 1; desc2.Height = 1; desc2.MipLevels = 1; desc2.ArraySize = 1; desc2.Format = SlimDX.DXGI.Format.R8G8B8A8_UNorm; desc2.Usage = SlimDX.Direct3D11.ResourceUsage.Dynamic; desc2.BindFlags = SlimDX.Direct3D11.BindFlags.ShaderResource; desc2.CpuAccessFlags = SlimDX.Direct3D11.CpuAccessFlags.Write; SlimDX.Direct3D11.Texture2D texture = new SlimDX.Direct3D11.Texture2D(device, desc2); // fill the texture with rgba values DataRectangle rect = texture.AsSurface().Map(SlimDX.DXGI.MapFlags.Write | SlimDX.DXGI.MapFlags.Discard); if (rect.Data.CanWrite) { for (int row = 0; row < texture.Description.Height; row++) { int rowStart = row * rect.Pitch; rect.Data.Seek(rowStart, System.IO.SeekOrigin.Begin); for (int col = 0; col < texture.Description.Width; col++) { rect.Data.WriteByte((byte)(color.Red * 255)); rect.Data.WriteByte((byte)(color.Green * 255)); rect.Data.WriteByte((byte)(color.Blue * 255)); rect.Data.WriteByte((byte)(color.Alpha * 255)); } } } texture.AsSurface().Unmap(); texture.AsSurface().Dispose(); srv = GetShaderResourceView(device, texture);*/ SlimDX.Direct3D11.Texture2DDescription desc2 = new SlimDX.Direct3D11.Texture2DDescription(); desc2.SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0); desc2.Width = 1; desc2.Height = 1; desc2.MipLevels = 1; desc2.ArraySize = 1; desc2.Format = SlimDX.DXGI.Format.R8G8B8A8_UNorm; desc2.Usage = SlimDX.Direct3D11.ResourceUsage.Default; desc2.BindFlags = SlimDX.Direct3D11.BindFlags.ShaderResource; desc2.CpuAccessFlags = SlimDX.Direct3D11.CpuAccessFlags.None; // fill the texture with rgba values DataStream stream = new DataStream(sizeof(byte) * 4, false, true); stream.WriteByte((byte)(color.Red * 255)); stream.WriteByte((byte)(color.Green * 255)); stream.WriteByte((byte)(color.Blue * 255)); stream.WriteByte((byte)(color.Alpha * 255)); stream.Position = 0; SlimDX.Direct3D11.Texture2D texture = new SlimDX.Direct3D11.Texture2D(device, desc2, new DataRectangle(1, stream)); srv = GetShaderResourceView(device, texture); return texture; }