public void BitScanner_NB1_64()
 {
     Assert.AreEqual(0, BitScanner.NumberOfBit1(0UL));
     Assert.AreEqual(1, BitScanner.NumberOfBit1(1UL));
     Assert.AreEqual(1, BitScanner.NumberOfBit1(0x4000000000000000UL));
     Assert.AreEqual(2, BitScanner.NumberOfBit1(0x4000000000000001UL));
     Assert.AreEqual(63, BitScanner.NumberOfBit1(0x7FFFFFFFFFFFFFFFUL));
     Assert.AreEqual(63, BitScanner.NumberOfBit1(0xFFFFFFFFFFFFFFFEUL));
     Assert.AreEqual(64, BitScanner.NumberOfBit1(0xFFFFFFFFFFFFFFFFUL));
 }
 public void BitScanner_NB1_32()
 {
     Assert.AreEqual(0, BitScanner.NumberOfBit1(0U));
     Assert.AreEqual(1, BitScanner.NumberOfBit1(1U));
     Assert.AreEqual(1, BitScanner.NumberOfBit1(0x40000000U));
     Assert.AreEqual(2, BitScanner.NumberOfBit1(0x40000001U));
     Assert.AreEqual(31, BitScanner.NumberOfBit1(0x7FFFFFFFU));
     Assert.AreEqual(31, BitScanner.NumberOfBit1(0xFFFFFFFEU));
     Assert.AreEqual(32, BitScanner.NumberOfBit1(0xFFFFFFFFU));
 }
 public void BitScanner_NLZ_64()
 {
     Assert.AreEqual(64, BitScanner.NumberOfLeadingZeros64(0));
     Assert.AreEqual(63, BitScanner.NumberOfLeadingZeros64(1));
     Assert.AreEqual(62, BitScanner.NumberOfLeadingZeros64(2));
     Assert.AreEqual(62, BitScanner.NumberOfLeadingZeros64(3));
     Assert.AreEqual(0, BitScanner.NumberOfLeadingZeros64(0xFFFFFFFFFFFFFFFFUL));
     Assert.AreEqual(0, BitScanner.NumberOfLeadingZeros64(0x8000000000000000UL));
     Assert.AreEqual(1, BitScanner.NumberOfLeadingZeros64(0x7FFFFFFFFFFFFFFFUL));
     Assert.AreEqual(1, BitScanner.NumberOfLeadingZeros64(0x4000000000000000UL));
 }
 public void BitScanner_NLZ_32()
 {
     Assert.AreEqual(32, BitScanner.NumberOfLeadingZeros32(0));
     Assert.AreEqual(31, BitScanner.NumberOfLeadingZeros32(1));
     Assert.AreEqual(30, BitScanner.NumberOfLeadingZeros32(2));
     Assert.AreEqual(30, BitScanner.NumberOfLeadingZeros32(3));
     Assert.AreEqual(0, BitScanner.NumberOfLeadingZeros32(0xFFFFFFFFU));
     Assert.AreEqual(0, BitScanner.NumberOfLeadingZeros32(0x80000000U));
     Assert.AreEqual(1, BitScanner.NumberOfLeadingZeros32(0x7FFFFFFFU));
     Assert.AreEqual(1, BitScanner.NumberOfLeadingZeros32(0x40000000U));
 }
 public void BitScanner_NTZ_64()
 {
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros64(0x0000000000000001UL));
     Assert.AreEqual(1, BitScanner.NumberOfTrailingZeros64(0x0000000000000002UL));
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros64(0x0000000000000003UL));
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros64(0x8000000000000001UL));
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros64(0x4000000000000001UL));
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros64(0xFFFFFFFFFFFFFFF1UL));
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros64(0xFFFFFFFFFFFFFFFFUL));
     Assert.AreEqual(64, BitScanner.NumberOfTrailingZeros64(0x0000000000000000UL));
     Assert.AreEqual(63, BitScanner.NumberOfTrailingZeros64(0x8000000000000000UL));
     Assert.AreEqual(62, BitScanner.NumberOfTrailingZeros64(0x4000000000000000UL));
 }
 public void BitScanner_NTZ_32()
 {
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros32(0x00000001U));
     Assert.AreEqual(1, BitScanner.NumberOfTrailingZeros32(0x00000002U));
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros32(0x00000003U));
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros32(0x80000001U));
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros32(0x40000001U));
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros32(0xFFFFFFF1U));
     Assert.AreEqual(0, BitScanner.NumberOfTrailingZeros32(0xFFFFFFFFU));
     Assert.AreEqual(32, BitScanner.NumberOfTrailingZeros32(0x00000000U));
     Assert.AreEqual(31, BitScanner.NumberOfTrailingZeros32(0x80000000U));
     Assert.AreEqual(30, BitScanner.NumberOfTrailingZeros32(0x40000000U));
 }
            /// <summary>
            /// The UnbindAllValid
            /// </summary>
            public void UnbindAllValid()
            {
                StaleRootParamsBitMap = 0;
                var tableParams = (uint)RootDescriptorTablesBitMap;

                while (BitScanner.BitScanForward(tableParams, out var rootIndex))
                {
                    tableParams ^= (uint)(1 << rootIndex);
                    if (RootDescriptorTable[rootIndex].AssignedHandleBitMap != 0)
                    {
                        StaleRootParamsBitMap |= (uint)(1 << rootIndex);
                    }
                }
            }
 public void BitScanner_Mask()
 {
     Assert.AreEqual(1U, BitScanner.Mask(1));
     Assert.AreEqual(3U, BitScanner.Mask(2));
     Assert.AreEqual(3U, BitScanner.Mask(3));
     Assert.AreEqual(7U, BitScanner.Mask(4));
     Assert.AreEqual(7U, BitScanner.Mask(5));
     Assert.AreEqual(7U, BitScanner.Mask(6));
     Assert.AreEqual(7U, BitScanner.Mask(7));
     Assert.AreEqual(0x7FFFFFFFU, BitScanner.Mask(0x7FFFFFFF));
     Assert.AreEqual(0xFFFFFFFFU, BitScanner.Mask(0x80000000));
     Assert.AreEqual(0xFFFFFFFFU, BitScanner.Mask(0x80000001));
     Assert.AreEqual(0xFFFFFFFFU, BitScanner.Mask(0xFFFFFFFF));
     Assert.AreEqual(0U, BitScanner.Mask(0));
 }
 private static void Test(uint value)
 {
     Assert.AreEqual(1UL << (CalcReverse(value) + 1), (ulong)BitScanner.Mask(value) + 1);
 }
            /// <summary>
            /// The CopyAndBindStaleTables
            /// </summary>
            /// <param name="type">The <see cref="DescriptorHeapType"/></param>
            /// <param name="descriptorSize">The <see cref="uint"/></param>
            /// <param name="destHandleStart">The <see cref="DescriptorHandle"/></param>
            /// <param name="setFunction">The <see cref="CommandListSetFunc"/></param>
            public void CopyAndBindStaleTables(DescriptorHeapType type, uint descriptorSize, DescriptorHandle destHandleStart, CommandListSetFunc setFunction)
            {
                uint staleParamCount = 0;
                var  tableSize       = new int[MaxNumDescriptorTables];
                var  rootIndices     = new int[MaxNumDescriptorTables];
                var  needSpace       = 0;
                int  rootIndex;

                var staleParams = StaleRootParamsBitMap;

                while (BitScanner.BitScanForward(staleParams, out rootIndex))
                {
                    rootIndices[staleParamCount] = rootIndex;
                    staleParams ^= (uint)(1 << (int)rootIndex);

                    Debug.Assert(BitScanner.BitScanReverse(RootDescriptorTable[rootIndex].AssignedHandleBitMap, out var maxSetHandle), "Root entry marked as stale but has no stale descriptors");

                    needSpace += maxSetHandle + 1;
                    tableSize[staleParamCount] = maxSetHandle + 1;

                    staleParamCount++;
                }

                Debug.Assert(staleParamCount <= MaxNumDescriptorTables, "We're only equipped to handle so many descriptor tables");

                StaleRootParamsBitMap = 0;

                const uint maxdescriptorPerCopy      = 16;
                var        numDestDescriptorRanges   = 0;
                var        destDescriptorRangeStarts = new CpuDescriptorHandle[maxdescriptorPerCopy];
                var        destDescriptorRangeSizes  = new int[maxdescriptorPerCopy];

                var numSrcDescriptorRanges   = 0;
                var srcDescriptorRangeStarts = new CpuDescriptorHandle[maxdescriptorPerCopy];
                var srcDescriptorRangeSizes  = new int[maxdescriptorPerCopy];

                for (uint idx = 0; idx < staleParamCount; idx++)
                {
                    rootIndex = rootIndices[idx];
                    setFunction?.Invoke((int)rootIndex, destHandleStart.GPUHandle);

                    var rootDescTable = RootDescriptorTable[rootIndex];

                    var    srcHandles = rootDescTable.TableStart;
                    UInt64 setHandles = rootDescTable.AssignedHandleBitMap;
                    var    curDest    = destHandleStart.CPUHandle;
                    destHandleStart += (int)(tableSize[idx] * descriptorSize);


                    while (BitScanner.BitScanForward64(setHandles, out var skipCount))
                    {
                        setHandles >>= skipCount;
                        srcHandles  += skipCount;
                        curDest.Ptr += skipCount * descriptorSize;

                        BitScanner.BitScanForward64(~setHandles, out var descriptorCount);
                        setHandles >>= descriptorCount;

                        if (numSrcDescriptorRanges + descriptorCount > maxdescriptorPerCopy)
                        {
                            Globals.Device.CopyDescriptors(numDestDescriptorRanges, destDescriptorRangeStarts, destDescriptorRangeSizes, numSrcDescriptorRanges, srcDescriptorRangeStarts, srcDescriptorRangeSizes, type);

                            numSrcDescriptorRanges  = 0;
                            numDestDescriptorRanges = 0;
                        }

                        destDescriptorRangeStarts[numDestDescriptorRanges] = curDest;
                        destDescriptorRangeSizes[numDestDescriptorRanges]  = descriptorCount;
                        numDestDescriptorRanges++;

                        for (int jdx = 0; jdx < descriptorCount; jdx++)
                        {
                            srcDescriptorRangeStarts[numSrcDescriptorRanges] = Marshal.PtrToStructure <CpuDescriptorHandle>(rootDescTable.TableStart + jdx * Marshal.SizeOf <CpuDescriptorHandle>());
                            srcDescriptorRangeSizes[numSrcDescriptorRanges]  = 1;
                            numSrcDescriptorRanges++;
                        }

                        srcHandles  += descriptorCount;
                        curDest.Ptr += descriptorCount;
                    }
                }

                Globals.Device.CopyDescriptors(numDestDescriptorRanges, destDescriptorRangeStarts, destDescriptorRangeSizes, numSrcDescriptorRanges, srcDescriptorRangeStarts, srcDescriptorRangeSizes, type);
            }
示例#11
0
 private void RunCodingPass(BitScanner singleBitScanner, BitScanner quadBitScanner = null)
 {