diff --git a/opencl/source/sharings/va/va_sharing_functions.h b/opencl/source/sharings/va/va_sharing_functions.h index 234c321659..4e8e93181c 100644 --- a/opencl/source/sharings/va/va_sharing_functions.h +++ b/opencl/source/sharings/va/va_sharing_functions.h @@ -10,6 +10,7 @@ #include "opencl/source/sharings/va/va_sharing_defines.h" #include +#include #include namespace NEO { @@ -82,6 +83,8 @@ class VASharingFunctions : public SharingFunctions { static bool isVaLibraryAvailable(); + std::mutex mutex; + protected: void *libHandle = nullptr; VADisplay vaDisplay = nullptr; diff --git a/opencl/source/sharings/va/va_surface.cpp b/opencl/source/sharings/va/va_surface.cpp index d5bfc3b917..b25c3c9450 100644 --- a/opencl/source/sharings/va/va_surface.cpp +++ b/opencl/source/sharings/va/va_surface.cpp @@ -41,6 +41,8 @@ Image *VASurface::createSharedVaSurface(Context *context, VASharingFunctions *sh size_t imageOffset = 0; size_t imagePitch = 0; + std::unique_lock lock(sharingFunctions->mutex); + vaStatus = sharingFunctions->exportSurfaceHandle(*surface, VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2, VA_EXPORT_SURFACE_READ_WRITE | VA_EXPORT_SURFACE_SEPARATE_LAYERS, @@ -118,6 +120,8 @@ Image *VASurface::createSharedVaSurface(Context *context, VASharingFunctions *sh memoryManager->closeSharedHandle(sharedHandle); + lock.unlock(); + imgDesc.image_row_pitch = imgInfo.rowPitch; imgDesc.image_slice_pitch = 0u; imgInfo.slicePitch = 0u; diff --git a/opencl/test/unit_test/sharings/va/mock_va_sharing.h b/opencl/test/unit_test/sharings/va/mock_va_sharing.h index 17e19d24fc..faeb52aa6b 100644 --- a/opencl/test/unit_test/sharings/va/mock_va_sharing.h +++ b/opencl/test/unit_test/sharings/va/mock_va_sharing.h @@ -17,6 +17,7 @@ namespace NEO { class VASharingFunctionsMock : public VASharingFunctions { public: + using VASharingFunctions::mutex; using VASharingFunctions::supported2PlaneFormats; using VASharingFunctions::supported3PlaneFormats; diff --git a/opencl/test/unit_test/sharings/va/va_sharing_tests.cpp b/opencl/test/unit_test/sharings/va/va_sharing_tests.cpp index 98a3623010..5cdd991d60 100644 --- a/opencl/test/unit_test/sharings/va/va_sharing_tests.cpp +++ b/opencl/test/unit_test/sharings/va/va_sharing_tests.cpp @@ -215,7 +215,7 @@ TEST_F(VaSharingTests, givenMockVaWithExportSurfaceHandlerWhenVaSurfaceIsCreated auto vaHandler = static_cast(handler); EXPECT_EQ(vaHandler->peekFunctionsHandler(), &vaSharing->sharingFunctions); - auto sharingFunctions = vaSharing->sharingFunctions; + auto &sharingFunctions = vaSharing->sharingFunctions; EXPECT_FALSE(sharingFunctions.deriveImageCalled); EXPECT_FALSE(sharingFunctions.destroyImageCalled); @@ -731,7 +731,7 @@ TEST_F(VaSharingTests, givenMockVaWithExportSurfaceHandlerAndRGBPWhenVaSurfaceIs auto vaHandler = static_cast(handler); EXPECT_EQ(vaHandler->peekFunctionsHandler(), &vaSharing->sharingFunctions); - auto sharingFunctions = vaSharing->sharingFunctions; + auto &sharingFunctions = vaSharing->sharingFunctions; EXPECT_FALSE(sharingFunctions.deriveImageCalled); EXPECT_FALSE(sharingFunctions.destroyImageCalled);