private void DisposeTexture()
 {
     if (this.lasttexture != null)
     {
         this.lasttexture.Dispose(); this.lasttexture = null;
     }
 }
        public DX11MipSliceRenderTarget(DX11RenderContext context, DX11Texture3D texture, int mipindex,int w, int h,int d)
        {
            this.context = context;

            RenderTargetViewDescription rtd = new RenderTargetViewDescription()
            {
                Dimension = RenderTargetViewDimension.Texture3D,
                Format = texture.Format,
                MipSlice = mipindex,
                DepthSliceCount = d           
            };

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription();
            srvd.Dimension = ShaderResourceViewDimension.Texture3D;
            srvd.MipLevels = 1;
            srvd.MostDetailedMip = mipindex;
            srvd.Format = texture.Format;

            this.RTV = new RenderTargetView(context.Device, texture.Resource, rtd);
            this.SRV = new ShaderResourceView(context.Device, texture.Resource, srvd);

            this.Width = w;
            this.Height = h;
            this.Depth = d;
        }
        public DX11MipSliceRenderTarget3D(DX11RenderContext context, DX11Texture3D texture, int mipindex, int w, int h, int d)
            : base(context)
        {
            this.Resource = texture.Resource;

            RenderTargetViewDescription rtd = new RenderTargetViewDescription()
            {
                Dimension = RenderTargetViewDimension.Texture3D,
                Format = texture.Format,
                MipSlice = mipindex,
                DepthSliceCount = d
            };

            UnorderedAccessViewDescription uavd = new UnorderedAccessViewDescription()
            {
                Dimension = UnorderedAccessViewDimension.Texture3D,
                Format = texture.Format,
                MipSlice = mipindex,
                FirstDepthSlice = 0,
                DepthSliceCount = d
            };

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription();
            srvd.Dimension = ShaderResourceViewDimension.Texture3D;
            srvd.MipLevels = 1;
            srvd.MostDetailedMip = mipindex;
            srvd.Format = texture.Format;
            srvd.ArraySize = d;
            srvd.FirstArraySlice = 0;

            this.RTV = new RenderTargetView(context.Device, texture.Resource, rtd);
            this.SRV = new ShaderResourceView(context.Device, texture.Resource, srvd);
            this.UAV = new UnorderedAccessView(context.Device, texture.Resource, uavd);

            this.Width = w;
            this.Height = h;
            this.Depth = d;
        }
        public void Present()
        {
            DX11RenderContext context = this.RenderContext;

            //Rendering is finished, so should be ok to grab texture now
            if (this.FTextureInput.IsConnected && this.FTextureInput.SliceCount > 0 && this.FTextureInput[0].Contains(context))
            {
                DX11Texture3D texture = this.FTextureInput[0][context];

                if (texture != null)
                {
                    if (this.lasttexture != null)
                    {
                        if (this.lasttexture.Resource.Description != texture.Resource.Description)
                        {
                            this.DisposeTexture();
                        }
                    }

                    if (this.lasttexture == null)
                    {
                        this.lasttexture = DX11Texture3D.FromDescription(context, texture.Resource.Description);
                    }

                    context.CurrentDeviceContext.CopyResource(texture.Resource, this.lasttexture.Resource);

                    if (this.FInFlush[0])
                    {
                        context.CurrentDeviceContext.Flush();
                    }
                }
            }
            else
            {
                this.DisposeTexture();
            }
        }