Refactor direct submission: remove csr from members

create translation layer to obtain needed params

Related-To: NEO-6643
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2022-04-20 13:55:31 +00:00
committed by Compute-Runtime-Automation
parent 10be59cb15
commit 4cb46ee15c
12 changed files with 61 additions and 31 deletions

View File

@@ -1,5 +1,5 @@
#
# Copyright (C) 2020-2021 Intel Corporation
# Copyright (C) 2020-2022 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
@@ -10,6 +10,7 @@ set(NEO_CORE_DIRECT_SUBMISSION
${CMAKE_CURRENT_SOURCE_DIR}/direct_submission_prefetch_mitigation_base.inl
${CMAKE_CURRENT_SOURCE_DIR}/direct_submission_controller.cpp
${CMAKE_CURRENT_SOURCE_DIR}/direct_submission_controller.h
${CMAKE_CURRENT_SOURCE_DIR}/direct_submission_hw.cpp
${CMAKE_CURRENT_SOURCE_DIR}/direct_submission_hw.h
${CMAKE_CURRENT_SOURCE_DIR}/direct_submission_hw.inl
${CMAKE_CURRENT_SOURCE_DIR}/direct_submission_bdw_and_later.inl

View File

@@ -9,7 +9,7 @@
namespace NEO {
template <typename GfxFamily, typename Dispatcher>
inline std::unique_ptr<DirectSubmissionHw<GfxFamily, Dispatcher>> DirectSubmissionHw<GfxFamily, Dispatcher>::create(const CommandStreamReceiver &commandStreamReceiver) {
return std::make_unique<DrmDirectSubmission<GfxFamily, Dispatcher>>(commandStreamReceiver);
inline std::unique_ptr<DirectSubmissionHw<GfxFamily, Dispatcher>> DirectSubmissionHw<GfxFamily, Dispatcher>::create(const DirectSubmissionInputParams &inputParams) {
return std::make_unique<DrmDirectSubmission<GfxFamily, Dispatcher>>(inputParams);
}
} // namespace NEO

View File

@@ -10,11 +10,11 @@
namespace NEO {
template <typename GfxFamily, typename Dispatcher>
inline std::unique_ptr<DirectSubmissionHw<GfxFamily, Dispatcher>> DirectSubmissionHw<GfxFamily, Dispatcher>::create(const CommandStreamReceiver &commandStreamReceiver) {
if (commandStreamReceiver.peekRootDeviceEnvironment().osInterface->getDriverModel()->getDriverModelType() == DriverModelType::DRM) {
return std::make_unique<DrmDirectSubmission<GfxFamily, Dispatcher>>(commandStreamReceiver);
inline std::unique_ptr<DirectSubmissionHw<GfxFamily, Dispatcher>> DirectSubmissionHw<GfxFamily, Dispatcher>::create(const DirectSubmissionInputParams &inputParams) {
if (inputParams.rootDeviceEnvironment.osInterface->getDriverModel()->getDriverModelType() == DriverModelType::DRM) {
return std::make_unique<DrmDirectSubmission<GfxFamily, Dispatcher>>(inputParams);
} else {
return std::make_unique<WddmDirectSubmission<GfxFamily, Dispatcher>>(commandStreamReceiver);
return std::make_unique<WddmDirectSubmission<GfxFamily, Dispatcher>>(inputParams);
}
}
} // namespace NEO

View File

@@ -9,7 +9,7 @@
namespace NEO {
template <typename GfxFamily, typename Dispatcher>
inline std::unique_ptr<DirectSubmissionHw<GfxFamily, Dispatcher>> DirectSubmissionHw<GfxFamily, Dispatcher>::create(const CommandStreamReceiver &commandStreamReceiver) {
return std::make_unique<WddmDirectSubmission<GfxFamily, Dispatcher>>(commandStreamReceiver);
inline std::unique_ptr<DirectSubmissionHw<GfxFamily, Dispatcher>> DirectSubmissionHw<GfxFamily, Dispatcher>::create(const DirectSubmissionInputParams &inputParams) {
return std::make_unique<WddmDirectSubmission<GfxFamily, Dispatcher>>(inputParams);
}
} // namespace NEO

View File

@@ -0,0 +1,19 @@
/*
* Copyright (C) 2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/direct_submission/direct_submission_hw.h"
#include "shared/source/command_stream/command_stream_receiver.h"
namespace NEO {
DirectSubmissionInputParams::DirectSubmissionInputParams(const CommandStreamReceiver &commandStreamReceiver) : osContext(commandStreamReceiver.getOsContext()), rootDeviceEnvironment(commandStreamReceiver.peekRootDeviceEnvironment()), rootDeviceIndex(commandStreamReceiver.getRootDeviceIndex()) {
memoryManager = commandStreamReceiver.getMemoryManager();
globalFenceAllocation = commandStreamReceiver.getGlobalFenceAllocation();
workPartitionAllocation = commandStreamReceiver.getWorkPartitionAllocation();
}
} // namespace NEO

View File

@@ -55,11 +55,22 @@ class FlushStampTracker;
class GraphicsAllocation;
struct HardwareInfo;
class OsContext;
class MemoryOperationsHandler;
struct DirectSubmissionInputParams : NonCopyableClass {
DirectSubmissionInputParams(const CommandStreamReceiver &commandStreamReceiver);
OsContext &osContext;
const RootDeviceEnvironment &rootDeviceEnvironment;
MemoryManager *memoryManager = nullptr;
const GraphicsAllocation *globalFenceAllocation = nullptr;
GraphicsAllocation *workPartitionAllocation = nullptr;
const uint32_t rootDeviceIndex;
};
template <typename GfxFamily, typename Dispatcher>
class DirectSubmissionHw {
public:
DirectSubmissionHw(const CommandStreamReceiver &commandStreamReceiver);
DirectSubmissionHw(const DirectSubmissionInputParams &inputParams);
virtual ~DirectSubmissionHw();
@@ -71,7 +82,7 @@ class DirectSubmissionHw {
MOCKABLE_VIRTUAL bool dispatchCommandBuffer(BatchBuffer &batchBuffer, FlushStampTracker &flushStamp);
static std::unique_ptr<DirectSubmissionHw<GfxFamily, Dispatcher>> create(const CommandStreamReceiver &commandStreamReceiver);
static std::unique_ptr<DirectSubmissionHw<GfxFamily, Dispatcher>> create(const DirectSubmissionInputParams &inputParams);
protected:
static constexpr size_t prefetchSize = 8 * MemoryConstants::cacheLineSize;
@@ -143,8 +154,10 @@ class DirectSubmissionHw {
uint64_t semaphoreGpuVa = 0u;
uint64_t gpuVaForMiFlush = 0u;
const CommandStreamReceiver &commandStreamReceiver;
OsContext &osContext;
const uint32_t rootDeviceIndex;
MemoryManager *memoryManager = nullptr;
MemoryOperationsHandler *memoryOperationHandler = nullptr;
const HardwareInfo *hwInfo = nullptr;
const GraphicsAllocation *globalFenceAllocation = nullptr;
GraphicsAllocation *ringBuffer = nullptr;

View File

@@ -30,9 +30,12 @@
namespace NEO {
template <typename GfxFamily, typename Dispatcher>
DirectSubmissionHw<GfxFamily, Dispatcher>::DirectSubmissionHw(const CommandStreamReceiver &commandStreamReceiver)
: commandStreamReceiver(commandStreamReceiver), osContext(commandStreamReceiver.getOsContext()), globalFenceAllocation(commandStreamReceiver.getGlobalFenceAllocation()) {
hwInfo = &commandStreamReceiver.peekHwInfo();
DirectSubmissionHw<GfxFamily, Dispatcher>::DirectSubmissionHw(const DirectSubmissionInputParams &inputParams)
: osContext(inputParams.osContext), rootDeviceIndex(inputParams.rootDeviceIndex) {
memoryManager = inputParams.memoryManager;
globalFenceAllocation = inputParams.globalFenceAllocation;
hwInfo = inputParams.rootDeviceEnvironment.getHardwareInfo();
memoryOperationHandler = inputParams.rootDeviceEnvironment.memoryOperationsInterface.get();
auto hwInfoConfig = HwInfoConfig::get(hwInfo->platform.eProductFamily);
@@ -70,11 +73,10 @@ bool DirectSubmissionHw<GfxFamily, Dispatcher>::allocateResources() {
DirectSubmissionAllocations allocations;
bool isMultiOsContextCapable = osContext.getNumSupportedDevices() > 1u;
MemoryManager *memoryManager = commandStreamReceiver.getMemoryManager();
constexpr size_t minimumRequiredSize = 256 * MemoryConstants::kiloByte;
constexpr size_t additionalAllocationSize = MemoryConstants::pageSize;
const auto allocationSize = alignUp(minimumRequiredSize + additionalAllocationSize, MemoryConstants::pageSize64k);
const AllocationProperties commandStreamAllocationProperties{commandStreamReceiver.getRootDeviceIndex(),
const AllocationProperties commandStreamAllocationProperties{rootDeviceIndex,
true, allocationSize,
AllocationType::RING_BUFFER,
isMultiOsContextCapable, false, osContext.getDeviceBitfield()};
@@ -86,7 +88,7 @@ bool DirectSubmissionHw<GfxFamily, Dispatcher>::allocateResources() {
UNRECOVERABLE_IF(ringBuffer2 == nullptr);
allocations.push_back(ringBuffer2);
const AllocationProperties semaphoreAllocationProperties{commandStreamReceiver.getRootDeviceIndex(),
const AllocationProperties semaphoreAllocationProperties{rootDeviceIndex,
true, MemoryConstants::pageSize,
AllocationType::SEMAPHORE_BUFFER,
isMultiOsContextCapable, false, osContext.getDeviceBitfield()};
@@ -138,9 +140,7 @@ bool DirectSubmissionHw<GfxFamily, Dispatcher>::allocateResources() {
template <typename GfxFamily, typename Dispatcher>
bool DirectSubmissionHw<GfxFamily, Dispatcher>::makeResourcesResident(DirectSubmissionAllocations &allocations) {
auto memoryInterface = commandStreamReceiver.peekRootDeviceEnvironment().memoryOperationsInterface.get();
auto ret = memoryInterface->makeResidentWithinOsContext(&this->osContext, ArrayRef<GraphicsAllocation *>(allocations), false) == MemoryOperationsStatus::SUCCESS;
auto ret = memoryOperationHandler->makeResidentWithinOsContext(&this->osContext, ArrayRef<GraphicsAllocation *>(allocations), false) == MemoryOperationsStatus::SUCCESS;
return ret;
}
@@ -532,8 +532,6 @@ inline GraphicsAllocation *DirectSubmissionHw<GfxFamily, Dispatcher>::switchRing
template <typename GfxFamily, typename Dispatcher>
void DirectSubmissionHw<GfxFamily, Dispatcher>::deallocateResources() {
MemoryManager *memoryManager = commandStreamReceiver.getMemoryManager();
if (ringBuffer) {
memoryManager->freeGraphicsMemory(ringBuffer);
ringBuffer = nullptr;

View File

@@ -16,7 +16,7 @@ class DrmDirectSubmission : public DirectSubmissionHw<GfxFamily, Dispatcher> {
using DirectSubmissionHw<GfxFamily, Dispatcher>::ringCommandStream;
using DirectSubmissionHw<GfxFamily, Dispatcher>::switchRingBuffersAllocations;
DrmDirectSubmission(const CommandStreamReceiver &commandStreamReceiver);
DrmDirectSubmission(const DirectSubmissionInputParams &inputParams);
~DrmDirectSubmission();

View File

@@ -20,8 +20,8 @@
namespace NEO {
template <typename GfxFamily, typename Dispatcher>
DrmDirectSubmission<GfxFamily, Dispatcher>::DrmDirectSubmission(const CommandStreamReceiver &commandStreamReceiver)
: DirectSubmissionHw<GfxFamily, Dispatcher>(commandStreamReceiver) {
DrmDirectSubmission<GfxFamily, Dispatcher>::DrmDirectSubmission(const DirectSubmissionInputParams &inputParams)
: DirectSubmissionHw<GfxFamily, Dispatcher>(inputParams) {
this->disableMonitorFence = true;
@@ -42,7 +42,7 @@ DrmDirectSubmission<GfxFamily, Dispatcher>::DrmDirectSubmission(const CommandStr
osContextLinux->getDrm().setDirectSubmissionActive(true);
if (this->partitionedMode) {
this->workPartitionAllocation = commandStreamReceiver.getWorkPartitionAllocation();
this->workPartitionAllocation = inputParams.workPartitionAllocation;
UNRECOVERABLE_IF(this->workPartitionAllocation == nullptr);
}
}

View File

@@ -19,7 +19,7 @@ class Wddm;
template <typename GfxFamily, typename Dispatcher>
class WddmDirectSubmission : public DirectSubmissionHw<GfxFamily, Dispatcher> {
public:
WddmDirectSubmission(const CommandStreamReceiver &commandStreamReceiver);
WddmDirectSubmission(const DirectSubmissionInputParams &inputParams);
~WddmDirectSubmission();

View File

@@ -23,8 +23,8 @@ namespace NEO {
DECLARE_COMMAND_BUFFER(CommandBufferHeader, UMD_OCL, FALSE, FALSE, PERFTAG_OCL);
template <typename GfxFamily, typename Dispatcher>
WddmDirectSubmission<GfxFamily, Dispatcher>::WddmDirectSubmission(const CommandStreamReceiver &commandStreamReceiver)
: DirectSubmissionHw<GfxFamily, Dispatcher>(commandStreamReceiver) {
WddmDirectSubmission<GfxFamily, Dispatcher>::WddmDirectSubmission(const DirectSubmissionInputParams &inputParams)
: DirectSubmissionHw<GfxFamily, Dispatcher>(inputParams) {
osContextWin = reinterpret_cast<OsContextWin *>(&this->osContext);
wddm = osContextWin->getWddm();
commandBufferHeader = std::make_unique<COMMAND_BUFFER_HEADER_REC>();

View File

@@ -17,7 +17,6 @@ struct MockDirectSubmissionHw : public DirectSubmissionHw<GfxFamily, Dispatcher>
using BaseClass = DirectSubmissionHw<GfxFamily, Dispatcher>;
using BaseClass::activeTiles;
using BaseClass::allocateResources;
using BaseClass::commandStreamReceiver;
using BaseClass::completionRingBuffers;
using BaseClass::cpuCachelineFlush;
using BaseClass::currentQueueWorkCount;