mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-29 09:03:14 +08:00
Defer direct submission control until first submit
Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
0cde8eb7ff
commit
4ea452040d
@@ -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()});
|
||||
|
||||
@@ -235,6 +235,8 @@ class CommandStreamReceiver {
|
||||
|
||||
uint32_t getRootDeviceIndex() { return rootDeviceIndex; }
|
||||
|
||||
void startControllingDirectSubmissions();
|
||||
|
||||
virtual bool initDirectSubmission(Device &device, OsContext &osContext) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user