protected override void UnmapCore(MappableResource resource, uint subresource) { MappedResourceCacheKey key = new MappedResourceCacheKey(resource, subresource); bool commitUnmap; lock (_mappedResourceLock) { if (!_mappedResources.TryGetValue(key, out MappedResourceInfo info)) { throw new VeldridException($"The given resource ({resource}) is not mapped."); } info.RefCount -= 1; commitUnmap = info.RefCount == 0; if (commitUnmap) { lock (_immediateContextLock) { if (resource is D3D11Buffer buffer) { _immediateContext.UnmapSubresource(buffer.Buffer, 0); } else { D3D11Texture texture = Util.AssertSubtype <MappableResource, D3D11Texture>(resource); _immediateContext.UnmapSubresource(texture.DeviceTexture, (int)subresource); } bool result = _mappedResources.Remove(key); Debug.Assert(result); } } } }
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); } } }
protected override MappedResource MapCore(MappableResource resource, MapMode mode, uint subresource) { MappedResourceCacheKey key = new MappedResourceCacheKey(resource, subresource); lock (_mappedResourceLock) { if (_mappedResources.TryGetValue(key, out MappedResourceInfo info)) { if (info.Mode != mode) { throw new VeldridException("The given resource was already mapped with a different MapMode."); } info.RefCount += 1; _mappedResources[key] = info; } else { // No current mapping exists -- create one. if (resource is D3D11Buffer buffer) { lock (_immediateContextLock) { DataBox db = _immediateContext.MapSubresource( buffer.Buffer, 0, D3D11Formats.VdToD3D11MapMode((buffer.Usage & BufferUsage.Dynamic) == BufferUsage.Dynamic, mode), SharpDX.Direct3D11.MapFlags.None); info.MappedResource = new MappedResource(resource, mode, db.DataPointer, buffer.SizeInBytes); info.RefCount = 1; info.Mode = mode; _mappedResources.Add(key, info); } } else { D3D11Texture texture = Util.AssertSubtype <MappableResource, D3D11Texture>(resource); lock (_immediateContextLock) { DataBox db = _immediateContext.MapSubresource( texture.DeviceTexture, (int)subresource, D3D11Formats.VdToD3D11MapMode(false, mode), SharpDX.Direct3D11.MapFlags.None, out DataStream ds); info.MappedResource = new MappedResource( resource, mode, db.DataPointer, (uint)ds.Length, subresource, (uint)db.RowPitch, (uint)db.SlicePitch); info.RefCount = 1; info.Mode = mode; _mappedResources.Add(key, info); } } } return(info.MappedResource); } }
protected override MappedResource MapCore(MappableResource resource, MapMode mode, uint subresource) { MappedResourceCacheKey key = new MappedResourceCacheKey(resource, subresource); lock (_mappedResourceLock) { if (_mappedResources.TryGetValue(key, out MappedResourceInfo info)) { if (info.Mode != mode) { throw new VeldridException("The given resource was already mapped with a different MapMode."); } info.RefCount += 1; _mappedResources[key] = info; } else { // No current mapping exists -- create one. if (resource is D3D11Buffer buffer) { lock (_immediateContextLock) { MappedSubresource msr = _immediateContext.Map( buffer.Buffer, 0, D3D11Formats.VdToD3D11MapMode((buffer.Usage & BufferUsage.Dynamic) == BufferUsage.Dynamic, mode), Vortice.Direct3D11.MapFlags.None); info.MappedResource = new MappedResource(resource, mode, msr.DataPointer, buffer.SizeInBytes); info.RefCount = 1; info.Mode = mode; _mappedResources.Add(key, info); } } else { D3D11Texture texture = Util.AssertSubtype <MappableResource, D3D11Texture>(resource); lock (_immediateContextLock) { Util.GetMipLevelAndArrayLayer(texture, subresource, out uint mipLevel, out uint arrayLayer); MappedSubresource msr = _immediateContext.Map( texture.DeviceTexture, (int)mipLevel, (int)arrayLayer, D3D11Formats.VdToD3D11MapMode(false, mode), Vortice.Direct3D11.MapFlags.None, out int mipSize); info.MappedResource = new MappedResource( resource, mode, msr.DataPointer, texture.Height * (uint)msr.RowPitch, subresource, (uint)msr.RowPitch, (uint)msr.DepthPitch); info.RefCount = 1; info.Mode = mode; _mappedResources.Add(key, info); } } } return(info.MappedResource); } }