Defer direct submission control until first submit

Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
Lukasz Jobczyk
2021-10-29 11:54:52 +00:00
committed by Compute-Runtime-Automation
parent 0cde8eb7ff
commit 4ea452040d
6 changed files with 47 additions and 0 deletions

View File

@@ -13,6 +13,7 @@
#include "shared/source/command_stream/preemption.h"
#include "shared/source/command_stream/scratch_space_controller.h"
#include "shared/source/device/device.h"
#include "shared/source/direct_submission/direct_submission_controller.h"
#include "shared/source/execution_environment/root_device_environment.h"
#include "shared/source/gmm_helper/page_table_mngr.h"
#include "shared/source/helpers/array_count.h"
@@ -385,6 +386,13 @@ AubSubCaptureStatus CommandStreamReceiver::checkAndActivateAubSubCapture(const s
void CommandStreamReceiver::addAubComment(const char *comment) {}
void CommandStreamReceiver::startControllingDirectSubmissions() {
auto controller = this->executionEnvironment.directSubmissionController.get();
if (controller) {
controller->startControlling();
}
}
GraphicsAllocation *CommandStreamReceiver::allocateDebugSurface(size_t size) {
UNRECOVERABLE_IF(debugSurface != nullptr);
debugSurface = getMemoryManager()->allocateGraphicsMemoryWithProperties({rootDeviceIndex, size, GraphicsAllocation::AllocationType::INTERNAL_HOST_MEMORY, getOsContext().getDeviceBitfield()});

View File

@@ -235,6 +235,8 @@ class CommandStreamReceiver {
uint32_t getRootDeviceIndex() { return rootDeviceIndex; }
void startControllingDirectSubmissions();
virtual bool initDirectSubmission(Device &device, OsContext &osContext) {
return true;
}

View File

@@ -42,9 +42,19 @@ void DirectSubmissionController::unregisterDirectSubmission(CommandStreamReceive
directSubmissions.erase(csr);
}
void DirectSubmissionController::startControlling() {
this->runControlling.store(true);
}
void *DirectSubmissionController::controlDirectSubmissionsState(void *self) {
auto controller = reinterpret_cast<DirectSubmissionController *>(self);
while (!controller->runControlling.load()) {
if (!controller->keepControlling.load()) {
return nullptr;
}
}
while (true) {
auto start = std::chrono::steady_clock::now();

View File

@@ -25,6 +25,8 @@ class DirectSubmissionController {
void registerDirectSubmission(CommandStreamReceiver *csr);
void unregisterDirectSubmission(CommandStreamReceiver *csr);
void startControlling();
static bool isSupported();
protected:
@@ -41,6 +43,7 @@ class DirectSubmissionController {
std::unique_ptr<Thread> directSubmissionControllingThread;
std::atomic_bool keepControlling = true;
std::atomic_bool runControlling = false;
int timeout = 5;
};

View File

@@ -109,9 +109,11 @@ bool DrmCommandStreamReceiver<GfxFamily>::flush(BatchBuffer &batchBuffer, Reside
}
if (this->directSubmission.get()) {
this->startControllingDirectSubmissions();
return this->directSubmission->dispatchCommandBuffer(batchBuffer, *this->flushStamp.get());
}
if (this->blitterDirectSubmission.get()) {
this->startControllingDirectSubmissions();
return this->blitterDirectSubmission->dispatchCommandBuffer(batchBuffer, *this->flushStamp.get());
}

View File

@@ -87,6 +87,8 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenTimeout
csr.taskCount.store(9u);
DirectSubmissionControllerMock controller;
executionEnvironment.directSubmissionController.reset(&controller);
csr.startControllingDirectSubmissions();
controller.registerDirectSubmission(&csr);
while (!controller.directSubmissions[&csr].isStopped) {
@@ -97,6 +99,26 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenTimeout
EXPECT_EQ(controller.directSubmissions[&csr].taskCount, 9u);
controller.unregisterDirectSubmission(&csr);
executionEnvironment.directSubmissionController.release();
}
TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWithStartedControllingWhenShuttingDownThenNoHang) {
DirectSubmissionControllerMock controller;
EXPECT_NE(controller.directSubmissionControllingThread.get(), nullptr);
controller.startControlling();
controller.keepControlling.store(false);
controller.directSubmissionControllingThread->join();
controller.directSubmissionControllingThread.reset();
}
TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWithNotStartedControllingWhenShuttingDownThenNoHang) {
DirectSubmissionControllerMock controller;
EXPECT_NE(controller.directSubmissionControllingThread.get(), nullptr);
controller.keepControlling.store(false);
controller.directSubmissionControllingThread->join();
controller.directSubmissionControllingThread.reset();
}
} // namespace NEO