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()); } }
public static bool IsMultiSampled(this ShaderResourceViewDimension value) { switch (value) { case ShaderResourceViewDimension.Texture2DMultiSampled: case ShaderResourceViewDimension.Texture2DMultiSampledArray: return(true); default: return(false); } }
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)); } } }
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; } }
/// <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; } }
/// <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; } }
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); }
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; } }