/// <summary>
        /// Updates the uniform buffer data with inline data.
        /// </summary>
        /// <param name="state">Current GPU state</param>
        /// <param name="data">Data to be written to the uniform buffer</param>
        public void UniformBufferUpdate(GpuState state, ReadOnlySpan <int> data)
        {
            var uniformBuffer = state.Get <UniformBufferState>(MethodOffset.UniformBufferState);

            ulong address = uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset;

            ulong size = (ulong)data.Length * 4;

            ulong currentCpuAddress = _ubBeginCpuAddress + (ulong)_ubIntCount * 4;

            if (_ubFollowUpAddress != address || !_ubLastWritten.FullyContains(currentCpuAddress, size) || _ubIntCount + data.Length >= MaxUboSize)
            {
                FlushUboUpdate();

                _ubIntCount = 0;

                UboCacheEntry entry = BufferManager.TranslateCreateAndGetUbo(address, size);
                _ubBeginCpuAddress = entry.Address;
                _ubLastWritten     = entry.Buffer;
            }

            _context.PhysicalMemory.WriteUntracked(_ubBeginCpuAddress + (ulong)_ubIntCount * 4, MemoryMarshal.Cast <int, byte>(data));

            _ubFollowUpAddress = address + size;
            data.CopyTo(new Span <int>(_ubData, _ubIntCount, data.Length));
            _ubIntCount += data.Length;

            state.SetUniformBufferOffset(uniformBuffer.Offset + data.Length * 4);
        }
        /// <summary>
        /// Updates the uniform buffer data with inline data.
        /// </summary>
        /// <param name="state">Current GPU state</param>
        /// <param name="argument">New uniform buffer data word</param>
        private void UniformBufferUpdate(GpuState state, int argument)
        {
            var uniformBuffer = state.Get <UniformBufferState>(MethodOffset.UniformBufferState);

            ulong address = uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset;

            ulong currentCpuAddress = _ubBeginCpuAddress + (ulong)_ubIntCount * 4;

            if (_ubFollowUpAddress != address || !_ubLastWritten.FullyContains(currentCpuAddress, 4) || _ubIntCount + 1 >= MaxUboSize)
            {
                FlushUboUpdate();

                _ubIntCount = 0;

                UboCacheEntry entry = BufferManager.TranslateCreateAndGetUbo(address, 4);
                _ubBeginCpuAddress = entry.Address;
                _ubLastWritten     = entry.Buffer;
            }

            _context.PhysicalMemory.WriteUntracked(_ubBeginCpuAddress + (ulong)_ubIntCount * 4, MemoryMarshal.Cast <int, byte>(MemoryMarshal.CreateSpan(ref argument, 1)));

            _ubFollowUpAddress     = address + 4;
            _ubData[_ubIntCount++] = argument;

            state.SetUniformBufferOffset(uniformBuffer.Offset + 4);
        }
Esempio n. 3
0
        /// <summary>
        /// Updates the uniform buffer data with inline data.
        /// </summary>
        /// <param name="state">Current GPU state</param>
        /// <param name="argument">New uniform buffer data word</param>
        private void UniformBufferUpdate(GpuState state, int argument)
        {
            var uniformBuffer = state.Get <UniformBufferState>(MethodOffset.UniformBufferState);

            _context.MemoryAccessor.Write(uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset, argument);

            state.SetUniformBufferOffset(uniformBuffer.Offset + 4);

            _context.AdvanceSequence();
        }
        /// <summary>
        /// Updates the uniform buffer data with inline data.
        /// </summary>
        /// <param name="state">Current GPU state</param>
        /// <param name="data">Data to be written to the uniform buffer</param>
        public void UniformBufferUpdate(GpuState state, ReadOnlySpan <int> data)
        {
            var uniformBuffer = state.Get <UniformBufferState>(MethodOffset.UniformBufferState);

            _context.MemoryManager.Write(uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset, MemoryMarshal.Cast <int, byte>(data));

            state.SetUniformBufferOffset(uniformBuffer.Offset + data.Length * 4);

            _context.AdvanceSequence();
        }
Esempio n. 5
0
        /// <summary>
        /// Updates the uniform buffer data with inline data.
        /// </summary>
        /// <param name="state">Current GPU state</param>
        /// <param name="argument">New uniform buffer data word</param>
        private void UniformBufferUpdate(GpuState state, int argument)
        {
            var uniformBuffer = state.Get <UniformBufferState>(MethodOffset.UniformBufferState);

            ulong address = uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset;

            if (_ubFollowUpAddress != address)
            {
                FlushUboDirty();

                _ubByteCount       = 0;
                _ubBeginCpuAddress = _context.MemoryManager.Translate(address);
            }

            _context.PhysicalMemory.WriteUntracked(_ubBeginCpuAddress + _ubByteCount, MemoryMarshal.Cast <int, byte>(MemoryMarshal.CreateSpan(ref argument, 1)));

            _ubFollowUpAddress = address + 4;
            _ubByteCount      += 4;

            state.SetUniformBufferOffset(uniformBuffer.Offset + 4);
        }
Esempio n. 6
0
        /// <summary>
        /// Updates the uniform buffer data with inline data.
        /// </summary>
        /// <param name="state">Current GPU state</param>
        /// <param name="data">Data to be written to the uniform buffer</param>
        public void UniformBufferUpdate(GpuState state, ReadOnlySpan <int> data)
        {
            var uniformBuffer = state.Get <UniformBufferState>(MethodOffset.UniformBufferState);

            ulong address = uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset;

            ulong size = (ulong)data.Length * 4;

            if (_ubFollowUpAddress != address)
            {
                FlushUboDirty();

                _ubByteCount       = 0;
                _ubBeginCpuAddress = _context.MemoryManager.Translate(address);
            }

            _context.PhysicalMemory.WriteUntracked(_ubBeginCpuAddress + _ubByteCount, MemoryMarshal.Cast <int, byte>(data));

            _ubFollowUpAddress = address + size;
            _ubByteCount      += size;

            state.SetUniformBufferOffset(uniformBuffer.Offset + data.Length * 4);
        }