blob: 38b29d6efea6f463453e8514619903f9d817e28f [file] [log] [blame]
// Copyright (C) 2019 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef COMPUTEPIPE_RUNNER_COMPONENT_H
#define COMPUTEPIPE_RUNNER_COMPONENT_H
#include <map>
#include <memory>
#include <string>
#include "types/Status.h"
namespace android {
namespace automotive {
namespace computepipe {
namespace runner {
class RunnerComponentInterface;
/**
* Represents the state of the config phase a particular client config is in
*/
enum PhaseState {
ENTRY = 0,
TRANSITION_COMPLETE,
ABORTED,
};
/**
* RunnerEvent represents an event corresponding to a runner phase
* Along with start, abort or transition complete query methods.
*/
class RunnerEvent {
public:
/* Is this a notification to enter the phase */
virtual bool isPhaseEntry() const;
/* Is this a notification that all components have transitioned to the phase */
virtual bool isTransitionComplete() const;
/* Is this a notification to abort the transition to the started phase */
virtual bool isAborted() const;
/* Dispatch event to component */
virtual Status dispatchToComponent(const std::shared_ptr<RunnerComponentInterface>& iface) = 0;
/* Destructor */
virtual ~RunnerEvent() = default;
};
/**
* Configuration that gets emitted once client has completely specified config
* options
*/
class ClientConfig : public RunnerEvent {
public:
static const int kInvalidId = -1;
/**
* Override relevant methods from RunnerEvent
*/
bool isPhaseEntry() const override {
return mState == ENTRY;
}
bool isTransitionComplete() const override {
return mState == TRANSITION_COMPLETE;
}
bool isAborted() const override {
return mState == ABORTED;
}
Status dispatchToComponent(const std::shared_ptr<RunnerComponentInterface>& iface) override;
/**
* Accessor methods
*/
Status getInputConfigId(int* outId) const;
Status getOutputConfigId(int* outId) const;
Status getOffloadId(int* outId) const;
Status getTerminationId(int* outId) const;
Status getOptionalConfigs(std::string& outOptional) const;
Status getOutputStreamConfigs(std::map<int, int>& outputConfig) const;
std::string getSerializedClientConfig() const;
/**
* Constructors
*/
ClientConfig& operator=(ClientConfig&& r) {
mInputConfigId = r.mInputConfigId;
mTerminationId = r.mTerminationId;
mOffloadId = r.mOffloadId;
mOptionalConfigs = std::move(r.mOptionalConfigs);
mOutputConfigs = std::move(r.mOutputConfigs);
return *this;
}
ClientConfig(ClientConfig&& c) {
*this = std::move(c);
}
ClientConfig(int inputConfigId, int offload, int termination, std::map<int, int>& outputConfigs,
std::string opt = "")
: mInputConfigId(inputConfigId),
mOutputConfigs(outputConfigs),
mTerminationId(termination),
mOffloadId(offload),
mOptionalConfigs(opt) {
}
void setPhaseState(PhaseState state) {
mState = state;
}
private:
/**
* input streamd id from the graph descriptor options
*/
int mInputConfigId = kInvalidId;
/**
* Options for different output streams
*/
std::map<int, int> mOutputConfigs;
/**
* Termination Option
*/
int mTerminationId = kInvalidId;
/**
* offload option
*/
int mOffloadId = kInvalidId;
/**
* serialized optional config
*/
std::string mOptionalConfigs = "";
/**
* The state of the client config corresponding
* to entry, transition complete or aborted
*/
PhaseState mState = ENTRY;
};
/**
* A component of the Runner Engine implements this interface to receive
* RunnerEvents.
* A SUCCESS return value indicates the component has handled the particular
* event. A failure return value will result in a subsequent abort call
* that should be ignored by the component that reported failure.
*/
class RunnerComponentInterface {
public:
/* handle a ConfigPhase related event notification from Runner Engine */
virtual Status handleConfigPhase(const ClientConfig& e);
/* handle execution phase notification from Runner Engine */
virtual Status handleExecutionPhase(const RunnerEvent& e);
/* handle a stop with flushing semantics phase notification from the engine */
virtual Status handleStopWithFlushPhase(const RunnerEvent& e);
/* handle an immediate stop phase notification from the engine */
virtual Status handleStopImmediatePhase(const RunnerEvent& e);
/* handle an engine notification to return to reset state */
virtual Status handleResetPhase(const RunnerEvent& e);
virtual ~RunnerComponentInterface() = default;
};
} // namespace runner
} // namespace computepipe
} // namespace automotive
} // namespace android
#endif