Пример #1
0
        public DX11ResourcePoolEntry <DX11DepthStencil> Lock(int w, int h, Format format, SampleDescription sd)
        {
            foreach (DX11ResourcePoolEntry <DX11DepthStencil> entry in this.pool)
            {
                DX11DepthStencil tr = entry.Element;

                if (!entry.IsLocked && tr.Width == w && tr.Format == DepthFormatsHelper.GetGenericTextureFormat(format) && tr.Height == h &&
                    tr.Resource.Description.SampleDescription.Count == sd.Count &&
                    tr.Resource.Description.SampleDescription.Quality == sd.Quality)
                {
                    entry.Lock();
                    return(entry);
                }
            }

            DX11DepthStencil res = new DX11DepthStencil(this.context, w, h, sd, format);

            DX11ResourcePoolEntry <DX11DepthStencil> newentry = new DX11ResourcePoolEntry <DX11DepthStencil>(res);

            this.pool.Add(newentry);

            return(newentry);
        }
Пример #2
0
        public DX11DepthTextureArray(DX11RenderContext context, int w, int h, int elemcnt, Format format, bool buildslices = true)
        {
            this.context = context;

            this.original = format;

            var texBufferDesc = new Texture2DDescription
            {
                ArraySize         = elemcnt,
                BindFlags         = BindFlags.DepthStencil | BindFlags.ShaderResource,
                CpuAccessFlags    = CpuAccessFlags.None,
                Format            = DepthFormatsHelper.GetGenericTextureFormat(format),
                Height            = h,
                Width             = w,
                OptionFlags       = ResourceOptionFlags.None,
                SampleDescription = new SampleDescription(1, 0),
                Usage             = ResourceUsage.Default,
            };

            this.Resource = new Texture2D(context.Device, texBufferDesc);

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription()
            {
                ArraySize       = elemcnt,
                FirstArraySlice = 0,
                Dimension       = ShaderResourceViewDimension.Texture2DArray,
                Format          = DepthFormatsHelper.GetSRVFormat(format),
                MipLevels       = 1,
                MostDetailedMip = 0
            };

            this.SRV = new ShaderResourceView(context.Device, this.Resource, srvd);

            DepthStencilViewDescription dsvd = new DepthStencilViewDescription()
            {
                ArraySize       = elemcnt,
                FirstArraySlice = 0,
                Format          = DepthFormatsHelper.GetDepthFormat(format),
                Dimension       = DepthStencilViewDimension.Texture2DArray,
                MipSlice        = 0
            };

            this.DSV = new DepthStencilView(context.Device, this.Resource, dsvd);

            dsvd.Flags = DepthStencilViewFlags.ReadOnlyDepth;
            if (format == Format.D24_UNorm_S8_UInt)
            {
                dsvd.Flags |= DepthStencilViewFlags.ReadOnlyStencil;
            }

            this.ReadOnlyDSV = new DepthStencilView(context.Device, this.Resource, dsvd);

            this.desc = texBufferDesc;

            this.SliceDSV = new DX11SliceDepthStencil[this.ElemCnt];

            if (buildslices)
            {
                for (int i = 0; i < this.ElemCnt; i++)
                {
                    this.SliceDSV[i] = new DX11SliceDepthStencil(this.context, this, i, DepthFormatsHelper.GetDepthFormat(format));
                }
            }
        }
Пример #3
0
        public DX11DepthStencil(DX11RenderContext context, int w, int h, SampleDescription sd, Format format)
        {
            this.context = context;
            var depthBufferDesc = new Texture2DDescription
            {
                ArraySize         = 1,
                BindFlags         = BindFlags.DepthStencil | BindFlags.ShaderResource,
                CpuAccessFlags    = CpuAccessFlags.None,
                Format            = DepthFormatsHelper.GetGenericTextureFormat(format),
                Height            = h,
                Width             = w,
                MipLevels         = 1,
                OptionFlags       = ResourceOptionFlags.None,
                SampleDescription = sd,
                Usage             = ResourceUsage.Default
            };

            this.Resource = new Texture2D(context.Device, depthBufferDesc);

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription()
            {
                ArraySize       = 1,
                Format          = DepthFormatsHelper.GetSRVFormat(format),
                Dimension       = sd.Count == 1 ? ShaderResourceViewDimension.Texture2D : ShaderResourceViewDimension.Texture2DMultisampled,
                MipLevels       = 1,
                MostDetailedMip = 0
            };

            this.SRV = new ShaderResourceView(context.Device, this.Resource, srvd);


            if (format == Format.D24_UNorm_S8_UInt || format == Format.D32_Float_S8X24_UInt)
            {
                ShaderResourceViewDescription stencild = new ShaderResourceViewDescription()
                {
                    ArraySize       = 1,
                    Format          = format == Format.D24_UNorm_S8_UInt ? SlimDX.DXGI.Format.X24_Typeless_G8_UInt : Format.X32_Typeless_G8X24_UInt,
                    Dimension       = sd.Count == 1 ? ShaderResourceViewDimension.Texture2D : ShaderResourceViewDimension.Texture2DMultisampled,
                    MipLevels       = 1,
                    MostDetailedMip = 0
                };

                this.stencilview = new ShaderResourceView(this.context.Device, this.Resource, stencild);

                this.Stencil = DX11Texture2D.FromTextureAndSRV(this.context, this.Resource, this.stencilview);
            }
            else
            {
                //Just pass depth instead
                this.Stencil = DX11Texture2D.FromTextureAndSRV(this.context, this.Resource, this.SRV);
            }

            DepthStencilViewDescription dsvd = new DepthStencilViewDescription()
            {
                Format    = DepthFormatsHelper.GetDepthFormat(format),
                Dimension = sd.Count == 1 ? DepthStencilViewDimension.Texture2D : DepthStencilViewDimension.Texture2DMultisampled,
                MipSlice  = 0
            };

            this.DSV = new DepthStencilView(context.Device, this.Resource, dsvd);

            //Read only dsv only supported in dx11 minimum
            if (context.IsFeatureLevel11)
            {
                dsvd.Flags = DepthStencilViewFlags.ReadOnlyDepth;
                if (format == Format.D24_UNorm_S8_UInt || format == Format.D32_Float_S8X24_UInt)
                {
                    dsvd.Flags |= DepthStencilViewFlags.ReadOnlyStencil;
                }

                this.ReadOnlyDSV = new DepthStencilView(context.Device, this.Resource, dsvd);
            }

            this.desc    = depthBufferDesc;
            this.isowner = true;
        }
Пример #4
0
        public DX11CubeDepthStencil(DX11RenderContext context, int size, SampleDescription sd, Format format)
        {
            this.context = context;

            var texBufferDesc = new Texture2DDescription
            {
                ArraySize         = 6,
                BindFlags         = BindFlags.DepthStencil | BindFlags.ShaderResource,
                CpuAccessFlags    = CpuAccessFlags.None,
                Format            = DepthFormatsHelper.GetGenericTextureFormat(format),
                Height            = size,
                Width             = size,
                OptionFlags       = ResourceOptionFlags.TextureCube,
                SampleDescription = sd,
                Usage             = ResourceUsage.Default,
                MipLevels         = 1
            };

            this.Resource = new Texture2D(context.Device, texBufferDesc);

            this.desc = texBufferDesc;

            //Create faces SRV/RTV
            this.SliceDSV = new DX11SliceDepthStencil[6];

            ShaderResourceViewDescription svd = new ShaderResourceViewDescription()
            {
                Dimension        = ShaderResourceViewDimension.TextureCube,
                Format           = DepthFormatsHelper.GetSRVFormat(format),
                MipLevels        = 1,
                MostDetailedMip  = 0,
                First2DArrayFace = 0
            };

            DepthStencilViewDescription dsvd = new DepthStencilViewDescription()
            {
                ArraySize       = 6,
                Dimension       = DepthStencilViewDimension.Texture2DArray,
                FirstArraySlice = 0,
                Format          = DepthFormatsHelper.GetDepthFormat(format),
                MipSlice        = 0
            };

            this.DSV = new DepthStencilView(context.Device, this.Resource, dsvd);

            if (context.IsFeatureLevel11)
            {
                dsvd.Flags = DepthStencilViewFlags.ReadOnlyDepth;
                if (format == Format.D24_UNorm_S8_UInt)
                {
                    dsvd.Flags |= DepthStencilViewFlags.ReadOnlyStencil;
                }

                this.ReadOnlyDSV = new DepthStencilView(context.Device, this.Resource, dsvd);
            }

            this.SRV = new ShaderResourceView(context.Device, this.Resource, svd);

            for (int i = 0; i < 6; i++)
            {
                this.SliceDSV[i] = new DX11SliceDepthStencil(context, this, i, DepthFormatsHelper.GetDepthFormat(format));
            }
        }