public override TextureSampleCount GetSampleCountLimit(PixelFormat format, bool depthFormat) { Format dxgiFormat = D3D11Formats.ToDxgiFormat(format, depthFormat); if (CheckFormatMultisample(dxgiFormat, 32)) { return(TextureSampleCount.Count32); } else if (CheckFormatMultisample(dxgiFormat, 16)) { return(TextureSampleCount.Count16); } else if (CheckFormatMultisample(dxgiFormat, 8)) { return(TextureSampleCount.Count8); } else if (CheckFormatMultisample(dxgiFormat, 4)) { return(TextureSampleCount.Count4); } else if (CheckFormatMultisample(dxgiFormat, 2)) { return(TextureSampleCount.Count2); } return(TextureSampleCount.Count1); }
public D3D11Framebuffer(Device device, ref FramebufferDescription description) : base(description.DepthTarget, description.ColorTargets) { if (description.DepthTarget != null) { D3D11Texture d3dDepthTarget = Util.AssertSubtype <Texture, D3D11Texture>(description.DepthTarget); DepthStencilViewDescription dsvDesc = new DepthStencilViewDescription() { Dimension = DepthStencilViewDimension.Texture2D, Format = D3D11Formats.GetDepthFormat(d3dDepthTarget.Format) }; DepthStencilView = new DepthStencilView(device, d3dDepthTarget.DeviceTexture, dsvDesc); } if (description.ColorTargets != null && description.ColorTargets.Length > 0) { RenderTargetViews = new RenderTargetView[description.ColorTargets.Length]; for (int i = 0; i < RenderTargetViews.Length; i++) { D3D11Texture d3dColorTarget = Util.AssertSubtype <Texture, D3D11Texture>(description.ColorTargets[i]); RenderTargetViewDescription rtvDesc = new RenderTargetViewDescription { Format = D3D11Formats.ToDxgiFormat(d3dColorTarget.Format, false), Dimension = RenderTargetViewDimension.Texture2D, }; RenderTargetViews[i] = new RenderTargetView(device, d3dColorTarget.DeviceTexture, rtvDesc); } } else { RenderTargetViews = Array.Empty <RenderTargetView>(); } }
protected override void SetIndexBufferCore(DeviceBuffer buffer, IndexFormat format) { if (_ib != buffer) { _ib = buffer; D3D11Buffer d3d11Buffer = Util.AssertSubtype <DeviceBuffer, D3D11Buffer>(buffer); _context.InputAssembler.SetIndexBuffer(d3d11Buffer.Buffer, D3D11Formats.ToDxgiFormat(format), 0); } }
public override void SetIndexBuffer(IndexBuffer ib) { if (_ib != ib) { _ib = ib; D3D11IndexBuffer d3d11Buffer = Util.AssertSubtype <IndexBuffer, D3D11IndexBuffer>(ib); _context.InputAssembler.SetIndexBuffer(d3d11Buffer.Buffer, D3D11Formats.ToDxgiFormat(ib.Format), 0); } }
internal static ShaderResourceViewDescription GetSrvDesc( D3D11Texture tex, uint baseMipLevel, uint levelCount, uint baseArrayLayer, uint layerCount, PixelFormat format) { ShaderResourceViewDescription srvDesc = new ShaderResourceViewDescription(); srvDesc.Format = D3D11Formats.GetViewFormat( D3D11Formats.ToDxgiFormat(format, (tex.Usage & TextureUsage.DepthStencil) != 0)); if ((tex.Usage & TextureUsage.Cubemap) == TextureUsage.Cubemap) { if (tex.ArrayLayers == 1) { srvDesc.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.TextureCube; srvDesc.TextureCube.MostDetailedMip = (int)baseMipLevel; srvDesc.TextureCube.MipLevels = (int)levelCount; } else { srvDesc.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.TextureCubeArray; srvDesc.TextureCubeArray.MostDetailedMip = (int)baseMipLevel; srvDesc.TextureCubeArray.MipLevels = (int)levelCount; srvDesc.TextureCubeArray.First2DArrayFace = (int)baseArrayLayer; srvDesc.TextureCubeArray.CubeCount = (int)tex.ArrayLayers; } } else if (tex.Depth == 1) { if (tex.ArrayLayers == 1) { srvDesc.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D; srvDesc.Texture2D.MostDetailedMip = (int)baseMipLevel; srvDesc.Texture2D.MipLevels = (int)levelCount; } else { srvDesc.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2DArray; srvDesc.Texture2DArray.MostDetailedMip = (int)baseMipLevel; srvDesc.Texture2DArray.MipLevels = (int)levelCount; srvDesc.Texture2DArray.FirstArraySlice = (int)baseArrayLayer; srvDesc.Texture2DArray.ArraySize = (int)layerCount; } } else { srvDesc.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture3D; srvDesc.Texture3D.MostDetailedMip = (int)baseMipLevel; srvDesc.Texture3D.MipLevels = (int)levelCount; } return(srvDesc); }
public D3D11Texture(Device device, ref TextureDescription description) { Width = description.Width; Height = description.Height; Depth = description.Depth; MipLevels = description.MipLevels; ArrayLayers = description.ArrayLayers; Format = description.Format; Usage = description.Usage; SharpDX.DXGI.Format dxgiFormat = D3D11Formats.ToDxgiFormat( description.Format, (description.Usage & TextureUsage.DepthStencil) == TextureUsage.DepthStencil); BindFlags bindFlags = BindFlags.None; if ((description.Usage & TextureUsage.RenderTarget) == TextureUsage.RenderTarget) { bindFlags |= BindFlags.RenderTarget; } if ((description.Usage & TextureUsage.DepthStencil) == TextureUsage.DepthStencil) { bindFlags |= BindFlags.DepthStencil; } if ((description.Usage & TextureUsage.Sampled) == TextureUsage.Sampled) { bindFlags |= BindFlags.ShaderResource; } ResourceOptionFlags optionFlags = ResourceOptionFlags.None; int arraySize = (int)description.ArrayLayers; if ((description.Usage & TextureUsage.Cubemap) == TextureUsage.Cubemap) { optionFlags = ResourceOptionFlags.TextureCube; arraySize *= 6; } Texture2DDescription deviceDescription = new Texture2DDescription() { Width = (int)description.Width, Height = (int)description.Height, MipLevels = (int)description.MipLevels, ArraySize = arraySize, Format = dxgiFormat, BindFlags = bindFlags, CpuAccessFlags = CpuAccessFlags.None, Usage = ResourceUsage.Default, SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), OptionFlags = optionFlags, }; DeviceTexture = new Texture2D(device, deviceDescription); }
public D3D11Texture(Texture2D existingTexture, TextureType type, PixelFormat format) { _device = existingTexture.Device; DeviceTexture = existingTexture; Width = (uint)existingTexture.Description.Width; Height = (uint)existingTexture.Description.Height; Depth = 1; MipLevels = (uint)existingTexture.Description.MipLevels; ArrayLayers = (uint)existingTexture.Description.ArraySize; Format = format; SampleCount = FormatHelpers.GetSampleCount((uint)existingTexture.Description.SampleDescription.Count); Type = type; Usage = D3D11Formats.GetVdUsage( existingTexture.Description.BindFlags, existingTexture.Description.CpuAccessFlags, existingTexture.Description.OptionFlags); DxgiFormat = D3D11Formats.ToDxgiFormat( format, (Usage & TextureUsage.DepthStencil) == TextureUsage.DepthStencil); }
private InputLayout CreateNewInputLayout(VertexLayoutDescription[] vertexLayouts, byte[] vsBytecode) { int totalCount = 0; for (int i = 0; i < vertexLayouts.Length; i++) { totalCount += vertexLayouts[i].Elements.Length; } int element = 0; // Total element index across slots. InputElement[] elements = new InputElement[totalCount]; SemanticIndices si = new SemanticIndices(); for (int slot = 0; slot < vertexLayouts.Length; slot++) { VertexElementDescription[] elementDescs = vertexLayouts[slot].Elements; uint stepRate = vertexLayouts[slot].InstanceStepRate; int currentOffset = 0; for (int i = 0; i < elementDescs.Length; i++) { VertexElementDescription desc = elementDescs[i]; elements[element] = new InputElement( GetSemanticString(desc.Semantic), SemanticIndices.GetAndIncrement(ref si, desc.Semantic), D3D11Formats.ToDxgiFormat(desc.Format), currentOffset, slot, stepRate == 0 ? InputClassification.PerVertexData : InputClassification.PerInstanceData, (int)stepRate); currentOffset += (int)FormatHelpers.GetSizeInBytes(desc.Format); element += 1; } } return(new InputLayout(_device, vsBytecode, elements)); }
protected override bool GetPixelFormatSupportCore( PixelFormat format, TextureType type, TextureUsage usage, out PixelFormatProperties properties) { if (D3D11Formats.IsUnsupportedFormat(format)) { properties = default(PixelFormatProperties); return(false); } Format dxgiFormat = D3D11Formats.ToDxgiFormat(format, (usage & TextureUsage.DepthStencil) != 0); FormatSupport fs = _device.CheckFormatSupport(dxgiFormat); if ((usage & TextureUsage.RenderTarget) != 0 && (fs & FormatSupport.RenderTarget) == 0 || (usage & TextureUsage.DepthStencil) != 0 && (fs & FormatSupport.DepthStencil) == 0 || (usage & TextureUsage.Sampled) != 0 && (fs & FormatSupport.ShaderSample) == 0 || (usage & TextureUsage.Cubemap) != 0 && (fs & FormatSupport.TextureCube) == 0 || (usage & TextureUsage.Storage) != 0 && (fs & FormatSupport.TypedUnorderedAccessView) == 0) { properties = default(PixelFormatProperties); return(false); } const uint MaxTextureDimension = 16384; const uint MaxVolumeExtent = 2048; uint sampleCounts = 0; if (CheckFormatMultisample(dxgiFormat, 1)) { sampleCounts |= (1 << 0); } if (CheckFormatMultisample(dxgiFormat, 2)) { sampleCounts |= (1 << 1); } if (CheckFormatMultisample(dxgiFormat, 4)) { sampleCounts |= (1 << 2); } if (CheckFormatMultisample(dxgiFormat, 8)) { sampleCounts |= (1 << 3); } if (CheckFormatMultisample(dxgiFormat, 16)) { sampleCounts |= (1 << 4); } if (CheckFormatMultisample(dxgiFormat, 32)) { sampleCounts |= (1 << 5); } properties = new PixelFormatProperties( MaxTextureDimension, type == TextureType.Texture1D ? 1 : MaxTextureDimension, type != TextureType.Texture3D ? 1 : MaxVolumeExtent, uint.MaxValue, type == TextureType.Texture3D ? 1 : MaxVolumeExtent, sampleCounts); return(true); }
public D3D11Texture(Device device, ref TextureDescription description) { _device = device; Width = description.Width; Height = description.Height; Depth = description.Depth; MipLevels = description.MipLevels; ArrayLayers = description.ArrayLayers; Format = description.Format; Usage = description.Usage; Type = description.Type; SampleCount = description.SampleCount; DxgiFormat = D3D11Formats.ToDxgiFormat( description.Format, (description.Usage & TextureUsage.DepthStencil) == TextureUsage.DepthStencil); CpuAccessFlags cpuFlags = CpuAccessFlags.None; ResourceUsage resourceUsage = ResourceUsage.Default; BindFlags bindFlags = BindFlags.None; ResourceOptionFlags optionFlags = ResourceOptionFlags.None; if ((description.Usage & TextureUsage.RenderTarget) == TextureUsage.RenderTarget) { bindFlags |= BindFlags.RenderTarget; } if ((description.Usage & TextureUsage.DepthStencil) == TextureUsage.DepthStencil) { bindFlags |= BindFlags.DepthStencil; } if ((description.Usage & TextureUsage.Sampled) == TextureUsage.Sampled) { bindFlags |= BindFlags.ShaderResource; } if ((description.Usage & TextureUsage.Storage) == TextureUsage.Storage) { bindFlags |= BindFlags.UnorderedAccess; } if ((description.Usage & TextureUsage.Staging) == TextureUsage.Staging) { cpuFlags = CpuAccessFlags.Read | CpuAccessFlags.Write; resourceUsage = ResourceUsage.Staging; } if ((description.Usage & TextureUsage.GenerateMipmaps) != 0) { bindFlags |= BindFlags.RenderTarget | BindFlags.ShaderResource; optionFlags |= ResourceOptionFlags.GenerateMipMaps; } int arraySize = (int)description.ArrayLayers; if ((description.Usage & TextureUsage.Cubemap) == TextureUsage.Cubemap) { optionFlags = ResourceOptionFlags.TextureCube; arraySize *= 6; } if (Type == TextureType.Texture1D) { Texture1DDescription desc1D = new Texture1DDescription() { Width = (int)description.Width, MipLevels = (int)description.MipLevels, ArraySize = arraySize, Format = DxgiFormat, BindFlags = bindFlags, CpuAccessFlags = cpuFlags, Usage = resourceUsage, OptionFlags = optionFlags, }; DeviceTexture = new Texture1D(device, desc1D); } else if (Type == TextureType.Texture2D) { Texture2DDescription deviceDescription = new Texture2DDescription() { Width = (int)description.Width, Height = (int)description.Height, MipLevels = (int)description.MipLevels, ArraySize = arraySize, Format = DxgiFormat, BindFlags = bindFlags, CpuAccessFlags = cpuFlags, Usage = resourceUsage, SampleDescription = new SharpDX.DXGI.SampleDescription((int)FormatHelpers.GetSampleCountUInt32(SampleCount), 0), OptionFlags = optionFlags, }; DeviceTexture = new Texture2D(device, deviceDescription); } else { Debug.Assert(Type == TextureType.Texture3D); Texture3DDescription desc3D = new Texture3DDescription() { Width = (int)description.Width, Height = (int)description.Height, Depth = (int)description.Depth, MipLevels = (int)description.MipLevels, Format = DxgiFormat, BindFlags = bindFlags, CpuAccessFlags = cpuFlags, Usage = resourceUsage, OptionFlags = optionFlags, }; DeviceTexture = new Texture3D(device, desc3D); } }
public D3D11Framebuffer(Device device, ref FramebufferDescription description) : base(description.DepthTarget, description.ColorTargets) { if (description.DepthTarget != null) { D3D11Texture d3dDepthTarget = Util.AssertSubtype <Texture, D3D11Texture>(description.DepthTarget.Value.Target); DepthStencilViewDescription dsvDesc = new DepthStencilViewDescription() { Format = D3D11Formats.GetDepthFormat(d3dDepthTarget.Format), }; if (d3dDepthTarget.ArrayLayers == 1) { if (d3dDepthTarget.SampleCount == TextureSampleCount.Count1) { dsvDesc.Dimension = DepthStencilViewDimension.Texture2D; dsvDesc.Texture2D.MipSlice = (int)description.DepthTarget.Value.MipLevel; } else { dsvDesc.Dimension = DepthStencilViewDimension.Texture2DMultisampled; } } else { if (d3dDepthTarget.SampleCount == TextureSampleCount.Count1) { dsvDesc.Dimension = DepthStencilViewDimension.Texture2DArray; dsvDesc.Texture2DArray.FirstArraySlice = (int)description.DepthTarget.Value.ArrayLayer; dsvDesc.Texture2DArray.ArraySize = 1; dsvDesc.Texture2DArray.MipSlice = (int)description.DepthTarget.Value.MipLevel; } else { dsvDesc.Dimension = DepthStencilViewDimension.Texture2DMultisampledArray; dsvDesc.Texture2DMSArray.FirstArraySlice = (int)description.DepthTarget.Value.ArrayLayer; dsvDesc.Texture2DMSArray.ArraySize = 1; } } DepthStencilView = new DepthStencilView(device, d3dDepthTarget.DeviceTexture, dsvDesc); } if (description.ColorTargets != null && description.ColorTargets.Length > 0) { RenderTargetViews = new RenderTargetView[description.ColorTargets.Length]; for (int i = 0; i < RenderTargetViews.Length; i++) { D3D11Texture d3dColorTarget = Util.AssertSubtype <Texture, D3D11Texture>(description.ColorTargets[i].Target); RenderTargetViewDescription rtvDesc = new RenderTargetViewDescription { Format = D3D11Formats.ToDxgiFormat(d3dColorTarget.Format, false), }; if (d3dColorTarget.ArrayLayers > 1 || (d3dColorTarget.Usage & TextureUsage.Cubemap) != 0) { if (d3dColorTarget.SampleCount == TextureSampleCount.Count1) { rtvDesc.Dimension = RenderTargetViewDimension.Texture2DArray; rtvDesc.Texture2DArray = new RenderTargetViewDescription.Texture2DArrayResource { ArraySize = 1, FirstArraySlice = (int)description.ColorTargets[i].ArrayLayer, MipSlice = (int)description.ColorTargets[i].MipLevel }; } else { rtvDesc.Dimension = RenderTargetViewDimension.Texture2DMultisampledArray; rtvDesc.Texture2DMSArray = new RenderTargetViewDescription.Texture2DMultisampledArrayResource { ArraySize = 1, FirstArraySlice = (int)description.ColorTargets[i].ArrayLayer }; } } else { if (d3dColorTarget.SampleCount == TextureSampleCount.Count1) { rtvDesc.Dimension = RenderTargetViewDimension.Texture2D; rtvDesc.Texture2D.MipSlice = (int)description.ColorTargets[i].MipLevel; } else { rtvDesc.Dimension = RenderTargetViewDimension.Texture2DMultisampled; } } RenderTargetViews[i] = new RenderTargetView(device, d3dColorTarget.DeviceTexture, rtvDesc); } } else { RenderTargetViews = Array.Empty <RenderTargetView>(); } }