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;