From 76501a29218d57a311b583bed2fa240d157f5326 Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Wed, 30 Sep 2020 08:29:12 +0200 Subject: [PATCH] Adjust early BO pin to new residency model Resolves: NEO-5112 Change-Id: Ia65b1d75f957669999f7de423716a1e3cffc4032 Signed-off-by: Lukasz Jobczyk --- .../os_interface/linux/drm_buffer_object.cpp | 16 ++++++++++++++-- shared/source/os_interface/linux/drm_neo.h | 8 ++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/shared/source/os_interface/linux/drm_buffer_object.cpp b/shared/source/os_interface/linux/drm_buffer_object.cpp index 309aea9a5c..dd5a5dcfd1 100644 --- a/shared/source/os_interface/linux/drm_buffer_object.cpp +++ b/shared/source/os_interface/linux/drm_buffer_object.cpp @@ -196,8 +196,20 @@ void BufferObject::printExecutionBuffer(drm_i915_gem_execbuffer2 &execbuf, const } int BufferObject::pin(BufferObject *const boToPin[], size_t numberOfBos, OsContext *osContext, uint32_t vmHandleId, uint32_t drmContextId) { - StackVec execObject(numberOfBos + 1); - return this->exec(4u, 0u, 0u, false, osContext, vmHandleId, drmContextId, boToPin, numberOfBos, &execObject[0]); + auto retVal = 0; + if (this->drm->isBindAvailable()) { + for (auto drmIterator = 0u; drmIterator < osContext->getDeviceBitfield().size(); drmIterator++) { + if (osContext->getDeviceBitfield().test(drmIterator)) { + for (size_t i = 0; i < numberOfBos; i++) { + boToPin[i]->bind(osContext, drmIterator); + } + } + } + } else { + StackVec execObject(numberOfBos + 1); + retVal = this->exec(4u, 0u, 0u, false, osContext, vmHandleId, drmContextId, boToPin, numberOfBos, &execObject[0]); + } + return retVal; } void BufferObject::addBindExtHandle(uint32_t handle) { diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index 328c269710..4ba8bfbec6 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -143,6 +143,13 @@ class Drm { static Drm *create(std::unique_ptr hwDeviceId, RootDeviceEnvironment &rootDeviceEnvironment); static void overrideBindSupport(bool &useVmBind); + bool isBindAvailable() { + return this->bindAvailable; + } + void setBindAvailable() { + this->bindAvailable = true; + } + protected: int getQueueSliceCount(drm_i915_gem_context_param_sseu *sseu); std::string generateUUID(); @@ -151,6 +158,7 @@ class Drm { bool preemptionSupported = false; bool nonPersistentContextsSupported = false; bool requirePerContextVM = false; + bool bindAvailable = false; std::unique_ptr hwDeviceId; int deviceId = 0; int revisionId = 0;