Beispiel #1
0
        public void LoadFromLoadInfo(IO.Files.Texture.TextureLoadInfo loadInfo)
        {
            var totalMips = loadInfo.Layers.Count;

            if (loadInfo.GenerateMipMaps)
            {
                var l2H = (int)Math.Log(loadInfo.Height, 2);
                var l2W = (int)Math.Log(loadInfo.Width, 2);
                totalMips = Math.Min(l2H, l2W) + 1;
            }

            var texDesc = new Texture2DDescription
            {
                ArraySize         = 1,
                BindFlags         = BindFlags.ShaderResource,
                CpuAccessFlags    = CpuAccessFlags.None,
                Format            = loadInfo.Format,
                Height            = loadInfo.Height,
                Width             = loadInfo.Width,
                MipLevels         = totalMips,
                OptionFlags       = ResourceOptionFlags.None,
                SampleDescription = new SampleDescription(1, 0),
                Usage             = loadInfo.Usage
            };

            if (mTexture != gDefaultTexture)
            {
                if (mTexture != null)
                {
                    mTexture.Dispose();
                }
                if (NativeView != null)
                {
                    NativeView.Dispose();
                }
            }

            var boxes   = new DataBox[loadInfo.Layers.Count];
            var streams = new DataStream[loadInfo.Layers.Count];

            try
            {
                if (!loadInfo.GenerateMipMaps)
                {
                    for (var i = 0; i < loadInfo.Layers.Count; ++i)
                    {
                        streams[i] = new DataStream(loadInfo.Layers[i].Length, true, true);
                        streams[i].WriteRange(loadInfo.Layers[i]);
                        streams[i].Position = 0;
                        boxes[i]            = new DataBox(streams[i].DataPointer, loadInfo.RowPitchs[i], 0);
                    }

                    mTexture = new Texture2D(mContext.Device, texDesc, boxes);
                }
                else
                {
                    texDesc.Usage        = ResourceUsage.Default;
                    texDesc.OptionFlags |= ResourceOptionFlags.GenerateMipMaps;
                    texDesc.BindFlags   |= BindFlags.RenderTarget;

                    mTexture = new Texture2D(mContext.Device, texDesc);
                    mContext.Context.UpdateSubresource(loadInfo.Layers[0], mTexture, 0, loadInfo.RowPitchs[0]);
                }

                var srvd = new ShaderResourceViewDescription
                {
                    Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D,
                    Format    = loadInfo.Format,
                    Texture2D = new ShaderResourceViewDescription.Texture2DResource
                    {
                        MipLevels       = texDesc.MipLevels,
                        MostDetailedMip = 0
                    }
                };

                NativeView = new ShaderResourceView(mContext.Device, mTexture, srvd);
                if (loadInfo.GenerateMipMaps)
                {
                    mContext.Context.GenerateMips(NativeView);
                }
            }
            finally
            {
                foreach (var stream in streams)
                {
                    if (stream != null)
                    {
                        stream.Dispose();
                    }
                }
            }
        }
Beispiel #2
0
        public void LoadFromLoadInfo(IO.Files.Texture.TextureLoadInfo loadInfo)
        {
            var texDesc = new Texture2DDescription
            {
                ArraySize         = 1,
                BindFlags         = BindFlags.ShaderResource,
                CpuAccessFlags    = CpuAccessFlags.None,
                Format            = loadInfo.Format,
                Height            = loadInfo.Height,
                Width             = loadInfo.Width,
                MipLevels         = loadInfo.Layers.Count,
                OptionFlags       = ResourceOptionFlags.None,
                SampleDescription = new SampleDescription(1, 0),
                Usage             = ResourceUsage.Default
            };

            if (mTexture != gDefaultTexture)
            {
                if (mTexture != null)
                {
                    mTexture.Dispose();
                }
                if (NativeView != null)
                {
                    NativeView.Dispose();
                }
            }

            var boxes   = new DataBox[texDesc.MipLevels];
            var streams = new DataStream[texDesc.MipLevels];

            try
            {
                for (var i = 0; i < texDesc.MipLevels; ++i)
                {
                    streams[i] = new DataStream(loadInfo.Layers[i].Length, true, true);
                    streams[i].WriteRange(loadInfo.Layers[i]);
                    streams[i].Position = 0;
                    boxes[i]            = new DataBox(streams[i].DataPointer, loadInfo.RowPitchs[i], 0);
                }

                mTexture = new Texture2D(mContext.Device, texDesc, boxes);
                var srvd = new ShaderResourceViewDescription
                {
                    Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D,
                    Format    = loadInfo.Format,
                    Texture2D = new ShaderResourceViewDescription.Texture2DResource {
                        MipLevels = boxes.Length, MostDetailedMip = 0
                    }
                };

                NativeView = new ShaderResourceView(mContext.Device, mTexture, srvd);
            }
            finally
            {
                foreach (var stream in streams)
                {
                    if (stream != null)
                    {
                        stream.Dispose();
                    }
                }
            }
        }