Exemple #1
0
        public static Texture2D CreateTexture_BGRA4444(GraphicsDevice graphicsDevice, int width, int height)
        {
            var t2d = new Texture2D(graphicsDevice, width, height, false, SurfaceFormat.Bgra4444);

            Texture2DDescription description = new Texture2DDescription
            {
                Width          = t2d.Width,
                Height         = t2d.Height,
                MipLevels      = 1,
                ArraySize      = 1,
                Format         = DXGI_FORMAT_B4G4R4A4_UNORM,
                BindFlags      = BindFlags.ShaderResource,
                CpuAccessFlags = CpuAccessFlags.None
            };
            var _device = t2d.GraphicsDevice._d3dDevice();

            var _textureField = typeof(Texture)
                                .GetField("_texture", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

            description.SampleDescription.Count   = 1;
            description.SampleDescription.Quality = 0;
            description.Usage       = ResourceUsage.Default;
            description.OptionFlags = ResourceOptionFlags.None;

            Resource res    = new SharpDX.Direct3D11.Texture2D(_device, description);
            Resource oldRes = _textureField.GetValue(t2d) as Resource;

            SharpDX.Utilities.Dispose(ref oldRes);
            _textureField.SetValue(t2d, res);

            return(t2d);
        }
Exemple #2
0
        public static void GetTexture_BGRA4444 <T>(this Texture2D texture, int level, int arraySlice, Rectangle?rect, T[] data, int startIndex, int elementCount) where T : struct
        {
            int num  = Math.Max(texture.Width >> level, 1);
            int num2 = Math.Max(texture.Height >> level, 1);
            Texture2DDescription description = new Texture2DDescription
            {
                Width          = num,
                Height         = num2,
                MipLevels      = 1,
                ArraySize      = 1,
                Format         = DXGI_FORMAT_B4G4R4A4_UNORM,
                BindFlags      = BindFlags.None,
                CpuAccessFlags = CpuAccessFlags.Read
            };

            description.SampleDescription.Count   = 1;
            description.SampleDescription.Quality = 0;
            description.Usage       = ResourceUsage.Staging;
            description.OptionFlags = ResourceOptionFlags.None;

            DeviceContext context = texture.GraphicsDevice._d3dContext();

            using (SharpDX.Direct3D11.Texture2D textured = new SharpDX.Direct3D11.Texture2D(texture.GraphicsDevice._d3dDevice(), description))
            {
                lock (context)
                {
                    int width;
                    int height;
                    SharpDX.DataStream stream;
                    int sourceSubresource = 0;
                    if (rect.HasValue)
                    {
                        width  = rect.Value.Width;
                        height = rect.Value.Height;
                        context.CopySubresourceRegion(texture.GetTexture(), sourceSubresource, new ResourceRegion(rect.Value.Left, rect.Value.Top, 0, rect.Value.Right, rect.Value.Bottom, 1), textured, 0, 0, 0, 0);
                    }
                    else
                    {
                        width  = num;
                        height = texture.Height;
                        context.CopySubresourceRegion(texture.GetTexture(), sourceSubresource, null, textured, 0, 0, 0, 0);
                    }
                    SharpDX.DataBox box  = context.MapSubresource(textured, 0, MapMode.Read, MapFlags.None, out stream);
                    int             num7 = 2 * width;
                    if (num7 == box.RowPitch)
                    {
                        stream.ReadRange <T>(data, startIndex, elementCount);
                    }
                    else
                    {
                        stream.Seek((long)startIndex, SeekOrigin.Begin);
                        int num8 = Marshal.SizeOf(typeof(T));
                        for (int i = 0; i < height; i++)
                        {
                            int index = (i * num7) / num8;
                            while (index < (((i + 1) * num7) / num8))
                            {
                                data[index] = stream.Read <T>();
                                index++;
                            }
                            if (index >= elementCount)
                            {
                                break;
                            }
                            stream.Seek((long)(box.RowPitch - num7), SeekOrigin.Current);
                        }
                    }
                    stream.Dispose();
                }
            }
        }