blob: e81bddfc1d39624bfdce1a022d69dc59583ebe67 [file] [log] [blame]
/*
* Copyright (C) 2018-2020 Intel Corporation.
*
* 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.
*/
#pragma once
extern "C" {
#include <ia_css_program_group_data.h>
#include <ia_css_program_group_param.h>
#include <ia_css_psys_process_group.h>
#include <ia_css_psys_program_group_manifest.h>
#include <ia_css_psys_terminal.h>
#include <ia_css_psys_terminal_manifest.h>
#include <ia_css_terminal_manifest_types.h>
#include <ia_css_terminal_types.h>
#include <ia_isp_bxt.h>
#include <ia_isp_types.h>
#include <ia_p2p.h>
#include <ia_p2p_types.h>
#include <ia_pal_types_isp_ids_autogen.h>
#include <pg_control_init_framework.h>
}
#include <map>
#include <memory>
#include <vector>
#include "ia_tools/css_types.h"
#include "iutils/Errors.h"
#include "iutils/Utils.h"
#include "modules/ia_cipr/include/Utils.h"
#include "src/core/psysprocessor/PGUtils.h"
namespace icamera {
#define PSYS_MAX_KERNELS_PER_PG IA_CSS_KERNEL_BITMAP_BITS
/**
* \class IntelPGParam
*
* \brief This is a version P2P implementation which is used to encode parameter terminal
* and decode statistic terminal for PSYS pipeline.
*
* The call sequence as follows:
* 1. init();
* 2. prepare();
* 3. allocatePGBuffer() (optional);
* 4. setPGAndPrepareProgram();
* 5. getPayloadSizes(), and allocate payload buffers,
* allocatePayloads() is provided for that;
* 6. getFragmentDescriptors();
* 7. loop frame {
* updatePALAndEncode();
* decode();
* }
* 8. deinit();
*/
class IntelPGParam {
public:
explicit IntelPGParam(int pgId);
~IntelPGParam();
/**
* Use to init and config P2P handle.
*/
int init(ia_p2p_platform_t platform, const PgConfiguration& Pgconfiguration);
/**
* Query and save the requirement for each terminal, calculate the final kernel bitmap.
*/
int prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
ia_css_kernel_bitmap_t* bitmap, uint32_t* maxStatsSize = nullptr);
/**
* Allocate PG buffer for caller
*/
void* allocatePGBuffer(int pgSize);
/**
* Accept pg outside and init program_control_init terminal.
*/
int setPGAndPrepareProgram(ia_css_process_group_t* pg);
/**
* Allocate payload memory for terminals.
*/
int allocatePayloads(int payloadCount, ia_binary_data* payloads);
/**
* Update PAL and encode payload data for all terminals. Will skip inactive terminals.
*/
int updatePALAndEncode(const ia_binary_data* ipuParams, int payloadCount,
ia_binary_data* payloads);
/**
* Decode payload data for all related terminals.
*/
int decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics);
/**
* Use to deinit P2P handle.
*/
void deinit();
/**
* Get fragment descriptors calculated according to PAL data
* Called after prepare().
*/
int getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs);
/**
* Get payload size for all terminals, and return valid payloads number.
*/
int getPayloadSizes(int payloadCount, ia_binary_data* payloads);
private:
enum FragmentDataTerminalType {
FRAG_TERM_TYPE_INPUT = 0,
FRAG_TERM_TYPE_OUTPUT_START, // Mapping to data out terminal in order for all postgdc pgs.
FRAG_TERM_TYPE_DISPALY_OUTPUT = FRAG_TERM_TYPE_OUTPUT_START,
FRAG_TERM_TYPE_MAIN_OUTPUT,
FRAG_TERM_TYPE_PP_OUTPUT,
FRAG_TERM_TYPE_COUNT,
};
int mPgId;
int mTerminalCount;
PgFrameDesc mInputMainFrame;
PgFrameDesc mOutputMainFrame;
uint8_t mFragmentCount;
ia_p2p_fragment_desc* mFragmentDesc;
ia_p2p_fragment_configuration_t* mFragmentConfig;
// for pg fragment with new api:
// ia_p2p_calculate_fragments_rbm
// Instead of mFragmentDesc
ia_p2p_handle mP2pHandle;
ia_binary_data mP2pCacheBuffer;
ia_css_program_group_manifest_t* mPgManifest;
std::vector<int> mDisableDataTermials;
ia_css_process_group_t* mProcessGroup;
int mProgramControlInitTerminalIndex;
struct IpuPgTerminalKernelInfo {
IpuPgTerminalKernelInfo() {}
uint8_t id = 0;
uint8_t sections = 0;
uint32_t size = 0;
bool initialize = false;
};
struct IpuPgTerminaRequirements {
IpuPgTerminaRequirements() { kernelBitmap = ia_css_kernel_bitmap_clear(); }
ia_css_terminal_type_t type = IA_CSS_N_TERMINAL_TYPES;
uint32_t payloadSize = 0;
ia_css_kernel_bitmap_t kernelBitmap;
uint32_t sectionCount = 0;
IpuPgTerminalKernelInfo* kernelOrder = nullptr;
ia_p2p_fragment_desc* fragment_descs = nullptr;
// Use for program_control_init
uint32_t userParamSize;
std::unique_ptr<uint8_t[]> userParamAddress;
};
struct IpuPgRequirements {
IpuPgRequirements() { CLEAR(terminals); }
uint32_t terminalCount = 0;
IpuPgTerminaRequirements terminals[IPU_MAX_TERMINAL_COUNT];
};
struct KernelRequirement {
KernelRequirement() { mKernelBitmap = ia_css_kernel_bitmap_clear(); }
ia_p2p_terminal_requirements_t mSections[PSYS_MAX_KERNELS_PER_PG];
ia_p2p_payload_desc mPayloads[PSYS_MAX_KERNELS_PER_PG];
int mPayloadSize = 0;
ia_css_kernel_bitmap_t mKernelBitmap;
};
KernelRequirement mKernel;
IpuPgRequirements mPgReqs;
// Allocate them here, for sandboxing case (shared memory)
std::vector<ia_binary_data> mAllocatedPayloads;
void* mProcessGroupMemory;
private:
int getKernelIdByBitmap(ia_css_kernel_bitmap_t bitmap);
ia_css_kernel_bitmap_t getCachedTerminalKernelBitmap(
ia_css_param_terminal_manifest_t* manifest);
ia_css_kernel_bitmap_t getProgramTerminalKernelBitmap(
ia_css_program_terminal_manifest_t* manifest);
int disableZeroSizedTerminals(ia_css_kernel_bitmap_t* kernelBitmap);
css_err_t getKernelOrderForProgramTerm(ia_css_program_terminal_manifest_t* terminalManifest,
IpuPgTerminalKernelInfo* kernelOrder);
css_err_t getKernelOrderForParamCachedInTerm(ia_css_param_terminal_manifest_t* terminalManifest,
IpuPgTerminalKernelInfo* kernelOrder);
int8_t terminalEnumerateByType(IpuPgRequirements* reqs, ia_css_terminal_type_t terminalType,
uint8_t num);
int8_t terminalEnumerateByBitmap(IpuPgRequirements* reqs, ia_css_terminal_type_t terminal_type,
ia_css_kernel_bitmap_t bitmap);
bool isKernelIdInKernelOrder(IpuPgRequirements* reqs, int8_t termIndex, int kernelId,
uint8_t* orderedIndex);
uint32_t getKernelCountFromKernelOrder(IpuPgRequirements* reqs, int8_t termIndex, int kernelId);
void processTerminalKernelRequirements(IpuPgRequirements* reqs, int8_t termIndex,
ia_css_terminal_type_t terminalType, int kernelId);
css_err_t payloadSectionSizeSanityTest(ia_p2p_payload_desc* current, uint16_t kernelId,
uint8_t terminalIndex, uint32_t currentOffset,
size_t payloadSize);
int calcFragmentDescriptors(int fragmentCount, const PgFrameDesc& inputMainFrame,
const PgFrameDesc& outputMainFrame, const ia_css_rbm_t* rbm);
void dumpFragmentDesc(int fragmentCount);
int encodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload);
int decodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload);
int serializeDecodeCache(ia_binary_data* result);
void destroyPayloads();
void destroyPGBuffer();
DISALLOW_COPY_AND_ASSIGN(IntelPGParam);
};
} // namespace icamera