TransferUsage change
							parent
							
								
									9195e445b2
								
							
						
					
					
						commit
						69d2c9cc31
					
				|  | @ -1 +1 @@ | ||||||
| Subproject commit 029f19196a94e13b8ed98d10f47a701221951f2f | Subproject commit 8f42783fd15cfea57cfae421fd6ab36070df9946 | ||||||
|  | @ -35,7 +35,7 @@ namespace MoonWorks.Graphics.Font | ||||||
| 			VertexBuffer = GpuBuffer.Create<Vertex>(GraphicsDevice, BufferUsageFlags.Vertex, INITIAL_VERTEX_COUNT); | 			VertexBuffer = GpuBuffer.Create<Vertex>(GraphicsDevice, BufferUsageFlags.Vertex, INITIAL_VERTEX_COUNT); | ||||||
| 			IndexBuffer = GpuBuffer.Create<uint>(GraphicsDevice, BufferUsageFlags.Index, INITIAL_INDEX_COUNT); | 			IndexBuffer = GpuBuffer.Create<uint>(GraphicsDevice, BufferUsageFlags.Index, INITIAL_INDEX_COUNT); | ||||||
| 
 | 
 | ||||||
| 			TransferBuffer = TransferBuffer.Create<byte>(GraphicsDevice, VertexBuffer.Size + IndexBuffer.Size); | 			TransferBuffer = TransferBuffer.Create<byte>(GraphicsDevice, TransferUsage.Buffer, VertexBuffer.Size + IndexBuffer.Size); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// Call this to initialize or reset the batch. | 		// Call this to initialize or reset the batch. | ||||||
|  | @ -119,7 +119,7 @@ namespace MoonWorks.Graphics.Font | ||||||
| 			if (newTransferBufferNeeded) | 			if (newTransferBufferNeeded) | ||||||
| 			{ | 			{ | ||||||
| 				TransferBuffer.Dispose(); | 				TransferBuffer.Dispose(); | ||||||
| 				TransferBuffer = new TransferBuffer(GraphicsDevice, VertexBuffer.Size + IndexBuffer.Size); | 				TransferBuffer = new TransferBuffer(GraphicsDevice, TransferUsage.Buffer, VertexBuffer.Size + IndexBuffer.Size); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if (vertexDataLengthInBytes > 0 && indexDataLengthInBytes > 0) | 			if (vertexDataLengthInBytes > 0 && indexDataLengthInBytes > 0) | ||||||
|  |  | ||||||
|  | @ -297,6 +297,12 @@ namespace MoonWorks.Graphics | ||||||
| 		IntOpaqueWhite | 		IntOpaqueWhite | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	public enum TransferUsage | ||||||
|  | 	{ | ||||||
|  | 		Buffer, | ||||||
|  | 		Texture | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	public enum TransferOptions | 	public enum TransferOptions | ||||||
| 	{ | 	{ | ||||||
| 		Cycle, | 		Cycle, | ||||||
|  |  | ||||||
|  | @ -15,18 +15,24 @@ namespace MoonWorks.Graphics | ||||||
| 	/// </summary> | 	/// </summary> | ||||||
| 	public unsafe class ResourceUploader : GraphicsResource | 	public unsafe class ResourceUploader : GraphicsResource | ||||||
| 	{ | 	{ | ||||||
| 		TransferBuffer TransferBuffer; | 		TransferBuffer BufferTransferBuffer; | ||||||
|  | 		TransferBuffer TextureTransferBuffer; | ||||||
| 
 | 
 | ||||||
| 		byte* data; | 		byte* bufferData; | ||||||
| 		uint dataOffset = 0; | 		uint bufferDataOffset = 0; | ||||||
| 		uint dataSize = 1024; | 		uint bufferDataSize = 1024; | ||||||
|  | 
 | ||||||
|  | 		byte* textureData; | ||||||
|  | 		uint textureDataOffset = 0; | ||||||
|  | 		uint textureDataSize = 1024; | ||||||
| 
 | 
 | ||||||
| 		List<(GpuBuffer, BufferCopy, WriteOptions)> BufferUploads = new List<(GpuBuffer, BufferCopy, WriteOptions)>(); | 		List<(GpuBuffer, BufferCopy, WriteOptions)> BufferUploads = new List<(GpuBuffer, BufferCopy, WriteOptions)>(); | ||||||
| 		List<(TextureRegion, uint, WriteOptions)> TextureUploads = new List<(TextureRegion, uint, WriteOptions)>(); | 		List<(TextureRegion, uint, WriteOptions)> TextureUploads = new List<(TextureRegion, uint, WriteOptions)>(); | ||||||
| 
 | 
 | ||||||
| 		public ResourceUploader(GraphicsDevice device) : base(device) | 		public ResourceUploader(GraphicsDevice device) : base(device) | ||||||
| 		{ | 		{ | ||||||
| 			data = (byte*) NativeMemory.Alloc(dataSize); | 			bufferData = (byte*) NativeMemory.Alloc(bufferDataSize); | ||||||
|  | 			textureData = (byte*) NativeMemory.Alloc(textureDataSize); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// Buffers | 		// Buffers | ||||||
|  | @ -56,7 +62,7 @@ namespace MoonWorks.Graphics | ||||||
| 			uint resourceOffset; | 			uint resourceOffset; | ||||||
| 			fixed (void* spanPtr = data) | 			fixed (void* spanPtr = data) | ||||||
| 			{ | 			{ | ||||||
| 				resourceOffset = CopyData(spanPtr, lengthInBytes); | 				resourceOffset = CopyBufferData(spanPtr, lengthInBytes); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			var bufferCopyParams = new BufferCopy(resourceOffset, offsetInBytes, lengthInBytes); | 			var bufferCopyParams = new BufferCopy(resourceOffset, offsetInBytes, lengthInBytes); | ||||||
|  | @ -213,7 +219,7 @@ namespace MoonWorks.Graphics | ||||||
| 			uint resourceOffset; | 			uint resourceOffset; | ||||||
| 			fixed (T* dataPtr = data) | 			fixed (T* dataPtr = data) | ||||||
| 			{ | 			{ | ||||||
| 				resourceOffset = CopyDataAligned(dataPtr, dataLengthInBytes, Texture.TexelSize(textureRegion.TextureSlice.Texture.Format)); | 				resourceOffset = CopyTextureData(dataPtr, dataLengthInBytes, Texture.TexelSize(textureRegion.TextureSlice.Texture.Format)); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			TextureUploads.Add((textureRegion, resourceOffset, option)); | 			TextureUploads.Add((textureRegion, resourceOffset, option)); | ||||||
|  | @ -252,14 +258,30 @@ namespace MoonWorks.Graphics | ||||||
| 
 | 
 | ||||||
| 		private void CopyToTransferBuffer() | 		private void CopyToTransferBuffer() | ||||||
| 		{ | 		{ | ||||||
| 			if (TransferBuffer == null || TransferBuffer.Size < dataSize) | 			if (BufferUploads.Count > 0) | ||||||
| 			{ | 			{ | ||||||
| 				TransferBuffer?.Dispose(); | 				if (BufferTransferBuffer == null || BufferTransferBuffer.Size < bufferDataSize) | ||||||
| 				TransferBuffer = new TransferBuffer(Device, dataSize); | 				{ | ||||||
|  | 					BufferTransferBuffer?.Dispose(); | ||||||
|  | 					BufferTransferBuffer = new TransferBuffer(Device, TransferUsage.Buffer, bufferDataSize); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				var dataSpan = new Span<byte>(bufferData, (int) bufferDataSize); | ||||||
|  | 				BufferTransferBuffer.SetData(dataSpan, TransferOptions.Cycle); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			var dataSpan = new Span<byte>(data, (int) dataSize); | 
 | ||||||
| 			TransferBuffer.SetData(dataSpan, TransferOptions.Cycle); | 			if (TextureUploads.Count > 0) | ||||||
|  | 			{ | ||||||
|  | 				if (TextureTransferBuffer == null || TextureTransferBuffer.Size < textureDataSize) | ||||||
|  | 				{ | ||||||
|  | 					TextureTransferBuffer?.Dispose(); | ||||||
|  | 					TextureTransferBuffer = new TransferBuffer(Device, TransferUsage.Texture, textureDataSize); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				var dataSpan = new Span<byte>(textureData, (int) textureDataSize); | ||||||
|  | 				TextureTransferBuffer.SetData(dataSpan, TransferOptions.Cycle); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private void RecordUploadCommands(CommandBuffer commandBuffer) | 		private void RecordUploadCommands(CommandBuffer commandBuffer) | ||||||
|  | @ -269,7 +291,7 @@ namespace MoonWorks.Graphics | ||||||
| 			foreach (var (gpuBuffer, bufferCopyParams, option) in BufferUploads) | 			foreach (var (gpuBuffer, bufferCopyParams, option) in BufferUploads) | ||||||
| 			{ | 			{ | ||||||
| 				commandBuffer.UploadToBuffer( | 				commandBuffer.UploadToBuffer( | ||||||
| 					TransferBuffer, | 					BufferTransferBuffer, | ||||||
| 					gpuBuffer, | 					gpuBuffer, | ||||||
| 					bufferCopyParams, | 					bufferCopyParams, | ||||||
| 					option | 					option | ||||||
|  | @ -279,7 +301,7 @@ namespace MoonWorks.Graphics | ||||||
| 			foreach (var (textureRegion, offset, option) in TextureUploads) | 			foreach (var (textureRegion, offset, option) in TextureUploads) | ||||||
| 			{ | 			{ | ||||||
| 				commandBuffer.UploadToTexture( | 				commandBuffer.UploadToTexture( | ||||||
| 					TransferBuffer, | 					TextureTransferBuffer, | ||||||
| 					textureRegion, | 					textureRegion, | ||||||
| 					new BufferImageCopy( | 					new BufferImageCopy( | ||||||
| 						offset, | 						offset, | ||||||
|  | @ -294,29 +316,41 @@ namespace MoonWorks.Graphics | ||||||
| 
 | 
 | ||||||
| 			BufferUploads.Clear(); | 			BufferUploads.Clear(); | ||||||
| 			TextureUploads.Clear(); | 			TextureUploads.Clear(); | ||||||
| 			dataOffset = 0; | 			bufferDataOffset = 0; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private uint CopyData(void* ptr, uint lengthInBytes) | 		private uint CopyBufferData(void* ptr, uint lengthInBytes) | ||||||
| 		{ | 		{ | ||||||
| 			if (dataOffset + lengthInBytes >= dataSize) | 			if (bufferDataOffset + lengthInBytes >= bufferDataSize) | ||||||
| 			{ | 			{ | ||||||
| 				dataSize = dataOffset + lengthInBytes; | 				bufferDataSize = bufferDataOffset + lengthInBytes; | ||||||
| 				data = (byte*) NativeMemory.Realloc(data, dataSize); | 				bufferData = (byte*) NativeMemory.Realloc(bufferData, bufferDataSize); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			var resourceOffset = dataOffset; | 			var resourceOffset = bufferDataOffset; | ||||||
| 
 | 
 | ||||||
| 			NativeMemory.Copy(ptr, data + dataOffset, lengthInBytes); | 			NativeMemory.Copy(ptr, bufferData + bufferDataOffset, lengthInBytes); | ||||||
| 			dataOffset += lengthInBytes; | 			bufferDataOffset += lengthInBytes; | ||||||
| 
 | 
 | ||||||
| 			return resourceOffset; | 			return resourceOffset; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private uint CopyDataAligned(void* ptr, uint lengthInBytes, uint alignment) | 		private uint CopyTextureData(void* ptr, uint lengthInBytes, uint alignment) | ||||||
| 		{ | 		{ | ||||||
| 			dataOffset = RoundToAlignment(dataOffset, alignment); | 			textureDataOffset = RoundToAlignment(textureDataOffset, alignment); | ||||||
| 			return CopyData(ptr, lengthInBytes); | 
 | ||||||
|  | 			if (textureDataOffset + lengthInBytes >= textureDataSize) | ||||||
|  | 			{ | ||||||
|  | 				textureDataSize = textureDataOffset + lengthInBytes; | ||||||
|  | 				textureData = (byte*) NativeMemory.Realloc(textureData, textureDataSize); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			var resourceOffset = textureDataOffset; | ||||||
|  | 
 | ||||||
|  | 			NativeMemory.Copy(ptr, textureData + textureDataOffset, lengthInBytes); | ||||||
|  | 			textureDataOffset += lengthInBytes; | ||||||
|  | 
 | ||||||
|  | 			return resourceOffset; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private uint RoundToAlignment(uint value, uint alignment) | 		private uint RoundToAlignment(uint value, uint alignment) | ||||||
|  | @ -335,10 +369,11 @@ namespace MoonWorks.Graphics | ||||||
| 			{ | 			{ | ||||||
| 				if (disposing) | 				if (disposing) | ||||||
| 				{ | 				{ | ||||||
| 					TransferBuffer?.Dispose(); | 					BufferTransferBuffer?.Dispose(); | ||||||
|  | 					TextureTransferBuffer?.Dispose(); | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				NativeMemory.Free(data); | 				NativeMemory.Free(bufferData); | ||||||
| 			} | 			} | ||||||
| 			base.Dispose(disposing); | 			base.Dispose(disposing); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -22,11 +22,13 @@ namespace MoonWorks.Graphics | ||||||
| 		/// <returns></returns> | 		/// <returns></returns> | ||||||
| 		public unsafe static TransferBuffer Create<T>( | 		public unsafe static TransferBuffer Create<T>( | ||||||
| 			GraphicsDevice device, | 			GraphicsDevice device, | ||||||
|  | 			TransferUsage usage, | ||||||
| 			uint elementCount | 			uint elementCount | ||||||
| 		) where T : unmanaged | 		) where T : unmanaged | ||||||
| 		{ | 		{ | ||||||
| 			return new TransferBuffer( | 			return new TransferBuffer( | ||||||
| 				device, | 				device, | ||||||
|  | 				usage, | ||||||
| 				(uint) Marshal.SizeOf<T>() * elementCount | 				(uint) Marshal.SizeOf<T>() * elementCount | ||||||
| 			); | 			); | ||||||
| 		} | 		} | ||||||
|  | @ -36,13 +38,16 @@ namespace MoonWorks.Graphics | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
| 		/// <param name="device">An initialized GraphicsDevice.</param> | 		/// <param name="device">An initialized GraphicsDevice.</param> | ||||||
| 		/// <param name="sizeInBytes">The length of the buffer. Cannot be resized.</param> | 		/// <param name="sizeInBytes">The length of the buffer. Cannot be resized.</param> | ||||||
|  | 		/// <param name="usage">Whether this will be used to upload buffers or textures.</param> | ||||||
| 		public TransferBuffer( | 		public TransferBuffer( | ||||||
| 			GraphicsDevice device, | 			GraphicsDevice device, | ||||||
|  | 			TransferUsage usage, | ||||||
| 			uint sizeInBytes | 			uint sizeInBytes | ||||||
| 		) : base(device) | 		) : base(device) | ||||||
| 		{ | 		{ | ||||||
| 			Handle = Refresh.Refresh_CreateTransferBuffer( | 			Handle = Refresh.Refresh_CreateTransferBuffer( | ||||||
| 				device.Handle, | 				device.Handle, | ||||||
|  | 				(Refresh.TransferUsage) usage, | ||||||
| 				sizeInBytes | 				sizeInBytes | ||||||
| 			); | 			); | ||||||
| 			Size = sizeInBytes; | 			Size = sizeInBytes; | ||||||
|  |  | ||||||
|  | @ -241,7 +241,7 @@ namespace MoonWorks.Video | ||||||
| 				if (TransferBuffer == null || TransferBuffer.Size < ySpan.Length + uSpan.Length + vSpan.Length) | 				if (TransferBuffer == null || TransferBuffer.Size < ySpan.Length + uSpan.Length + vSpan.Length) | ||||||
| 				{ | 				{ | ||||||
| 					TransferBuffer?.Dispose(); | 					TransferBuffer?.Dispose(); | ||||||
| 					TransferBuffer = new TransferBuffer(Device, (uint) (ySpan.Length + uSpan.Length + vSpan.Length)); | 					TransferBuffer = new TransferBuffer(Device, TransferUsage.Texture, (uint) (ySpan.Length + uSpan.Length + vSpan.Length)); | ||||||
| 				} | 				} | ||||||
| 				TransferBuffer.SetData(ySpan, 0, TransferOptions.Cycle); | 				TransferBuffer.SetData(ySpan, 0, TransferOptions.Cycle); | ||||||
| 				TransferBuffer.SetData(uSpan, (uint) ySpan.Length, TransferOptions.Overwrite); | 				TransferBuffer.SetData(uSpan, (uint) ySpan.Length, TransferOptions.Overwrite); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue