/// <summary> /// Registers a callback that is called every time a GPU method, or methods are called. /// </summary> /// <param name="offset">Offset of the method</param> /// <param name="count">Word count of the methods region</param> /// <param name="callback">Calllback to be called</param> public void RegisterCallback(MethodOffset offset, int count, MethodCallback callback) { for (int index = 0; index < count; index++) { _registers[(int)offset + index].Callback = callback; } }
/// <summary> /// Checks if a given register has been modified since the last call to this method. /// </summary> /// <param name="offset">Register offset</param> /// <returns>True if modified, false otherwise</returns> public bool QueryModified(MethodOffset offset) { bool modified = _registers[(int)offset].Modified; _registers[(int)offset].Modified = false; return(modified); }
/// <summary> /// Checks if two registers have been modified since the last call to this method. /// </summary> /// <param name="m1">First register offset</param> /// <param name="m2">Second register offset</param> /// <returns>True if any register was modified, false otherwise</returns> public bool QueryModified(MethodOffset m1, MethodOffset m2) { bool modified = _registers[(int)m1].Modified || _registers[(int)m2].Modified; _registers[(int)m1].Modified = false; _registers[(int)m2].Modified = false; return(modified); }
/// <summary> /// Constructs the table item structure. /// </summary> /// <param name="offset">Data offset</param> /// <param name="type">Data type</param> /// <param name="count">Data count, for indexed data</param> public TableItem(MethodOffset offset, Type type, int count) { int sizeInBytes = Marshal.SizeOf(type); Debug.Assert((sizeInBytes & 3) == 0); Offset = offset; Size = sizeInBytes / 4; Count = count; }
/// <summary> /// Gets indexed data from a given register offset. /// </summary> /// <typeparam name="T">Type of the data</typeparam> /// <param name="offset">Register offset</param> /// <param name="index">Index for indexed data</param> /// <returns>The data at the specified location</returns> public T Get <T>(MethodOffset offset, int index) where T : struct { Register register = _registers[(int)offset]; if ((uint)index >= register.Count) { throw new ArgumentOutOfRangeException(nameof(index)); } return(Get <T>(offset + index * register.Stride)); }
/// <summary> /// Sets indexed data to a given register offset. /// </summary> /// <typeparam name="T">Type of the data</typeparam> /// <param name="offset">Register offset</param> /// <param name="index">Index for indexed data</param> /// <param name="data">The data to set</param> public void Set <T>(MethodOffset offset, int index, T data) where T : unmanaged { Register register = _registers[(int)offset]; if ((uint)index >= register.Count) { throw new ArgumentOutOfRangeException(nameof(index)); } Set(offset + index * register.Stride, data); }
/// <summary> /// Convert to XML element /// </summary> internal XElement ToXml(string elementName) { var element = new XElement(elementName, new XAttribute("sl", Start.Line.ToString()), new XAttribute("sc", Start.Column.ToString())); if (Start.Line != End.Line) { element.Add(new XAttribute("el", End.Line.ToString())); } if (Start.Column != End.Column) { element.Add(new XAttribute("ec", End.Column.ToString())); } element.Add(new XAttribute("ti", TypeId.ToString())); element.Add(new XAttribute("mi", MethodId.ToString())); element.Add(new XAttribute("mo", MethodOffset.ToString())); return(element); }
/// <summary> /// Checks if six registers have been modified since the last call to this method. /// </summary> /// <param name="m1">First register offset</param> /// <param name="m2">Second register offset</param> /// <param name="m3">Third register offset</param> /// <param name="m4">Fourth register offset</param> /// <param name="m5">Fifth register offset</param> /// <param name="m6">Sixth register offset</param> /// <returns>True if any register was modified, false otherwise</returns> public bool QueryModified( MethodOffset m1, MethodOffset m2, MethodOffset m3, MethodOffset m4, MethodOffset m5, MethodOffset m6) { bool modified = _registers[(int)m1].Modified || _registers[(int)m2].Modified || _registers[(int)m3].Modified || _registers[(int)m4].Modified || _registers[(int)m5].Modified || _registers[(int)m6].Modified; _registers[(int)m1].Modified = false; _registers[(int)m2].Modified = false; _registers[(int)m3].Modified = false; _registers[(int)m4].Modified = false; _registers[(int)m5].Modified = false; _registers[(int)m6].Modified = false; return(modified); }
/// <summary> /// Gets data from a given register offset. /// </summary> /// <typeparam name="T">Type of the data</typeparam> /// <param name="offset">Register offset</param> /// <returns>The data at the specified location</returns> public T Get <T>(MethodOffset offset) where T : struct { return(MemoryMarshal.Cast <int, T>(_backingMemory.AsSpan().Slice((int)offset))[0]); }
/// <summary> /// Registers a callback that is called every time a GPU method is called. /// </summary> /// <param name="offset">Offset of the method</param> /// <param name="callback">Calllback to be called</param> public void RegisterCallback(MethodOffset offset, MethodCallback callback) { _registers[(int)offset].Callback = callback; }
/// <summary> /// Sets data to a given register offset. /// </summary> /// <typeparam name="T">Type of the data</typeparam> /// <param name="offset">Register offset</param> /// <param name="data">The data to set</param> public void Set <T>(MethodOffset offset, T data) where T : unmanaged { ReadOnlySpan <int> intSpan = MemoryMarshal.Cast <T, int>(MemoryMarshal.CreateReadOnlySpan(ref data, 1)); intSpan.CopyTo(_memory.AsSpan().Slice((int)offset, intSpan.Length)); }
/// <summary> /// Gets a span of the data at a given register offset. /// </summary> /// <param name="offset">Register offset</param> /// <param name="length">Length of the data in bytes</param> /// <returns>The data at the specified location</returns> public Span <byte> GetSpan(MethodOffset offset, int length) { return(MemoryMarshal.Cast <int, byte>(_memory.AsSpan().Slice((int)offset)).Slice(0, length)); }
/// <summary> /// Gets data from a given register offset. /// </summary> /// <typeparam name="T">Type of the data</typeparam> /// <param name="offset">Register offset</param> /// <returns>The data at the specified location</returns> public T Get <T>(MethodOffset offset) where T : unmanaged { return(MemoryMarshal.Cast <int, T>(_memory.AsSpan().Slice((int)offset))[0]); }