public static string GetDescription(this ShaderResourceViewDimension value, ShaderInputType shaderInputType,
                                            ResourceReturnType format)
        {
            switch (shaderInputType)
            {
            case ShaderInputType.ByteAddress:
            case ShaderInputType.Structured:
                return("r/o");

            case ShaderInputType.UavRwByteAddress:
            case ShaderInputType.UavRwStructured:
                return("r/w");

            case ShaderInputType.UavRwStructuredWithCounter:
                return("r/w+cnt");

            case ShaderInputType.UavAppendStructured:
                return("append");

            case ShaderInputType.UavConsumeStructured:
                return("consume");

            case ShaderInputType.UavRwTyped:
            default:
                return(value.GetDescription());
            }
        }
示例#2
0
        public static bool IsMultiSampled(this ShaderResourceViewDimension value)
        {
            switch (value)
            {
            case ShaderResourceViewDimension.Texture2DMultiSampled:
            case ShaderResourceViewDimension.Texture2DMultiSampledArray:
                return(true);

            default:
                return(false);
            }
        }
示例#3
0
        public void Init(Device device, int w, int h, Format f, int sc, int sq, bool depth, Format df)
        {
            VramUsage    = 0;
            Multisampled = (sc > 1);
            UseDepth     = depth;
            ResourceUsage               u    = ResourceUsage.Default;
            BindFlags                   b    = BindFlags.RenderTarget | BindFlags.ShaderResource;
            RenderTargetViewDimension   rtvd = RenderTargetViewDimension.Texture2D;
            ShaderResourceViewDimension srvd = ShaderResourceViewDimension.Texture2D;// D3D11_SRV_DIMENSION_TEXTURE2D;
            int       fs = DXUtility.ElementSize(f);
            int       wh = w * h;
            BindFlags db = BindFlags.DepthStencil;// | BindFlags.ShaderResource;// D3D11_BIND_DEPTH_STENCIL;
            DepthStencilViewDimension dsvd = DepthStencilViewDimension.Texture2D;
            Format dtexf = GetDepthTexFormat(df);
            Format dsrvf = GetDepthSrvFormat(df);

            Texture    = DXUtility.CreateTexture2D(device, w, h, 1, 1, f, 1, 0, u, b, 0, 0);
            RTV        = DXUtility.CreateRenderTargetView(device, Texture, f, rtvd, 0, 0, 0);
            SRV        = DXUtility.CreateShaderResourceView(device, Texture, f, srvd, 1, 0, 0, 0);
            VramUsage += (wh * fs);

            if (Multisampled)
            {
                b    = BindFlags.RenderTarget;
                rtvd = RenderTargetViewDimension.Texture2DMultisampled;
                dsvd = DepthStencilViewDimension.Texture2DMultisampled;
                //srvd = ShaderResourceViewDimension.Texture2DMultisampled;

                TextureMS  = DXUtility.CreateTexture2D(device, w, h, 1, 1, f, sc, sq, u, b, 0, 0);
                MSRTV      = DXUtility.CreateRenderTargetView(device, TextureMS, f, rtvd, 0, 0, 0);
                VramUsage += (wh * fs) * sc;

                if (depth)
                {
                    DepthMS = DXUtility.CreateTexture2D(device, w, h, 1, 1, dtexf, sc, sq, u, db, 0, 0);
                    MSDSV   = DXUtility.CreateDepthStencilView(device, DepthMS, df, dsvd);
                    //DepthSRV = DXUtility.CreateShaderResourceView(device, DepthMS, dsrvf, srvd, 1, 0, 0, 0);
                    VramUsage += (wh * DXUtility.ElementSize(df)) * sc;
                }
            }
            else
            {
                if (depth)
                {
                    Depth = DXUtility.CreateTexture2D(device, w, h, 1, 1, dtexf, sc, sq, u, db, 0, 0);
                    DSV   = DXUtility.CreateDepthStencilView(device, Depth, df, dsvd);
                    //DepthSRV = DXUtility.CreateShaderResourceView(device, Depth, dsrvf, srvd, 1, 0, 0, 0);
                    VramUsage += (wh * DXUtility.ElementSize(df));
                }
            }
        }
示例#4
0
        public void Init(Device device, int w, int h, int count, Format f, bool depth, Format df, int multisamplecount)
        {
            Count            = count;
            VramUsage        = 0;
            UseDepth         = depth;
            MultisampleCount = multisamplecount;
            Multisampled     = (multisamplecount > 1);
            ResourceUsage               u    = ResourceUsage.Default;
            BindFlags                   b    = BindFlags.RenderTarget | BindFlags.ShaderResource;
            int                         fs   = DXUtility.ElementSize(f);
            int                         wh   = w * h;
            BindFlags                   db   = BindFlags.DepthStencil | BindFlags.ShaderResource; // D3D11_BIND_DEPTH_STENCIL;
            RenderTargetViewDimension   rtvd = RenderTargetViewDimension.Texture2D;
            ShaderResourceViewDimension srvd = ShaderResourceViewDimension.Texture2D;             // D3D11_SRV_DIMENSION_TEXTURE2D;
            DepthStencilViewDimension   dsvd = DepthStencilViewDimension.Texture2D;

            if (Multisampled)
            {
                rtvd = RenderTargetViewDimension.Texture2DMultisampled;
                srvd = ShaderResourceViewDimension.Texture2DMultisampled;
                dsvd = DepthStencilViewDimension.Texture2DMultisampled;
            }

            Textures = new Texture2D[count];
            RTVs     = new RenderTargetView[count];
            SRVs     = new ShaderResourceView[count];

            for (int i = 0; i < count; i++)
            {
                Textures[i] = DXUtility.CreateTexture2D(device, w, h, 1, 1, f, multisamplecount, 0, u, b, 0, 0);
                RTVs[i]     = DXUtility.CreateRenderTargetView(device, Textures[i], f, rtvd, 0, 0, 0);
                SRVs[i]     = DXUtility.CreateShaderResourceView(device, Textures[i], f, srvd, 1, 0, 0, 0);
                VramUsage  += (wh * fs) * multisamplecount;
            }
            if (depth)
            {
                Format dtexf = GpuTexture.GetDepthTexFormat(df);
                Format dsrvf = GpuTexture.GetDepthSrvFormat(df);
                Depth      = DXUtility.CreateTexture2D(device, w, h, 1, 1, dtexf, multisamplecount, 0, u, db, 0, 0);
                DSV        = DXUtility.CreateDepthStencilView(device, Depth, df, dsvd);
                DepthSRV   = DXUtility.CreateShaderResourceView(device, Depth, dsrvf, srvd, 1, 0, 0, 0);
                VramUsage += (wh * DXUtility.ElementSize(df)) * multisamplecount;
            }
        }
示例#5
0
    /// <summary>
    /// Initializes a new instance of the <see cref="ShaderResourceViewDescription1"/> struct.
    /// </summary>
    /// <param name="viewDimension">The <see cref="ShaderResourceViewDimension"/></param>
    /// <param name="format">The <see cref="DXGI.Format"/> to use or <see cref="Format.Unknown"/>.</param>
    /// <param name="mostDetailedMip">Index of the most detailed mipmap level to use or first element for <see cref="ShaderResourceViewDimension.Buffer"/> or <see cref="ShaderResourceViewDimension.BufferExtended"/>.</param>
    /// <param name="mipLevels">The maximum number of mipmap levels for the view of the texture or num elements for <see cref="ShaderResourceViewDimension.Buffer"/> or <see cref="ShaderResourceViewDimension.BufferExtended"/>.</param>
    /// <param name="firstArraySlice">The index of the first texture to use in an array of textures or First2DArrayFace for <see cref="ShaderResourceViewDimension.TextureCubeArray"/>. </param>
    /// <param name="arraySize">Number of textures in the array or num cubes for <see cref="ShaderResourceViewDimension.TextureCubeArray"/>. </param>
    /// <param name="flags"><see cref="BufferExtendedShaderResourceViewFlags"/> for <see cref="ShaderResourceViewDimension.BufferExtended"/>.</param>
    /// <param name="planeSlice"></param>
    public ShaderResourceViewDescription1(
        ShaderResourceViewDimension viewDimension,
        Format format       = Format.Unknown,
        int mostDetailedMip = 0,
        int mipLevels       = -1,
        int firstArraySlice = 0,
        int arraySize       = -1,
        BufferExtendedShaderResourceViewFlags flags = BufferExtendedShaderResourceViewFlags.None,
        int planeSlice = 0) : this()
    {
        Format        = format;
        ViewDimension = viewDimension;
        switch (viewDimension)
        {
        case ShaderResourceViewDimension.Buffer:
            Buffer.FirstElement = mostDetailedMip;
            Buffer.NumElements  = mipLevels;
            break;

        case ShaderResourceViewDimension.Texture1D:
            Texture1D.MostDetailedMip = mostDetailedMip;
            Texture1D.MipLevels       = mipLevels;
            break;

        case ShaderResourceViewDimension.Texture1DArray:
            Texture1DArray.MostDetailedMip = mostDetailedMip;
            Texture1DArray.MipLevels       = mipLevels;
            Texture1DArray.FirstArraySlice = firstArraySlice;
            Texture1DArray.ArraySize       = arraySize;
            break;

        case ShaderResourceViewDimension.Texture2D:
            Texture2D.MostDetailedMip = mostDetailedMip;
            Texture2D.MipLevels       = mipLevels;
            Texture2D.PlaneSlice      = planeSlice;
            break;

        case ShaderResourceViewDimension.Texture2DArray:
            Texture2DArray.MostDetailedMip = mostDetailedMip;
            Texture2DArray.MipLevels       = mipLevels;
            Texture2DArray.FirstArraySlice = firstArraySlice;
            Texture2DArray.ArraySize       = arraySize;
            Texture2DArray.PlaneSlice      = planeSlice;
            break;

        case ShaderResourceViewDimension.Texture2DMultisampled:
            break;

        case ShaderResourceViewDimension.Texture2DMultisampledArray:
            Texture2DMSArray.FirstArraySlice = firstArraySlice;
            Texture2DMSArray.ArraySize       = arraySize;
            break;

        case ShaderResourceViewDimension.Texture3D:
            Texture3D.MostDetailedMip = mostDetailedMip;
            Texture3D.MipLevels       = mipLevels;
            break;

        case ShaderResourceViewDimension.TextureCube:
            TextureCube.MostDetailedMip = mostDetailedMip;
            TextureCube.MipLevels       = mipLevels;
            break;

        case ShaderResourceViewDimension.TextureCubeArray:
            TextureCubeArray.MostDetailedMip  = mostDetailedMip;
            TextureCubeArray.MipLevels        = mipLevels;
            TextureCubeArray.First2DArrayFace = firstArraySlice;
            TextureCubeArray.NumCubes         = arraySize;
            break;

        case ShaderResourceViewDimension.BufferExtended:
            BufferEx.FirstElement = mostDetailedMip;
            BufferEx.NumElements  = mipLevels;
            BufferEx.Flags        = flags;
            break;

        default:
            break;
        }
    }
示例#6
0
    /// <summary>
    /// Initializes a new instance of the <see cref="ShaderResourceViewDescription1"/> struct.
    /// </summary>
    /// <param name="texture"></param>
    /// <param name="viewDimension"></param>
    /// <param name="format"></param>
    /// <param name="mostDetailedMip"></param>
    /// <param name="mipLevels"></param>
    /// <param name="firstArraySlice"></param>
    /// <param name="arraySize"></param>
    /// <param name="planeSlice"></param>
    public ShaderResourceViewDescription1(
        ID3D11Texture2D texture,
        ShaderResourceViewDimension viewDimension,
        Format format       = Format.Unknown,
        int mostDetailedMip = 0,
        int mipLevels       = -1,
        int firstArraySlice = 0,
        int arraySize       = -1,
        int planeSlice      = 0)
        : this()
    {
        ViewDimension = viewDimension;
        if (format == Format.Unknown ||
            (mipLevels == -1 && viewDimension != ShaderResourceViewDimension.Texture2DMultisampled && viewDimension != ShaderResourceViewDimension.Texture2DMultisampledArray) ||
            (arraySize == -1 && (ShaderResourceViewDimension.Texture2DArray == viewDimension || ShaderResourceViewDimension.Texture2DMultisampledArray == viewDimension || ShaderResourceViewDimension.TextureCubeArray == viewDimension)))
        {
            var textureDesc = texture.Description;
            if (format == Format.Unknown)
            {
                format = textureDesc.Format;
            }
            if (-1 == mipLevels)
            {
                mipLevels = textureDesc.MipLevels - mostDetailedMip;
            }
            if (-1 == arraySize)
            {
                arraySize = textureDesc.ArraySize - firstArraySlice;
                if (viewDimension == ShaderResourceViewDimension.TextureCubeArray)
                {
                    arraySize /= 6;
                }
            }
        }
        Format = format;
        switch (viewDimension)
        {
        case ShaderResourceViewDimension.Texture2D:
            Texture2D.MostDetailedMip = mostDetailedMip;
            Texture2D.MipLevels       = mipLevels;
            Texture2D.PlaneSlice      = planeSlice;
            break;

        case ShaderResourceViewDimension.Texture2DArray:
            Texture2DArray.MostDetailedMip = mostDetailedMip;
            Texture2DArray.MipLevels       = mipLevels;
            Texture2DArray.FirstArraySlice = firstArraySlice;
            Texture2DArray.ArraySize       = arraySize;
            Texture2DArray.PlaneSlice      = planeSlice;
            break;

        case ShaderResourceViewDimension.Texture2DMultisampled:
            break;

        case ShaderResourceViewDimension.Texture2DMultisampledArray:
            Texture2DMSArray.FirstArraySlice = firstArraySlice;
            Texture2DMSArray.ArraySize       = arraySize;
            break;

        case ShaderResourceViewDimension.TextureCube:
            TextureCube.MostDetailedMip = mostDetailedMip;
            TextureCube.MipLevels       = mipLevels;
            break;

        case ShaderResourceViewDimension.TextureCubeArray:
            TextureCubeArray.MostDetailedMip  = mostDetailedMip;
            TextureCubeArray.MipLevels        = mipLevels;
            TextureCubeArray.First2DArrayFace = firstArraySlice;
            TextureCubeArray.NumCubes         = arraySize;
            break;

        default:
            break;
        }
    }
示例#7
0
        public static ShaderResourceView CreateShaderResourceView(Device device, Resource resource, Format format, ShaderResourceViewDimension viewDimension, int mipLevels, int mostDetailedMip, int arraySize, int firstArraySlice)
        {
            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription();

            srvd.Format    = format;
            srvd.Dimension = viewDimension;
            switch (viewDimension)
            {
            case ShaderResourceViewDimension.Buffer:    //  D3D11_SRV_DIMENSION_BUFFER:
                srvd.Buffer.ElementOffset = mipLevels;
                srvd.Buffer.ElementWidth  = ElementSize(format);
                srvd.Buffer.ElementCount  = arraySize;
                srvd.Buffer.FirstElement  = firstArraySlice;
                break;

            case ShaderResourceViewDimension.Texture2D:    // D3D11_SRV_DIMENSION_TEXTURE2D:
                srvd.Texture2D.MipLevels       = mipLevels;
                srvd.Texture2D.MostDetailedMip = mostDetailedMip;
                break;

            case ShaderResourceViewDimension.Texture2DArray:    // D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
                srvd.Texture2DArray.MipLevels       = mipLevels;
                srvd.Texture2DArray.MostDetailedMip = mostDetailedMip;
                srvd.Texture2DArray.ArraySize       = arraySize;
                srvd.Texture2DArray.FirstArraySlice = firstArraySlice;
                break;

            case ShaderResourceViewDimension.TextureCube:    // D3D11_SRV_DIMENSION_TEXTURECUBE:
                srvd.TextureCube.MipLevels       = mipLevels;
                srvd.TextureCube.MostDetailedMip = mostDetailedMip;
                break;

            case ShaderResourceViewDimension.Texture3D:    // D3D11_SRV_DIMENSION_TEXTURE3D:
                srvd.Texture3D.MipLevels       = mipLevels;
                srvd.Texture3D.MostDetailedMip = mostDetailedMip;
                break;

            default:
                throw new Exception();     //not implemented....
            }
            ShaderResourceView srv = new ShaderResourceView(device, resource, srvd);

            return(srv);
        }
示例#8
0
        public void Init(Device device, int w, int h, int count, Format f, bool depth, Format df, int multisamplecount)
        {
            Count            = count;
            VramUsage        = 0;
            UseDepth         = depth;
            MultisampleCount = multisamplecount;
            Multisampled     = (multisamplecount > 1);
            ResourceUsage               u    = ResourceUsage.Default;
            BindFlags                   b    = BindFlags.RenderTarget | BindFlags.ShaderResource;
            int                         fs   = DXUtility.ElementSize(f);
            int                         wh   = w * h;
            BindFlags                   db   = BindFlags.DepthStencil | BindFlags.ShaderResource; // D3D11_BIND_DEPTH_STENCIL;
            RenderTargetViewDimension   rtvd = RenderTargetViewDimension.Texture2D;
            ShaderResourceViewDimension srvd = ShaderResourceViewDimension.Texture2D;             // D3D11_SRV_DIMENSION_TEXTURE2D;
            DepthStencilViewDimension   dsvd = DepthStencilViewDimension.Texture2D;

            if (Multisampled)
            {
                rtvd = RenderTargetViewDimension.Texture2DMultisampled;
                srvd = ShaderResourceViewDimension.Texture2DMultisampled;
                dsvd = DepthStencilViewDimension.Texture2DMultisampled;
            }

            Textures = new Texture2D[count];
            RTVs     = new RenderTargetView[count];
            SRVs     = new ShaderResourceView[count];

            for (int i = 0; i < count; i++)
            {
                Textures[i] = DXUtility.CreateTexture2D(device, w, h, 1, 1, f, multisamplecount, 0, u, b, 0, 0);
                RTVs[i]     = DXUtility.CreateRenderTargetView(device, Textures[i], f, rtvd, 0, 0, 0);
                SRVs[i]     = DXUtility.CreateShaderResourceView(device, Textures[i], f, srvd, 1, 0, 0, 0);
                VramUsage  += (wh * fs) * multisamplecount;
            }
            if (depth)
            {
                Format dtexf = Format.R32_Typeless;
                Format dsrvf = Format.R32_Float;
                switch (df)
                {
                case Format.D16_UNorm:
                    dtexf = Format.R16_Typeless;
                    dsrvf = Format.R16_UNorm;
                    break;

                case Format.D24_UNorm_S8_UInt:
                    dtexf = Format.R24G8_Typeless;
                    dsrvf = Format.R24_UNorm_X8_Typeless;
                    break;

                case Format.D32_Float:
                    dtexf = Format.R32_Typeless;
                    dsrvf = Format.R32_Float;
                    break;

                case Format.D32_Float_S8X24_UInt:
                    dtexf = Format.R32G8X24_Typeless;    //is this right? who uses this anyway??
                    dsrvf = Format.R32_Float_X8X24_Typeless;
                    break;
                }

                Depth      = DXUtility.CreateTexture2D(device, w, h, 1, 1, dtexf, multisamplecount, 0, u, db, 0, 0);
                DSV        = DXUtility.CreateDepthStencilView(device, Depth, df, dsvd);
                DepthSRV   = DXUtility.CreateShaderResourceView(device, Depth, dsrvf, srvd, 1, 0, 0, 0);
                VramUsage += (wh * DXUtility.ElementSize(df)) * multisamplecount;
            }
        }