2011-09-18 15:28:58 +02:00
|
|
|
|
/*
|
|
|
|
|
|
TESTFRAME.hpp - test data frame (stub) for checking Render engine functionality
|
|
|
|
|
|
|
Copyright: clarify and simplify the file headers
* Lumiera source code always was copyrighted by individual contributors
* there is no entity "Lumiera.org" which holds any copyrights
* Lumiera source code is provided under the GPL Version 2+
== Explanations ==
Lumiera as a whole is distributed under Copyleft, GNU General Public License Version 2 or above.
For this to become legally effective, the ''File COPYING in the root directory is sufficient.''
The licensing header in each file is not strictly necessary, yet considered good practice;
attaching a licence notice increases the likeliness that this information is retained
in case someone extracts individual code files. However, it is not by the presence of some
text, that legally binding licensing terms become effective; rather the fact matters that a
given piece of code was provably copyrighted and published under a license. Even reformatting
the code, renaming some variables or deleting parts of the code will not alter this legal
situation, but rather creates a derivative work, which is likewise covered by the GPL!
The most relevant information in the file header is the notice regarding the
time of the first individual copyright claim. By virtue of this initial copyright,
the first author is entitled to choose the terms of licensing. All further
modifications are permitted and covered by the License. The specific wording
or format of the copyright header is not legally relevant, as long as the
intention to publish under the GPL remains clear. The extended wording was
based on a recommendation by the FSF. It can be shortened, because the full terms
of the license are provided alongside the distribution, in the file COPYING.
2024-11-17 23:42:55 +01:00
|
|
|
|
Copyright (C)
|
|
|
|
|
|
2011, Hermann Vosseler <Ichthyostega@web.de>
|
|
|
|
|
|
|
|
|
|
|
|
**Lumiera** is free software; you can redistribute it and/or modify it
|
|
|
|
|
|
under the terms of the GNU General Public License as published by the
|
|
|
|
|
|
Free Software Foundation; either version 2 of the License, or (at your
|
|
|
|
|
|
option) any later version. See the file COPYING for further details.
|
2011-09-18 15:28:58 +02:00
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2017-02-22 01:58:49 +01:00
|
|
|
|
/** @file testframe.hpp
|
|
|
|
|
|
** Unit test helper to generate fake test data frames
|
2016-11-03 18:20:10 +01:00
|
|
|
|
*/
|
|
|
|
|
|
|
2011-09-18 15:28:58 +02:00
|
|
|
|
|
2018-11-15 23:52:02 +01:00
|
|
|
|
#ifndef STEAM_ENGINE_TESTFRAME_H
|
|
|
|
|
|
#define STEAM_ENGINE_TESTFRAME_H
|
2011-09-18 15:28:58 +02:00
|
|
|
|
|
|
|
|
|
|
|
2024-11-05 21:23:13 +01:00
|
|
|
|
#include "lib/integral.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
#include <array>
|
2011-09-18 15:28:58 +02:00
|
|
|
|
|
|
|
|
|
|
|
2018-11-15 23:55:13 +01:00
|
|
|
|
namespace steam {
|
2011-09-18 15:28:58 +02:00
|
|
|
|
namespace engine {
|
|
|
|
|
|
namespace test {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Mock data frame for simulated rendering.
|
|
|
|
|
|
* A test frame can be created and placed instead of a real data frame.
|
|
|
|
|
|
* It doesn't depend on any external libraries and will be self-maintaining.
|
|
|
|
|
|
* Placeholder functions are provided for assignment (simulating the actual
|
|
|
|
|
|
* calculations); additional diagnostic functions allow to verify the
|
|
|
|
|
|
* performed operations after-the fact
|
2011-10-31 02:20:32 +01:00
|
|
|
|
*
|
|
|
|
|
|
* Each TestFrame is automatically filled with pseudo random data;
|
|
|
|
|
|
* multiple frames are arranged in sequences and channels, causing the random data
|
2011-11-01 03:11:43 +01:00
|
|
|
|
* to be reproducible yet different within each frame. TestFrame's lifecycle is
|
|
|
|
|
|
* tracked and marked in an embedded state field. Moreover, the contents of the
|
|
|
|
|
|
* data block can be verified, because the sequence of bytes is reproducible,
|
2011-10-31 02:20:32 +01:00
|
|
|
|
* based on the channel and sequence number of the test frame.
|
|
|
|
|
|
*
|
2011-11-01 03:11:43 +01:00
|
|
|
|
* @see TestFrame_test
|
|
|
|
|
|
* @see OutputSlotProtocol_test
|
2011-09-18 15:28:58 +02:00
|
|
|
|
*
|
|
|
|
|
|
*/
|
|
|
|
|
|
class TestFrame
|
|
|
|
|
|
{
|
2011-10-31 00:13:35 +01:00
|
|
|
|
enum StageOfLife {
|
|
|
|
|
|
CREATED, EMITTED, DISCARDED
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2024-11-05 21:23:13 +01:00
|
|
|
|
static constexpr size_t BUFFSIZ = 1024;
|
|
|
|
|
|
using _Arr = std::array<char,BUFFSIZ>;
|
2011-10-31 00:13:35 +01:00
|
|
|
|
|
2011-11-01 03:11:43 +01:00
|
|
|
|
uint64_t distinction_;
|
2011-10-31 00:13:35 +01:00
|
|
|
|
StageOfLife stage_;
|
|
|
|
|
|
|
2024-11-05 21:23:13 +01:00
|
|
|
|
/** inline storage buffer for the payload media data */
|
|
|
|
|
|
alignas(uint64_t)
|
|
|
|
|
|
std::byte buffer_[sizeof(_Arr)];
|
2011-09-18 15:28:58 +02:00
|
|
|
|
|
|
|
|
|
|
public:
|
2011-10-31 00:13:35 +01:00
|
|
|
|
~TestFrame();
|
|
|
|
|
|
TestFrame (uint seq=0, uint family=0);
|
|
|
|
|
|
TestFrame (TestFrame const&);
|
|
|
|
|
|
TestFrame& operator= (TestFrame const&);
|
2011-09-19 01:42:37 +02:00
|
|
|
|
|
2011-11-01 03:11:43 +01:00
|
|
|
|
/** Helper to verify that a given memory location holds
|
2011-10-30 05:35:36 +01:00
|
|
|
|
* an active TestFrame instance (created, not yet destroyed)
|
|
|
|
|
|
* @return true if the TestFrame datastructure is intact and
|
|
|
|
|
|
* marked as still alive.
|
|
|
|
|
|
*/
|
2011-10-31 00:13:35 +01:00
|
|
|
|
static bool isAlive (void* memLocation);
|
2011-10-30 05:35:36 +01:00
|
|
|
|
|
|
|
|
|
|
/** Helper to verify a given memory location holds
|
|
|
|
|
|
* an already destroyed TestFrame instance */
|
2011-10-31 00:13:35 +01:00
|
|
|
|
static bool isDead (void* memLocation);
|
|
|
|
|
|
|
|
|
|
|
|
bool isAlive() const;
|
|
|
|
|
|
bool isDead() const;
|
|
|
|
|
|
bool isSane() const;
|
2011-10-30 05:35:36 +01:00
|
|
|
|
|
2011-10-31 00:13:35 +01:00
|
|
|
|
bool operator== (void* memLocation) const;
|
2011-09-19 01:42:37 +02:00
|
|
|
|
|
2011-10-31 00:13:35 +01:00
|
|
|
|
friend bool operator== (TestFrame const& f1, TestFrame const& f2) { return f1.contentEquals(f2); }
|
|
|
|
|
|
friend bool operator!= (TestFrame const& f1, TestFrame const& f2) { return !f1.contentEquals(f2); }
|
2024-11-05 21:23:13 +01:00
|
|
|
|
|
|
|
|
|
|
/** Array-style direct access to the payload data */
|
|
|
|
|
|
_Arr& data() { return * std::launder (reinterpret_cast<_Arr* > (&buffer_)); }
|
|
|
|
|
|
_Arr const& data() const { return * std::launder (reinterpret_cast<_Arr const*> (&buffer_)); }
|
2011-09-19 01:42:37 +02:00
|
|
|
|
|
2011-10-31 00:13:35 +01:00
|
|
|
|
private:
|
|
|
|
|
|
bool contentEquals (TestFrame const& o) const;
|
2011-11-01 03:11:43 +01:00
|
|
|
|
bool verifyData() const;
|
2011-10-31 02:20:32 +01:00
|
|
|
|
void buildData ();
|
2011-09-18 15:28:58 +02:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2011-10-31 02:20:32 +01:00
|
|
|
|
/** Helper to access a specific frame of test data at a fixed memory location.
|
|
|
|
|
|
* The series of test frames is generated on demand, but remains in memory thereafter,
|
|
|
|
|
|
* similar to real data accessible from some kind of source stream. Each of these generated
|
|
|
|
|
|
* test frames filled with different yet reproducible pseudo random data.
|
|
|
|
|
|
* Client code is free to access and corrupt this data.
|
|
|
|
|
|
*/
|
|
|
|
|
|
TestFrame& testData (uint seqNr);
|
2011-09-18 15:28:58 +02:00
|
|
|
|
|
2011-10-31 02:20:32 +01:00
|
|
|
|
TestFrame& testData (uint chanNr, uint seqNr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** discards all the TestFrame instances and
|
|
|
|
|
|
* initialises an empty table of test frames */
|
|
|
|
|
|
void resetTestFrames();
|
2011-09-18 15:28:58 +02:00
|
|
|
|
|
|
|
|
|
|
|
2011-12-02 17:50:44 +01:00
|
|
|
|
|
2018-11-15 23:55:13 +01:00
|
|
|
|
}}} // namespace steam::engine::test
|
2011-09-18 15:28:58 +02:00
|
|
|
|
#endif
|