fix: Move first submission programming to a separate function

Call the new function after debugger and sip kernel are initialized.

Related-To: HSD-18038645398, HSD-18038819112

Signed-off-by: Filip Hazubski <filip.hazubski@intel.com>
This commit is contained in:
Filip Hazubski
2024-06-24 22:55:08 +00:00
committed by Compute-Runtime-Automation
parent bbe11205e3
commit 230d3e903b
9 changed files with 76 additions and 46 deletions

View File

@@ -245,6 +245,10 @@ bool Device::createDeviceImpl() {
UNRECOVERABLE_IF(!ret);
}
if (!initializeEngines()) {
return false;
}
getDefaultEngine().osContext->setDefaultContext(true);
for (auto &engine : allEngines) {
@@ -303,15 +307,14 @@ bool Device::createDeviceImpl() {
bool Device::createEngines() {
if (engineInstanced) {
return createEngine(0, {engineInstancedType, EngineUsage::regular});
return createEngine({engineInstancedType, EngineUsage::regular});
}
auto &gfxCoreHelper = getGfxCoreHelper();
auto gpgpuEngines = gfxCoreHelper.getGpgpuEngineInstances(getRootDeviceEnvironment());
uint32_t deviceCsrIndex = 0;
for (auto &engine : gpgpuEngines) {
if (!createEngine(deviceCsrIndex++, engine)) {
if (!createEngine(engine)) {
return false;
}
}
@@ -401,7 +404,7 @@ std::unique_ptr<CommandStreamReceiver> Device::createCommandStreamReceiver() con
return std::unique_ptr<CommandStreamReceiver>(createCommandStream(*executionEnvironment, getRootDeviceIndex(), getDeviceBitfield()));
}
bool Device::createEngine(uint32_t deviceCsrIndex, EngineTypeUsage engineTypeUsage) {
bool Device::createEngine(EngineTypeUsage engineTypeUsage) {
const auto &hwInfo = getHardwareInfo();
auto &gfxCoreHelper = getGfxCoreHelper();
const auto engineType = engineTypeUsage.first;
@@ -439,6 +442,8 @@ bool Device::createEngine(uint32_t deviceCsrIndex, EngineTypeUsage engineTypeUsa
auto osContext = executionEnvironment->memoryManager->createAndRegisterOsContext(commandStreamReceiver.get(), engineDescriptor);
osContext->setContextGroup(useContextGroup);
osContext->setIsPrimaryEngine(isPrimaryEngine);
osContext->setIsDefaultEngine(isDefaultEngine);
commandStreamReceiver->setupContext(*osContext);
@@ -460,34 +465,6 @@ bool Device::createEngine(uint32_t deviceCsrIndex, EngineTypeUsage engineTypeUsa
return false;
}
bool firstSubmissionDone = false;
if (isDefaultEngine) {
bool defaultEngineAlreadySet = (allEngines.size() > defaultEngineIndex) && (allEngines[defaultEngineIndex].getEngineType() == engineType);
if (!defaultEngineAlreadySet) {
defaultEngineIndex = deviceCsrIndex;
if (osContext->isDebuggableContext() ||
this->isInitDeviceWithFirstSubmissionSupported(commandStreamReceiver->getType())) {
if (SubmissionStatus::success != commandStreamReceiver->initializeDeviceWithFirstSubmission(*this)) {
return false;
}
firstSubmissionDone = true;
}
}
}
auto &compilerProductHelper = this->getCompilerProductHelper();
auto heaplessEnabled = compilerProductHelper.isHeaplessModeEnabled();
bool isHeaplessStateInit = isPrimaryEngine && compilerProductHelper.isHeaplessStateInitEnabled(heaplessEnabled);
bool initializeDevice = (useContextGroup || isHeaplessStateInit) && !firstSubmissionDone;
if (initializeDevice) {
commandStreamReceiver->initializeResources(false);
commandStreamReceiver->initializeDeviceWithFirstSubmission(*this);
}
EngineControl engine{commandStreamReceiver.get(), osContext};
allEngines.push_back(engine);
if (engineUsage == EngineUsage::regular) {
@@ -499,6 +476,39 @@ bool Device::createEngine(uint32_t deviceCsrIndex, EngineTypeUsage engineTypeUsa
return true;
}
bool Device::initializeEngines() {
uint32_t deviceCsrIndex = 0;
bool defaultEngineAlreadySet = false;
for (auto &engine : allEngines) {
bool firstSubmissionDone = false;
if (engine.osContext->getIsDefaultEngine() && !defaultEngineAlreadySet) {
defaultEngineAlreadySet = true;
defaultEngineIndex = deviceCsrIndex;
if (engine.osContext->isDebuggableContext() ||
this->isInitDeviceWithFirstSubmissionSupported(engine.commandStreamReceiver->getType())) {
if (SubmissionStatus::success != engine.commandStreamReceiver->initializeDeviceWithFirstSubmission(*this)) {
return false;
}
firstSubmissionDone = true;
}
}
auto &compilerProductHelper = this->getCompilerProductHelper();
auto heaplessEnabled = compilerProductHelper.isHeaplessModeEnabled();
bool isHeaplessStateInit = engine.osContext->getIsPrimaryEngine() && compilerProductHelper.isHeaplessStateInitEnabled(heaplessEnabled);
bool initializeDevice = (engine.osContext->isPartOfContextGroup() || isHeaplessStateInit) && !firstSubmissionDone;
if (initializeDevice) {
engine.commandStreamReceiver->initializeResources(false);
engine.commandStreamReceiver->initializeDeviceWithFirstSubmission(*this);
}
deviceCsrIndex++;
}
return true;
}
bool Device::createSecondaryEngine(CommandStreamReceiver *primaryCsr, EngineTypeUsage engineTypeUsage) {
auto engineUsage = engineTypeUsage.second;
std::unique_ptr<CommandStreamReceiver> commandStreamReceiver = createCommandStreamReceiver();