Esempio n. 1
0
 /// <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;
     }
 }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
            /// <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;
            }
Esempio n. 5
0
        /// <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));
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 7
0
        /// <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);
        }
Esempio n. 8
0
        /// <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);
        }
Esempio n. 9
0
 /// <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]);
 }
Esempio n. 10
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;
 }
Esempio n. 11
0
        /// <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));
        }
Esempio n. 12
0
 /// <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));
 }
Esempio n. 13
0
 /// <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]);
 }