public D3D11TextureView(Device device, ref TextureViewDescription description) : base(ref description) { D3D11Texture d3dTex = Util.AssertSubtype <Texture, D3D11Texture>(description.Target); if (BaseMipLevel == 0 && MipLevels == Target.MipLevels || BaseArrayLayer == 0 && ArrayLayers == Target.ArrayLayers) { ShaderResourceView = d3dTex.GetFullShaderResourceView(); } else { _srvOwned = true; ShaderResourceViewDescription srvDesc = D3D11Util.GetSrvDesc( d3dTex, description.BaseMipLevel, description.MipLevels, description.BaseArrayLayer, description.ArrayLayers); ShaderResourceView = new ShaderResourceView(device, d3dTex.DeviceTexture, srvDesc); } if ((d3dTex.Usage & TextureUsage.Storage) == TextureUsage.Storage) { UnorderedAccessViewDescription uavDesc = new UnorderedAccessViewDescription(); uavDesc.Format = D3D11Formats.GetViewFormat(d3dTex.DxgiFormat); if ((d3dTex.Usage & TextureUsage.Cubemap) == TextureUsage.Cubemap) { throw new NotSupportedException(); } else if (d3dTex.Depth == 1) { if (d3dTex.ArrayLayers == 1) { uavDesc.Dimension = UnorderedAccessViewDimension.Texture2D; uavDesc.Texture2D.MipSlice = (int)description.BaseMipLevel; } else { uavDesc.Dimension = UnorderedAccessViewDimension.Texture2DArray; uavDesc.Texture2DArray.MipSlice = (int)description.BaseMipLevel; uavDesc.Texture2DArray.FirstArraySlice = (int)description.BaseArrayLayer; uavDesc.Texture2DArray.ArraySize = (int)description.ArrayLayers; } } else { uavDesc.Dimension = UnorderedAccessViewDimension.Texture3D; uavDesc.Texture3D.MipSlice = (int)description.BaseMipLevel; uavDesc.Texture3D.FirstWSlice = (int)description.BaseArrayLayer; uavDesc.Texture3D.WSize = (int)description.ArrayLayers; } UnorderedAccessView = new UnorderedAccessView(device, d3dTex.DeviceTexture, uavDesc); } }
protected override void CopyTextureCore( Texture source, uint srcX, uint srcY, uint srcZ, uint srcMipLevel, uint srcBaseArrayLayer, Texture destination, uint dstX, uint dstY, uint dstZ, uint dstMipLevel, uint dstBaseArrayLayer, uint width, uint height, uint depth, uint layerCount) { D3D11Texture srcD3D11Texture = Util.AssertSubtype <Texture, D3D11Texture>(source); D3D11Texture dstD3D11Texture = Util.AssertSubtype <Texture, D3D11Texture>(destination); uint blockSize = FormatHelpers.IsCompressedFormat(source.Format) ? 4u : 1u; uint clampedWidth = Math.Max(blockSize, width); uint clampedHeight = Math.Max(blockSize, height); ResourceRegion region = new ResourceRegion( (int)srcX, (int)srcY, (int)srcZ, (int)(srcX + clampedWidth), (int)(srcY + clampedHeight), (int)(srcZ + depth)); for (uint i = 0; i < layerCount; i++) { int srcSubresource = D3D11Util.ComputeSubresource(srcMipLevel, source.MipLevels, srcBaseArrayLayer + i); int dstSubresource = D3D11Util.ComputeSubresource(dstMipLevel, destination.MipLevels, dstBaseArrayLayer + i); _context.CopySubresourceRegion( srcD3D11Texture.DeviceTexture, srcSubresource, region, dstD3D11Texture.DeviceTexture, dstSubresource, (int)dstX, (int)dstY, (int)dstZ); } }
protected override void CopyTextureCore( Texture source, uint srcX, uint srcY, uint srcZ, uint srcMipLevel, uint srcBaseArrayLayer, Texture destination, uint dstX, uint dstY, uint dstZ, uint dstMipLevel, uint dstBaseArrayLayer, uint width, uint height, uint depth, uint layerCount) { D3D11Texture srcD3D11Texture = Util.AssertSubtype <Texture, D3D11Texture>(source); D3D11Texture dstD3D11Texture = Util.AssertSubtype <Texture, D3D11Texture>(destination); ResourceRegion region = new ResourceRegion( (int)srcX, (int)srcY, (int)srcZ, (int)(srcX + width), (int)(srcY + height), (int)(srcZ + depth)); for (uint i = 0; i < layerCount; i++) { int srcSubresource = D3D11Util.ComputeSubresource(srcMipLevel, source.MipLevels, srcBaseArrayLayer + i); int dstSubresource = D3D11Util.ComputeSubresource(dstMipLevel, destination.MipLevels, dstBaseArrayLayer + i); _context.CopySubresourceRegion( srcD3D11Texture.DeviceTexture, srcSubresource, region, dstD3D11Texture.DeviceTexture, dstSubresource, (int)dstX, (int)dstY, (int)dstZ); } }
protected unsafe override void UpdateTextureCore( Texture texture, IntPtr source, uint sizeInBytes, uint x, uint y, uint z, uint width, uint height, uint depth, uint mipLevel, uint arrayLayer) { D3D11Texture d3dTex = Util.AssertSubtype <Texture, D3D11Texture>(texture); bool useMap = (texture.Usage & TextureUsage.Staging) == TextureUsage.Staging; if (useMap) { uint subresource = texture.CalculateSubresource(mipLevel, arrayLayer); MappedResourceCacheKey key = new MappedResourceCacheKey(texture, subresource); MappedResource map = MapCore(texture, MapMode.Write, subresource); uint denseRowSize = FormatHelpers.GetRowPitch(width, texture.Format); uint denseSliceSize = FormatHelpers.GetDepthPitch(denseRowSize, height, texture.Format); Util.CopyTextureRegion( source.ToPointer(), 0, 0, 0, denseRowSize, denseSliceSize, map.Data.ToPointer(), x, y, z, map.RowPitch, map.DepthPitch, width, height, depth, texture.Format); UnmapCore(texture, subresource); } else { int subresource = D3D11Util.ComputeSubresource(mipLevel, texture.MipLevels, arrayLayer); ResourceRegion resourceRegion = new ResourceRegion( left: (int)x, right: (int)(x + width), top: (int)y, front: (int)z, bottom: (int)(y + height), back: (int)(z + depth)); uint srcRowPitch = FormatHelpers.GetSizeInBytes(texture.Format) * width; uint srcDepthPitch = srcRowPitch * depth; lock (_immediateContextLock) { _immediateContext.UpdateSubresource( d3dTex.DeviceTexture, subresource, resourceRegion, source, (int)srcRowPitch, (int)srcDepthPitch); } } }
public D3D11TextureView(D3D11GraphicsDevice gd, ref TextureViewDescription description) : base(ref description) { ID3D11Device device = gd.Device; D3D11Texture d3dTex = Util.AssertSubtype <Texture, D3D11Texture>(description.Target); ShaderResourceViewDescription srvDesc = D3D11Util.GetSrvDesc( d3dTex, description.BaseMipLevel, description.MipLevels, description.BaseArrayLayer, description.ArrayLayers, Format); ShaderResourceView = device.CreateShaderResourceView(d3dTex.DeviceTexture, srvDesc); if ((d3dTex.Usage & TextureUsage.Storage) == TextureUsage.Storage) { UnorderedAccessViewDescription uavDesc = new UnorderedAccessViewDescription(); uavDesc.Format = D3D11Formats.GetViewFormat(d3dTex.DxgiFormat); if ((d3dTex.Usage & TextureUsage.Cubemap) == TextureUsage.Cubemap) { throw new NotSupportedException(); } else if (d3dTex.Depth == 1) { if (d3dTex.ArrayLayers == 1) { if (d3dTex.Type == TextureType.Texture1D) { uavDesc.ViewDimension = UnorderedAccessViewDimension.Texture1D; uavDesc.Texture1D.MipSlice = (int)description.BaseMipLevel; } else { uavDesc.ViewDimension = UnorderedAccessViewDimension.Texture2D; uavDesc.Texture2D.MipSlice = (int)description.BaseMipLevel; } } else { if (d3dTex.Type == TextureType.Texture1D) { uavDesc.ViewDimension = UnorderedAccessViewDimension.Texture1DArray; uavDesc.Texture1DArray.MipSlice = (int)description.BaseMipLevel; uavDesc.Texture1DArray.FirstArraySlice = (int)description.BaseArrayLayer; uavDesc.Texture1DArray.ArraySize = (int)description.ArrayLayers; } else { uavDesc.ViewDimension = UnorderedAccessViewDimension.Texture2DArray; uavDesc.Texture2DArray.MipSlice = (int)description.BaseMipLevel; uavDesc.Texture2DArray.FirstArraySlice = (int)description.BaseArrayLayer; uavDesc.Texture2DArray.ArraySize = (int)description.ArrayLayers; } } } else { uavDesc.ViewDimension = UnorderedAccessViewDimension.Texture3D; uavDesc.Texture3D.MipSlice = (int)description.BaseMipLevel; // Map the entire range of the 3D texture. uavDesc.Texture3D.FirstWSlice = 0; uavDesc.Texture3D.WSize = (int)d3dTex.Depth; } UnorderedAccessView = device.CreateUnorderedAccessView(d3dTex.DeviceTexture, uavDesc); } }