LUMIERA.clone/src/proc/engine/engine-service.cpp
2012-10-10 05:18:58 +02:00

179 lines
5.3 KiB
C++

/*
EngineService - primary service access point for using the renderengine
Copyright (C) Lumiera.org
2011, Hermann Vosseler <Ichthyostega@web.de>
This program 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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
#include "proc/engine/engine-service.hpp"
//#include <string>
//#include <memory>
//#include <tr1/functional>
//#include <boost/scoped_ptr.hpp>
namespace proc {
namespace engine{
// using std::string;
// using lumiera::Subsys;
// using std::auto_ptr;
// using boost::scoped_ptr;
// using std::tr1::bind;
namespace { // hidden local details of the service implementation....
} // (End) hidden service impl details
/** storage for the EngineService interface object */
lib::Singleton<EngineService> EngineService::instance;
/** */
EngineService::EngineService()
{ }
/** core operation: activate the Lumiera Render Engine.
* Invoking this service effectively hooks up each channel
* of the given model exit point to deliver into the corresponding
* output sink on the given OutputConnection (which is assumed
* to be already allocated for active use by this connection).
* The generated calculation streams represent actively ongoing
* calculations within the engine, started right away, according
* to the given timing constraints and service quality.
*/
CalcStreams
EngineService::calculate(ModelPort mPort,
Timings nominalTimings,
OutputConnection& output,
Quality serviceQuality)
{
UNIMPLEMENTED ("build a list of standard calculation streams");
}
/** */
CalcStreams
EngineService::calculateBackground(ModelPort mPort,
Timings nominalTimings,
Quality serviceQuality)
{
UNIMPLEMENTED ("build calculation streams for background rendering");
}
/** @internal build a representation of a single, ongoing calculation effort.
* This "CalcStream" is tied to the actual engine implementation, but only
* through an opaque link, representing this concrete engine as an
* RenderEnvironmentClosure. This enables the created CalcStream to be
* re-configured and adjusted while running.
*/
CalcStream
EngineService::activateCalculation (RenderEnvironmentClosure& engineCallback)
{
return CalcStream (engineCallback);
}
/** @internal extension point
* Install and activate a single, ongoing calculation effort.
* Configure and prepare all the internal components, pre-allocate
* resources and add entries to the registration tables to get this
* render activity into running state
* @return CalcStream representing this newly started rendering activity
* @note variations and especially mock implementations of the render engine
* might choose to configure internal differently. As long as the
* CalcStream and the embedded RenderEnvironmentClosure are consistent,
* such a specific configuration remains opaque for the user of the
* created render activity
*/
RenderEnvironmentClosure&
EngineService::configureCalculation ()
{
UNIMPLEMENTED ("represent *this as RenderEnvironmentClosure)");
RenderEnvironmentClosure* todo_fake(0); ////KABOOOM
return *todo_fake;
}
/* ===== Quality-of-Service ===== */
EngineService::Quality::~Quality() { } // emit vtables here...
enum CalcType {
PLAYBACK,
RENDER,
BACKGROUND
};
class DefaultQoS
: public EngineService::Quality
{
CalcType type_;
public:
DefaultQoS (CalcType type)
: type_(type)
{ }
};
class PriorityQoS
: public DefaultQoS
{
public:
PriorityQoS ()
: DefaultQoS(PLAYBACK)
{ }
};
class Compromise
: public DefaultQoS
{
public:
Compromise (CalcType type)
: DefaultQoS(type)
{ }
};
EngineService::QoS_Definition EngineService::QoS_DEFAULT = QoS_Definition::build<DefaultQoS> (PLAYBACK);
EngineService::QoS_Definition EngineService::QoS_BACKGROUND = QoS_Definition::build<DefaultQoS> (BACKGROUND);
EngineService::QoS_Definition EngineService::QoS_COMPROMISE = QoS_Definition::build<Compromise> (PLAYBACK);
EngineService::QoS_Definition EngineService::QoS_PERFECT_RESULT = QoS_Definition::build<DefaultQoS> (RENDER);
EngineService::QoS_Definition EngineService::QoS_SYNC_PRIORITY = QoS_Definition::build<PriorityQoS>();
}} // namespace proc::engine