Check if direct submission enable in OsContext

Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
Lukasz Jobczyk
2021-02-10 15:13:50 +00:00
committed by Compute-Runtime-Automation
parent 8a700c5187
commit 7c99739b89
17 changed files with 176 additions and 97 deletions

View File

@@ -106,10 +106,6 @@ class CommandStreamReceiverHw : public CommandStreamReceiver {
}
bool initDirectSubmission(Device &device, OsContext &osContext) override;
bool checkDirectSubmissionSupportsEngine(const DirectSubmissionProperties &directSubmissionProperty,
aub_stream::EngineType contextEngineType,
bool &startOnInit,
bool &startInContext);
GraphicsAllocation *getClearColorAllocation() override;
protected:

View File

@@ -1132,81 +1132,23 @@ template <typename GfxFamily>
inline bool CommandStreamReceiverHw<GfxFamily>::initDirectSubmission(Device &device, OsContext &osContext) {
bool ret = true;
if (DebugManager.flags.EnableDirectSubmission.get() == 1) {
auto contextEngineType = osContext.getEngineType();
const DirectSubmissionProperties &directSubmissionProperty =
device.getHardwareInfo().capabilityTable.directSubmissionEngines.data[contextEngineType];
bool submitOnInit = false;
auto startDirect = osContext.isDirectSubmissionAvailable(device.getHardwareInfo(), submitOnInit);
bool startDirect = true;
if (!osContext.isDefaultContext()) {
startDirect = directSubmissionProperty.useNonDefault;
}
if (osContext.isLowPriority()) {
startDirect = directSubmissionProperty.useLowPriority;
}
if (osContext.isInternalEngine()) {
startDirect = directSubmissionProperty.useInternal;
}
if (osContext.isRootDevice()) {
startDirect = directSubmissionProperty.useRootDevice;
}
bool submitOnInit = directSubmissionProperty.submitOnInit;
bool engineSupported = checkDirectSubmissionSupportsEngine(directSubmissionProperty,
contextEngineType,
submitOnInit,
startDirect);
if (engineSupported && startDirect) {
if (contextEngineType == aub_stream::ENGINE_BCS) {
blitterDirectSubmission = DirectSubmissionHw<GfxFamily, BlitterDispatcher<GfxFamily>>::create(device, osContext);
ret = blitterDirectSubmission->initialize(submitOnInit);
} else {
directSubmission = DirectSubmissionHw<GfxFamily, RenderDispatcher<GfxFamily>>::create(device, osContext);
ret = directSubmission->initialize(submitOnInit);
this->dispatchMode = DispatchMode::ImmediateDispatch;
}
osContext.setDirectSubmissionActive();
if (startDirect) {
if (osContext.getEngineType() == aub_stream::ENGINE_BCS) {
blitterDirectSubmission = DirectSubmissionHw<GfxFamily, BlitterDispatcher<GfxFamily>>::create(device, osContext);
ret = blitterDirectSubmission->initialize(submitOnInit);
} else {
directSubmission = DirectSubmissionHw<GfxFamily, RenderDispatcher<GfxFamily>>::create(device, osContext);
ret = directSubmission->initialize(submitOnInit);
this->dispatchMode = DispatchMode::ImmediateDispatch;
}
osContext.setDirectSubmissionActive();
}
return ret;
}
template <typename GfxFamily>
inline bool CommandStreamReceiverHw<GfxFamily>::checkDirectSubmissionSupportsEngine(const DirectSubmissionProperties &directSubmissionProperty,
aub_stream::EngineType contextEngineType,
bool &startOnInit,
bool &startInContext) {
bool supported = directSubmissionProperty.engineSupported;
startOnInit = directSubmissionProperty.submitOnInit;
if (contextEngineType == aub_stream::ENGINE_BCS) {
int32_t blitterOverrideKey = DebugManager.flags.DirectSubmissionOverrideBlitterSupport.get();
if (blitterOverrideKey != -1) {
supported = blitterOverrideKey == 0 ? false : true;
startOnInit = blitterOverrideKey == 1 ? true : false;
}
} else if (contextEngineType == aub_stream::ENGINE_RCS) {
int32_t renderOverrideKey = DebugManager.flags.DirectSubmissionOverrideRenderSupport.get();
if (renderOverrideKey != -1) {
supported = renderOverrideKey == 0 ? false : true;
startOnInit = renderOverrideKey == 1 ? true : false;
}
} else {
//assume else is CCS
int32_t computeOverrideKey = DebugManager.flags.DirectSubmissionOverrideComputeSupport.get();
if (computeOverrideKey != -1) {
supported = computeOverrideKey == 0 ? false : true;
startOnInit = computeOverrideKey == 1 ? true : false;
}
}
//enable start in context only when default support is overridden and enabled
if (supported && !directSubmissionProperty.engineSupported) {
startInContext = true;
}
return supported;
}
template <typename GfxFamily>
size_t CommandStreamReceiverHw<GfxFamily>::getCmdSizeForPerDssBackedBuffer(const HardwareInfo &hwInfo) {
return 0;

View File

@@ -1,5 +1,5 @@
#
# Copyright (C) 2018-2020 Intel Corporation
# Copyright (C) 2018-2021 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
@@ -16,6 +16,7 @@ set(NEO_CORE_OS_INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/hw_info_config.h
${CMAKE_CURRENT_SOURCE_DIR}/hw_info_config.inl
${CMAKE_CURRENT_SOURCE_DIR}/hw_info_config_bdw_plus.inl
${CMAKE_CURRENT_SOURCE_DIR}/os_context.cpp
${CMAKE_CURRENT_SOURCE_DIR}/os_context.h
${CMAKE_CURRENT_SOURCE_DIR}/os_environment.h
${CMAKE_CURRENT_SOURCE_DIR}/os_interface.h

View File

@@ -207,8 +207,11 @@ void Drm::setNonPersistentContext(uint32_t drmContextId) {
ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &contextParam);
}
uint32_t Drm::createDrmContext(uint32_t drmVmId) {
uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isDirectSubmission) {
drm_i915_gem_context_create_ext gcc = {};
this->appendDrmContextFlags(gcc, isDirectSubmission);
auto retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc);
UNRECOVERABLE_IF(retVal != 0);

View File

@@ -86,7 +86,8 @@ class Drm {
inline int getFileDescriptor() const { return hwDeviceId->getFileDescriptor(); }
int createDrmVirtualMemory(uint32_t &drmVmId);
void destroyDrmVirtualMemory(uint32_t drmVmId);
uint32_t createDrmContext(uint32_t drmVmId);
uint32_t createDrmContext(uint32_t drmVmId, bool isDirectSubmission);
void appendDrmContextFlags(drm_i915_gem_context_create_ext &gcc, bool isDirectSubmission);
void destroyDrmContext(uint32_t drmContextId);
int queryVmId(uint32_t drmContextId, uint32_t &vmId);
void setLowPriorityContextParam(uint32_t drmContextId);

View File

@@ -70,6 +70,9 @@ bool Drm::isVmBindAvailable() {
return this->bindAvailable;
}
void Drm::appendDrmContextFlags(drm_i915_gem_context_create_ext &gcc, bool isDirectSubmission) {
}
void Drm::setupCacheInfo(const HardwareInfo &hwInfo) {
this->cacheInfo.reset(new CacheInfoImpl());
}

View File

@@ -79,6 +79,9 @@ bool Drm::isVmBindAvailable() {
return this->bindAvailable;
}
void Drm::appendDrmContextFlags(drm_i915_gem_context_create_ext &gcc, bool isDirectSubmission) {
}
void Drm::setupCacheInfo(const HardwareInfo &hwInfo) {
this->cacheInfo.reset(new CacheInfoImpl());
}

View File

@@ -9,6 +9,7 @@
#include "shared/source/execution_environment/execution_environment.h"
#include "shared/source/execution_environment/root_device_environment.h"
#include "shared/source/helpers/hw_info.h"
#include "shared/source/os_interface/linux/drm_neo.h"
#include "shared/source/os_interface/linux/os_interface.h"
#include "shared/source/os_interface/os_context.h"
@@ -31,10 +32,20 @@ OsContextLinux::OsContextLinux(Drm &drm, uint32_t contextId, DeviceBitfield devi
bool lowPriority, bool internalEngine, bool rootDevice)
: OsContext(contextId, deviceBitfield, engineType, preemptionMode, lowPriority, internalEngine, rootDevice),
drm(drm) {
auto hwInfo = drm.getRootDeviceEnvironment().getHardwareInfo();
auto defaultEngineType = getChosenEngineType(*hwInfo);
if (engineType == defaultEngineType && !lowPriority && !internalEngine) {
this->setDefaultContext(true);
}
bool submitDirect = false;
this->isDirectSubmissionAvailable(*drm.getRootDeviceEnvironment().getHardwareInfo(), submitDirect);
for (auto deviceIndex = 0u; deviceIndex < deviceBitfield.size(); deviceIndex++) {
if (deviceBitfield.test(deviceIndex)) {
auto drmVmId = drm.getVirtualMemoryAddressSpace(deviceIndex);
auto drmContextId = drm.createDrmContext(drmVmId);
auto drmContextId = drm.createDrmContext(drmVmId, this->isDirectSubmissionActive());
if (drm.areNonPersistentContextsSupported()) {
drm.setNonPersistentContext(drmContextId);
}

View File

@@ -0,0 +1,81 @@
/*
* Copyright (C) 2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/os_interface/os_context.h"
#include "shared/source/debug_settings/debug_settings_manager.h"
#include "shared/source/direct_submission/direct_submission_properties.h"
#include "shared/source/helpers/hw_info.h"
namespace NEO {
bool OsContext::isDirectSubmissionAvailable(const HardwareInfo &hwInfo, bool &submitOnInit) {
if (DebugManager.flags.EnableDirectSubmission.get() == 1) {
auto contextEngineType = this->getEngineType();
const DirectSubmissionProperties &directSubmissionProperty =
hwInfo.capabilityTable.directSubmissionEngines.data[contextEngineType];
bool startDirect = true;
if (!this->isDefaultContext()) {
startDirect = directSubmissionProperty.useNonDefault;
}
if (this->isLowPriority()) {
startDirect = directSubmissionProperty.useLowPriority;
}
if (this->isInternalEngine()) {
startDirect = directSubmissionProperty.useInternal;
}
if (this->isRootDevice()) {
startDirect = directSubmissionProperty.useRootDevice;
}
submitOnInit = directSubmissionProperty.submitOnInit;
bool engineSupported = checkDirectSubmissionSupportsEngine(directSubmissionProperty,
contextEngineType,
submitOnInit,
startDirect);
if (engineSupported && startDirect) {
this->setDirectSubmissionActive();
}
return engineSupported && startDirect;
}
return false;
}
bool OsContext::checkDirectSubmissionSupportsEngine(const DirectSubmissionProperties &directSubmissionProperty, aub_stream::EngineType contextEngineType, bool &startOnInit, bool &startInContext) {
bool supported = directSubmissionProperty.engineSupported;
startOnInit = directSubmissionProperty.submitOnInit;
if (contextEngineType == aub_stream::ENGINE_BCS) {
int32_t blitterOverrideKey = DebugManager.flags.DirectSubmissionOverrideBlitterSupport.get();
if (blitterOverrideKey != -1) {
supported = blitterOverrideKey == 0 ? false : true;
startOnInit = blitterOverrideKey == 1 ? true : false;
}
} else if (contextEngineType == aub_stream::ENGINE_RCS) {
int32_t renderOverrideKey = DebugManager.flags.DirectSubmissionOverrideRenderSupport.get();
if (renderOverrideKey != -1) {
supported = renderOverrideKey == 0 ? false : true;
startOnInit = renderOverrideKey == 1 ? true : false;
}
} else {
//assume else is CCS
int32_t computeOverrideKey = DebugManager.flags.DirectSubmissionOverrideComputeSupport.get();
if (computeOverrideKey != -1) {
supported = computeOverrideKey == 0 ? false : true;
startOnInit = computeOverrideKey == 1 ? true : false;
}
}
//enable start in context only when default support is overridden and enabled
if (supported && !directSubmissionProperty.engineSupported) {
startInContext = true;
}
return supported;
}
} // namespace NEO

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2020 Intel Corporation
* Copyright (C) 2018-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -17,6 +17,9 @@
namespace NEO {
class OSInterface;
struct DirectSubmissionProperties;
struct HardwareInfo;
class OsContext : public ReferenceTrackedObject<OsContext> {
public:
OsContext() = delete;
@@ -38,6 +41,12 @@ class OsContext : public ReferenceTrackedObject<OsContext> {
bool isDirectSubmissionActive() { return directSubmissionActive; }
void setDirectSubmissionActive() { directSubmissionActive = true; }
bool isDirectSubmissionAvailable(const HardwareInfo &hwInfo, bool &submitOnInit);
bool checkDirectSubmissionSupportsEngine(const DirectSubmissionProperties &directSubmissionProperty,
aub_stream::EngineType contextEngineType,
bool &startOnInit,
bool &startInContext);
protected:
OsContext(uint32_t contextId, DeviceBitfield deviceBitfield, aub_stream::EngineType engineType, PreemptionMode preemptionMode,
bool lowPriority, bool internalEngine, bool rootDevice)