ngscopeclient v0.2
Loading...
Searching...
No Matches
Waveform.h
Go to the documentation of this file.
1/***********************************************************************************************************************
2* *
3* libscopehal *
4* *
5* Copyright (c) 2012-2026 Andrew D. Zonenberg and contributors *
6* All rights reserved. *
7* *
8* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the *
9* following conditions are met: *
10* *
11* * Redistributions of source code must retain the above copyright notice, this list of conditions, and the *
12* following disclaimer. *
13* *
14* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the *
15* following disclaimer in the documentation and/or other materials provided with the distribution. *
16* *
17* * Neither the name of the author nor the names of any contributors may be used to endorse or promote products *
18* derived from this software without specific prior written permission. *
19* *
20* THIS SOFTWARE IS PROVIDED BY THE AUTHORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
21* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL *
22* THE AUTHORS BE HELD LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES *
23* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR *
24* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
25* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *
26* POSSIBILITY OF SUCH DAMAGE. *
27* *
28***********************************************************************************************************************/
29
37#ifndef Waveform_h
38#define Waveform_h
39
40#include <vector>
41#include <optional>
42#include <AlignedAllocator.h>
43
44#include "StandardColors.h"
45#include "AcceleratorBuffer.h"
46
59{
60public:
61
66 : m_timescale(0)
70 , m_flags(0)
71 , m_revision(0)
73 {
74 }
75
88
89 //empty virtual destructor in case any derived classes need one
90 virtual ~WaveformBase()
91 {}
92
99 virtual void Rename(const std::string& name = "") = 0;
100
108
111
114
127
132
141
148
150 virtual void clear() =0;
151
160 virtual void Resize(size_t size) =0;
161
165 virtual void Reserve(size_t size) =0;
166
168 virtual size_t size() const =0;
169
171 virtual size_t capacity() const =0;
172
174 virtual size_t GetMemoryBytes() const =0;
175
177 virtual bool empty()
178 { return size() == 0; }
179
187 virtual std::string GetText([[maybe_unused]] size_t i)
188 {
189 return "(unimplemented)";
190 }
191
199 virtual std::string GetColor(size_t /*i*/)
200 {
201 return StandardColors::colors[StandardColors::COLOR_ERROR];
202 }
203
211 virtual uint32_t GetColorCached(size_t i)
212 { return m_protocolColors[i]; }
213
219 virtual void PrepareForCpuAccess() =0;
220
226 virtual void PrepareForCpuAccessNonblocking(vk::raii::CommandBuffer& cmdBuf) =0;
227
233 virtual void PrepareForGpuAccess() =0;
234
240 virtual void PrepareForGpuAccessNonblocking(vk::raii::CommandBuffer& cmdBuf) =0;
241
245 virtual void MarkSamplesModifiedFromCpu() =0;
246
250 virtual void MarkSamplesModifiedFromGpu() =0;
251
255 virtual void MarkModifiedFromCpu() =0;
256
260 virtual void MarkModifiedFromGpu() =0;
261
262 virtual void CacheColors();
263
265 virtual void FreeGpuMemory() =0;
266
268 virtual bool HasGpuBuffer() =0;
269
270protected:
271
274
277};
278
279template<class S> class SparseWaveform;
280
293{
294public:
295
300 {
301 //Default timestamps to CPU/GPU mirror
304
307
308 m_offsets.PrepareForCpuAccess();
309 m_durations.PrepareForCpuAccess();
310 }
311
312 virtual ~SparseWaveformBase()
313 {}
314
326
329
332
341 {
342 m_offsets.CopyFrom(rhs->m_offsets);
343 m_durations.CopyFrom(rhs->m_durations);
344 }
345
346 void MarkTimestampsModifiedFromCpu()
347 {
348 m_offsets.MarkModifiedFromCpu();
349 m_durations.MarkModifiedFromCpu();
350 }
351
352 void MarkTimestampsModifiedFromGpu()
353 {
354 m_offsets.MarkModifiedFromGpu();
355 m_durations.MarkModifiedFromGpu();
356 }
357
358 virtual void MarkModifiedFromCpu() override
359 {
361 MarkTimestampsModifiedFromCpu();
362 }
363
364 virtual void MarkModifiedFromGpu() override
365 {
367 MarkTimestampsModifiedFromGpu();
368 }
369};
370
376{
377public:
379 {}
380
391
392 virtual ~UniformWaveformBase()
393 {}
394};
395
402template<class S>
404{
405public:
406
412 UniformWaveform(const std::string& name = "")
413 {
414 Rename(name);
415
416 //Default data to CPU/GPU mirror
419 m_samples.PrepareForCpuAccess();
420 }
421
422 virtual void Rename(const std::string& name = "") override
423 {
424 if(name.empty())
425 m_samples.SetName(std::string("UniformWaveform<") + typeid(S).name() + ">.m_samples");
426 else
427 m_samples.SetName(name + ".m_samples");
428 }
429
439 {
440 m_samples.SetName(std::string("UniformWaveform<") + typeid(S).name() + ">.m_samples");
441
442 m_samples.CopyFrom(rhs.m_samples);
443 }
444
445 virtual ~UniformWaveform()
446 {}
447
450
451 virtual void FreeGpuMemory() override
452 { m_samples.FreeGpuBuffer(); }
453
454 virtual bool HasGpuBuffer() override
455 { return m_samples.HasGpuBuffer(); }
456
457 virtual void Resize(size_t size) override
458 { m_samples.resize(size); }
459
460 virtual void Reserve(size_t size) override
462
463 virtual size_t GetMemoryBytes() const override
464 { return m_samples.GetMemoryBytes(); }
465
466 virtual size_t size() const override
467 { return m_samples.size(); }
468
469 virtual size_t capacity() const override
470 { return m_samples.capacity(); }
471
472 virtual void clear() override
473 { m_samples.clear(); }
474
475 virtual void PrepareForCpuAccess() override
476 { m_samples.PrepareForCpuAccess(); }
477
478 virtual void PrepareForGpuAccess() override
479 { m_samples.PrepareForGpuAccess(); }
480
481 virtual void PrepareForCpuAccessNonblocking(vk::raii::CommandBuffer& cmdBuf) override
482 { m_samples.PrepareForCpuAccessNonblocking(cmdBuf); }
483
484 virtual void PrepareForGpuAccessNonblocking(vk::raii::CommandBuffer& cmdBuf) override
485 { m_samples.PrepareForGpuAccessNonblocking(false, cmdBuf); }
486
487 virtual void MarkSamplesModifiedFromCpu() override
488 { m_samples.MarkModifiedFromCpu(); }
489
490 virtual void MarkSamplesModifiedFromGpu() override
491 { m_samples.MarkModifiedFromGpu(); }
492
493 virtual void MarkModifiedFromCpu() override
495
496 virtual void MarkModifiedFromGpu() override
498
504 void SetGpuAccessHint(enum AcceleratorBuffer<S>::UsageHint hint)
505 { m_samples.SetGpuAccessHint(hint); }
506};
507
512template<class S>
514{
515public:
516
522 SparseWaveform(const std::string& name = "")
523 {
524 Rename(name);
525
526 //Default data to CPU/GPU mirror
529 m_samples.PrepareForCpuAccess();
530 }
531
532 virtual void Rename(const std::string& name = "") override
533 {
534 if(name.empty())
535 {
536 m_samples.SetName(std::string("SparseWaveform<") + typeid(S).name() + ">.m_samples");
537 m_offsets.SetName(std::string("SparseWaveform<") + typeid(S).name() + ">.m_offsets");
538 m_durations.SetName(std::string("SparseWaveform<") + typeid(S).name() + ">.m_durations");
539 }
540 else
541 {
542 m_samples.SetName(name + ".m_samples");
543 m_offsets.SetName(name + ".m_offsets");
544 m_durations.SetName(name + ".m_durations");
545 }
546 }
547
552 {
553 m_samples.SetName(std::string("SparseWaveform<") + typeid(S).name() + ">.m_samples");
554 m_offsets.SetName(std::string("SparseWaveform<") + typeid(S).name() + ">.m_offsets");
555 m_durations.SetName(std::string("SparseWaveform<") + typeid(S).name() + ">.m_durations");
556
559 m_samples.PrepareForCpuAccess();
560
561 //Copy sample data
562 Resize(rhs.size());
563 m_samples.CopyFrom(rhs.m_samples);
564
565 //Generate offset/duration values
566 //TODO: is it worth vectorizing this since this is mostly meant to be a compatibility layer?
567 for(size_t i=0; i<m_offsets.size(); i++)
568 {
569 m_offsets[i] = i;
570 m_durations[i] = 1;
571 }
572 }
573
574 virtual ~SparseWaveform()
575 {}
576
580 virtual void SetCpuOnlyHint() override
581 {
583
586 }
587
590
591 virtual void FreeGpuMemory() override
592 {
593 m_offsets.FreeGpuBuffer();
594 m_durations.FreeGpuBuffer();
595 m_samples.FreeGpuBuffer();
596 }
597
598 virtual bool HasGpuBuffer() override
600
601 virtual void Resize(size_t size) override
602 {
606 }
607
608 virtual void Reserve(size_t size) override
609 {
613 }
614
615 virtual size_t size() const override
616 { return m_samples.size(); }
617
618 virtual size_t GetMemoryBytes() const override
620
621 virtual size_t capacity() const override
622 { return m_samples.capacity(); }
623
624 virtual void clear() override
625 {
629 }
630
631 virtual void PrepareForCpuAccess() override
632 {
633 m_offsets.PrepareForCpuAccess();
634 m_durations.PrepareForCpuAccess();
635 m_samples.PrepareForCpuAccess();
636 }
637
638 virtual void PrepareForCpuAccessNonblocking(vk::raii::CommandBuffer& cmdBuf) override
639 {
640 m_samples.PrepareForCpuAccessNonblocking(cmdBuf);
641 m_offsets.PrepareForCpuAccessNonblocking(cmdBuf);
642 m_durations.PrepareForCpuAccessNonblocking(cmdBuf);
643 }
644
645 virtual void PrepareForGpuAccess() override
646 {
647 m_offsets.PrepareForGpuAccess();
648 m_durations.PrepareForGpuAccess();
649 m_samples.PrepareForGpuAccess();
650 }
651
652 virtual void PrepareForGpuAccessNonblocking(vk::raii::CommandBuffer& cmdBuf) override
653 {
654 m_samples.PrepareForGpuAccessNonblocking(false, cmdBuf);
655 m_offsets.PrepareForGpuAccessNonblocking(false, cmdBuf);
656 m_durations.PrepareForGpuAccessNonblocking(false, cmdBuf);
657 }
658
659 virtual void MarkSamplesModifiedFromCpu() override
660 { m_samples.MarkModifiedFromCpu(); }
661
662 virtual void MarkSamplesModifiedFromGpu() override
663 { m_samples.MarkModifiedFromGpu(); }
664
670 void SetGpuAccessHint(enum AcceleratorBuffer<S>::UsageHint hint)
671 {
672 m_offsets.SetGpuAccessHint(static_cast<AcceleratorBuffer<int64_t>::UsageHint>(hint));
673 m_durations.SetGpuAccessHint(static_cast<AcceleratorBuffer<int64_t>::UsageHint>(hint));
674 m_samples.SetGpuAccessHint(hint);
675 }
676};
677
682
688 : public UniformWaveform<uint32_t>
689{
690public:
691 UniformDigitalBusWaveform32(const std::string& name = "")
693 {}
694
696 {}
697};
698
704 : public SparseWaveform<uint32_t>
705{
706public:
707 SparseDigitalBusWaveform32(const std::string& name = "")
709 {}
710
712 {}
713};
714
720 : public UniformWaveform<uint64_t>
721{
722public:
723 UniformDigitalBusWaveform64(const std::string& name = "")
725 {}
726
728 {}
729};
730
731//Make sure inline helpers aren't warned about if unused
732#pragma GCC diagnostic push
733#pragma GCC diagnostic ignored "-Wunused-function"
734
735//Helper methods for identifying what a waveform is at compile time
736static bool IsWaveformUniform(const SparseWaveformBase* /*unused*/);
737static bool IsWaveformUniform(const UniformWaveformBase* /*unused*/);
738static int64_t GetOffset(const SparseWaveformBase* wfm, size_t i);
739static int64_t GetOffset(const UniformWaveformBase* /*wfm*/, size_t i);
740static int64_t GetDuration(const SparseWaveformBase* wfm, size_t i);
741static int64_t GetDuration(const UniformWaveformBase* /*wfm*/, size_t /*i*/);
742
747bool IsWaveformUniform(const SparseWaveformBase* /*unused*/)
748{ return false; }
749
754bool IsWaveformUniform(const UniformWaveformBase* /*unused*/)
755{ return true; }
756
757//Helper methods for weighted averaging of samples
758static float GetSampleTimesIndex(const UniformAnalogWaveform* wfm, ssize_t i);
759static float GetSampleTimesIndex(const SparseAnalogWaveform* wfm, ssize_t i);
760
768float GetSampleTimesIndex(const UniformAnalogWaveform* wfm, ssize_t i)
769{ return wfm->m_samples[i] * i; }
770
778float GetSampleTimesIndex(const SparseAnalogWaveform* wfm, ssize_t i)
779{ return wfm->m_samples[i] * wfm->m_offsets[i]; }
780
791int64_t GetOffset(const SparseWaveformBase* wfm, size_t i)
792{ return wfm->m_offsets[i]; }
793
804int64_t GetOffset(const UniformWaveformBase* /*wfm*/, size_t i)
805{ return i; }
806
816int64_t GetDuration(const SparseWaveformBase* wfm, size_t i)
817{ return wfm->m_durations[i]; }
818
828int64_t GetDuration(const UniformWaveformBase* /*wfm*/, size_t /*i*/)
829{ return 1; }
830
840template<class T>
842{ return (GetOffset(wfm, i) * wfm->m_timescale) + wfm->m_triggerPhase; }
843
853template<class T>
855{ return GetDuration(wfm, i) * wfm->m_timescale; }
856
863static int64_t GetOffset(const SparseWaveformBase* sparse, const UniformWaveformBase* uniform, size_t i);
864
871static int64_t GetDuration(const SparseWaveformBase* sparse, const UniformWaveformBase* uniform, size_t i);
872
880
888
889int64_t GetOffset(const SparseWaveformBase* sparse, const UniformWaveformBase* uniform, size_t i)
890{
891 if(sparse)
892 return GetOffset(sparse, i);
893 else
894 return GetOffset(uniform, i);
895}
896
897int64_t GetDuration(const SparseWaveformBase* sparse, const UniformWaveformBase* uniform, size_t i)
898{
899 if(sparse)
900 return GetDuration(sparse, i);
901 else
902 return GetDuration(uniform, i);
903}
904
906{
907 if(sparse)
908 return GetOffsetScaled(sparse, i);
909 else
910 return GetOffsetScaled(uniform, i);
911}
912
914{
915 if(sparse)
916 return GetDurationScaled(sparse, i);
917 else
918 return GetDurationScaled(uniform, i);
919}
920
927template<class T>
928static T GetValue(const SparseWaveform<T>* sparse, const UniformWaveform<T>* uniform, size_t i)
929{
930 if(sparse)
931 return sparse->m_samples[i];
932 else
933 return uniform->m_samples[i];
934}
935
936//Template helper methods for validating that an input is the correct type
937static void AssertTypeIsSparseWaveform(const SparseWaveformBase* /*unused*/);
938static void AssertTypeIsUniformWaveform(const UniformWaveformBase* /*unused*/);
939static void AssertTypeIsAnalogWaveform(const SparseAnalogWaveform* /*unused*/);
940static void AssertTypeIsAnalogWaveform(const UniformAnalogWaveform* /*unused*/);
941static void AssertTypeIsDigitalWaveform(const SparseDigitalWaveform* /*unused*/);
942static void AssertTypeIsDigitalWaveform(const UniformDigitalWaveform* /*unused*/);
943
944void AssertTypeIsSparseWaveform(const SparseWaveformBase* /*unused*/){}
945void AssertTypeIsUniformWaveform(const UniformWaveformBase* /*unused*/){}
946void AssertTypeIsAnalogWaveform(const SparseAnalogWaveform* /*unused*/){}
947void AssertTypeIsAnalogWaveform(const UniformAnalogWaveform* /*unused*/){}
948void AssertTypeIsDigitalWaveform(const SparseDigitalWaveform* /*unused*/){}
949void AssertTypeIsDigitalWaveform(const UniformDigitalWaveform* /*unused*/){}
950
951//Template helper methods for validating that two waveforms are the same sample type
952//(but either may be sparse or uniform)
953template<class T>
954void AssertSampleTypesAreSame(const SparseWaveform<T>* /*a*/, const SparseWaveform<T>* /*b*/)
955{}
956
957template<class T>
958void AssertSampleTypesAreSame(const SparseWaveform<T>* /*a*/, const UniformWaveform<T>* /*b*/)
959{}
960
961template<class T>
962void AssertSampleTypesAreSame(const UniformWaveform<T>* /*a*/, const SparseWaveform<T>* /*b*/)
963{}
964
965template<class T>
966void AssertSampleTypesAreSame(const UniformWaveform<T>* /*a*/, const UniformWaveform<T>* /*b*/)
967{}
968
973template<class T>
974size_t BinarySearchForGequal(T* buf, size_t len, T value);
975
987
994
1000
1006
1011std::optional<std::string> GetProtocolValueAtTime(WaveformBase* waveform, int64_t time_fs);
1012
1013#pragma GCC diagnostic pop
1014
1015#endif
Declaration of AcceleratorBuffer.
Declaration of AlignedAllocator.
size_t capacity() const
Returns the allocated size of the container.
Definition AcceleratorBuffer.h:290
size_t size() const
Returns the actual size of the container (may be smaller than what was allocated)
Definition AcceleratorBuffer.h:286
Definition AcceleratorBuffer.h:204
A buffer of memory which may be used by GPU acceleration.
Definition AcceleratorBuffer.h:343
size_t GetMemoryBytes() const
Returns the total size of the buffer (wherever it is), in bytes.
Definition AcceleratorBuffer.h:582
void reserve(size_t size)
Reallocates buffers so that at least size elements of storage are available.
Definition AcceleratorBuffer.h:709
bool HasGpuBuffer() const
Returns true if there is currently a GPU-side buffer.
Definition AcceleratorBuffer.h:634
void clear()
Resize the container to be empty (but don't free memory)
Definition AcceleratorBuffer.h:703
void resize(size_t size, bool exactSize=false)
Change the usable size of the container.
Definition AcceleratorBuffer.h:679
A multi-bit (up to 32 bits) digital waveform sampled at variable rate.
Definition Waveform.h:705
Base class for waveforms with nonuniform sample rate.
Definition Waveform.h:293
virtual void SetCpuOnlyHint()
Helper function to indicate this waveform will only be used on the CPU.
Definition Waveform.h:318
SparseWaveformBase()
Constructs a new empty sparse waveform.
Definition Waveform.h:299
AcceleratorBuffer< int64_t > m_offsets
Start timestamps of each sample, in multiples of m_timescale.
Definition Waveform.h:328
virtual void MarkModifiedFromGpu() override
Indicates that this waveform's sample data and timestamps have been modified on the GPU and the CPU-s...
Definition Waveform.h:364
void CopyTimestamps(const SparseWaveformBase *rhs)
Copies offsets/durations from another waveform into this one.
Definition Waveform.h:340
virtual void MarkModifiedFromCpu() override
Indicates that this waveform's sample data and timestamps have been modified on the CPU and the GPU-s...
Definition Waveform.h:358
AcceleratorBuffer< int64_t > m_durations
Durations of each sample, in multiples of m_timescale.
Definition Waveform.h:331
A waveform sampled at irregular intervals.
Definition Waveform.h:514
virtual size_t GetMemoryBytes() const override
Gets the amount of memory consumed by the waveform (may be CPU, GPU, or mirrored)
Definition Waveform.h:618
virtual void Reserve(size_t size) override
Preallocates buffers without changing the usable size of the waveform.
Definition Waveform.h:608
virtual void FreeGpuMemory() override
Free GPU-side memory if we are short on VRAM or do not anticipate using this waveform for a while.
Definition Waveform.h:591
virtual void PrepareForCpuAccess() override
Indicates that this waveform is going to be used by the CPU in the near future.
Definition Waveform.h:631
virtual void SetCpuOnlyHint() override
Helper function to indicate this waveform will only be used on the CPU.
Definition Waveform.h:580
virtual void clear() override
Remove all samples from this waveform.
Definition Waveform.h:624
SparseWaveform(const std::string &name="")
Creates a new sparse waveform.
Definition Waveform.h:522
virtual void PrepareForCpuAccessNonblocking(vk::raii::CommandBuffer &cmdBuf) override
Indicates that this waveform is going to be used by the CPU in the near future.
Definition Waveform.h:638
virtual size_t size() const override
Returns the number of samples in this waveform.
Definition Waveform.h:615
virtual void Rename(const std::string &name="") override
Assigns a human readable name to the waveform for debug purposes.
Definition Waveform.h:532
virtual void MarkSamplesModifiedFromGpu() override
Indicates that this waveform's sample data has been modified on the GPU and the CPU-side copy is no l...
Definition Waveform.h:662
AcceleratorBuffer< S > m_samples
Sample data.
Definition Waveform.h:589
virtual void PrepareForGpuAccess() override
Indicates that this waveform is going to be used by the GPU in the near future.
Definition Waveform.h:645
void SetGpuAccessHint(enum AcceleratorBuffer< S >::UsageHint hint)
Passes a hint to the memory allocator about where our sample data is expected to be used.
Definition Waveform.h:670
virtual void Resize(size_t size) override
Reallocates buffers so the waveform contains the specified number of samples.
Definition Waveform.h:601
virtual void PrepareForGpuAccessNonblocking(vk::raii::CommandBuffer &cmdBuf) override
Indicates that this waveform is going to be used by the GPU in the near future.
Definition Waveform.h:652
virtual size_t capacity() const override
Returns the number of samples allocated in this waveform.
Definition Waveform.h:621
virtual bool HasGpuBuffer() override
Returns true if we have at least one buffer resident on the GPU.
Definition Waveform.h:598
SparseWaveform(UniformWaveform< S > &rhs)
Constructs a sparse waveform as a copy of a uniform waveform, marking all samples as 1 timebase unit ...
Definition Waveform.h:551
virtual void MarkSamplesModifiedFromCpu() override
Indicates that this waveform's sample data has been modified on the CPU and the GPU-side copy is no l...
Definition Waveform.h:659
A multi-bit (up to 32 bits) digital waveform sampled at uniform rate.
Definition Waveform.h:689
A multi-bit (up to 64 bits) digital waveform sampled at uniform rate.
Definition Waveform.h:721
Base class for waveforms with data sampled at uniform intervals.
Definition Waveform.h:376
UniformWaveformBase(const SparseWaveformBase &rhs)
Creates a uniform waveform as a copy of a sparse one.
Definition Waveform.h:388
A waveform sampled at uniform intervals.
Definition Waveform.h:404
AcceleratorBuffer< S > m_samples
Sample data.
Definition Waveform.h:449
virtual size_t capacity() const override
Returns the number of samples allocated in this waveform.
Definition Waveform.h:469
virtual void PrepareForCpuAccess() override
Indicates that this waveform is going to be used by the CPU in the near future.
Definition Waveform.h:475
virtual void MarkSamplesModifiedFromGpu() override
Indicates that this waveform's sample data has been modified on the GPU and the CPU-side copy is no l...
Definition Waveform.h:490
void SetGpuAccessHint(enum AcceleratorBuffer< S >::UsageHint hint)
Passes a hint to the memory allocator about where our sample data is expected to be used.
Definition Waveform.h:504
UniformWaveform(const SparseWaveform< S > &rhs)
Creates a uniform waveform as a copy of a sparse one which happens to be sampled at uniform rate.
Definition Waveform.h:437
virtual void PrepareForGpuAccessNonblocking(vk::raii::CommandBuffer &cmdBuf) override
Indicates that this waveform is going to be used by the GPU in the near future.
Definition Waveform.h:484
virtual void MarkModifiedFromGpu() override
Indicates that this waveform's sample data and timestamps have been modified on the GPU and the CPU-s...
Definition Waveform.h:496
virtual void Reserve(size_t size) override
Preallocates buffers without changing the usable size of the waveform.
Definition Waveform.h:460
UniformWaveform(const std::string &name="")
Creates a new uniform waveform.
Definition Waveform.h:412
virtual size_t GetMemoryBytes() const override
Gets the amount of memory consumed by the waveform (may be CPU, GPU, or mirrored)
Definition Waveform.h:463
virtual void PrepareForCpuAccessNonblocking(vk::raii::CommandBuffer &cmdBuf) override
Indicates that this waveform is going to be used by the CPU in the near future.
Definition Waveform.h:481
virtual void PrepareForGpuAccess() override
Indicates that this waveform is going to be used by the GPU in the near future.
Definition Waveform.h:478
virtual void clear() override
Remove all samples from this waveform.
Definition Waveform.h:472
virtual void MarkSamplesModifiedFromCpu() override
Indicates that this waveform's sample data has been modified on the CPU and the GPU-side copy is no l...
Definition Waveform.h:487
virtual void MarkModifiedFromCpu() override
Indicates that this waveform's sample data and timestamps have been modified on the CPU and the GPU-s...
Definition Waveform.h:493
virtual size_t size() const override
Returns the number of samples in this waveform.
Definition Waveform.h:466
virtual void Rename(const std::string &name="") override
Assigns a human readable name to the waveform for debug purposes.
Definition Waveform.h:422
virtual void Resize(size_t size) override
Reallocates buffers so the waveform contains the specified number of samples.
Definition Waveform.h:457
virtual void FreeGpuMemory() override
Free GPU-side memory if we are short on VRAM or do not anticipate using this waveform for a while.
Definition Waveform.h:451
virtual bool HasGpuBuffer() override
Returns true if we have at least one buffer resident on the GPU.
Definition Waveform.h:454
Base class for all Waveform specializations.
Definition Waveform.h:59
virtual void PrepareForCpuAccessNonblocking(vk::raii::CommandBuffer &cmdBuf)=0
Indicates that this waveform is going to be used by the CPU in the near future.
uint64_t m_revision
Revision number.
Definition Waveform.h:140
virtual size_t size() const =0
Returns the number of samples in this waveform.
virtual uint32_t GetColorCached(size_t i)
Returns the packed RGBA32 color of a given protocol sample calculated by CacheColors()
Definition Waveform.h:211
virtual void MarkModifiedFromCpu()=0
Indicates that this waveform's sample data and timestamps have been modified on the CPU and the GPU-s...
AcceleratorBuffer< uint32_t > m_protocolColors
Cache of packed RGBA32 data with colors for each protocol decode event. Empty for non-protocol wavefo...
Definition Waveform.h:273
virtual void FreeGpuMemory()=0
Free GPU-side memory if we are short on VRAM or do not anticipate using this waveform for a while.
time_t m_startTimestamp
Start time of the acquisition, integer part.
Definition Waveform.h:110
virtual void Rename(const std::string &name="")=0
Assigns a human readable name to the waveform for debug purposes.
virtual void CacheColors()
Updates the cache of packed colors to avoid string parsing every frame.
Definition Waveform.cpp:337
virtual void PrepareForCpuAccess()=0
Indicates that this waveform is going to be used by the CPU in the near future.
virtual void MarkSamplesModifiedFromCpu()=0
Indicates that this waveform's sample data has been modified on the CPU and the GPU-side copy is no l...
WaveformBase()
Creates an empty waveform.
Definition Waveform.h:65
virtual size_t GetMemoryBytes() const =0
Gets the amount of memory consumed by the waveform (may be CPU, GPU, or mirrored)
int64_t m_startFemtoseconds
Start time of the acquisition, fractional part (femtoseconds since since the UTC second)
Definition Waveform.h:113
virtual void PrepareForGpuAccessNonblocking(vk::raii::CommandBuffer &cmdBuf)=0
Indicates that this waveform is going to be used by the GPU in the near future.
virtual size_t capacity() const =0
Returns the number of samples allocated in this waveform.
virtual std::string GetColor(size_t)
Returns the displayed color (in HTML #rrggbb or #rrggbbaa notation) of a given protocol sample.
Definition Waveform.h:199
int64_t m_triggerPhase
Offset, in X axis units (usually femtoseconds), from the trigger to the sampling clock.
Definition Waveform.h:126
virtual void Resize(size_t size)=0
Reallocates buffers so the waveform contains the specified number of samples.
virtual void clear()=0
Remove all samples from this waveform.
virtual bool HasGpuBuffer()=0
Returns true if we have at least one buffer resident on the GPU.
uint8_t m_flags
Flags that apply to this waveform. Bitfield containing zero or more WaveformFlags_t values.
Definition Waveform.h:131
int64_t m_timescale
The time scale, in X axis units (usually femtoseconds) per timestep, used by this channel.
Definition Waveform.h:107
virtual bool empty()
Returns true if this waveform contains no samples, false otherwise.
Definition Waveform.h:177
WaveformBase(const WaveformBase &rhs)
Creates a waveform, copying metadata from another.
Definition Waveform.h:79
WaveformFlags_t
Flags which may apply to m_flags.
Definition Waveform.h:144
@ WAVEFORM_CLIPPING
Waveform amplitude exceeded ADC range, values were clipped.
Definition Waveform.h:146
uint64_t m_cachedColorRevision
Revision we last cached colors of.
Definition Waveform.h:276
virtual void Reserve(size_t size)=0
Preallocates buffers without changing the usable size of the waveform.
virtual void MarkModifiedFromGpu()=0
Indicates that this waveform's sample data and timestamps have been modified on the GPU and the CPU-s...
virtual std::string GetText(size_t i)
Returns the text representation of a given protocol sample.
Definition Waveform.h:187
virtual void MarkSamplesModifiedFromGpu()=0
Indicates that this waveform's sample data has been modified on the GPU and the CPU-side copy is no l...
virtual void PrepareForGpuAccess()=0
Indicates that this waveform is going to be used by the GPU in the near future.
std::optional< bool > GetDigitalValueAtTime(WaveformBase *waveform, int64_t time_fs)
Gets the value of our channel at the specified timestamp (absolute, not waveform ticks).
Definition Waveform.cpp:200
int64_t GetDurationScaled(T *wfm, size_t i)
Returns the duration of a sample, in X axis units.
Definition Waveform.h:854
std::optional< uint64_t > GetDigitalBusValueAtTime(WaveformBase *waveform, int64_t time_fs)
Gets the value of our channel at the specified timestamp (absolute, not waveform ticks).
Definition Waveform.cpp:230
std::optional< std::string > GetProtocolValueAtTime(WaveformBase *waveform, int64_t time_fs)
Gets the value of our channel at the specified timestamp (absolute, not waveform ticks).
Definition Waveform.cpp:255
size_t GetIndexNearestAtOrBeforeTimestamp(WaveformBase *wfm, int64_t time_fs, bool &out_of_bounds)
Find the index of the sample in a (possibly sparse) waveform that COULD include the time time_fs.
Definition Waveform.cpp:94
size_t BinarySearchForGequal(T *buf, size_t len, T value)
Look for a value greater than or equal to "value" in buf and return the index.
Definition Waveform.cpp:44
int64_t GetOffsetScaled(T *wfm, size_t i)
Returns the offset of a sample from the start of the waveform, in X axis units.
Definition Waveform.h:841
std::optional< float > GetValueAtTime(WaveformBase *waveform, int64_t time_fs, bool zero_hold_behavior)
Gets the value of our channel at the specified timestamp (absolute, not waveform ticks) and interpola...
Definition Waveform.cpp:159