From 107db3a3725e2609c4a694d7c20553c41e4d3930 Mon Sep 17 00:00:00 2001 From: Szymon Morek Date: Thu, 24 Feb 2022 15:25:03 +0000 Subject: [PATCH] Add surfaceId variable to VASurface Related-To: NEO-6693 Currently if clCreateFromVA and clEnqueueAcquireVA are called from different scopes (i.e. surfaceID passed to clCreate is destroyed when called clEnqueueAcquired) enqueue results in undefined behaviour. This PR fixes that. Signed-off-by: Szymon Morek --- opencl/source/sharings/va/va_surface.cpp | 6 +++--- opencl/source/sharings/va/va_surface.h | 9 ++++++--- opencl/test/unit_test/sharings/va/mock_va_sharing.h | 3 ++- opencl/test/unit_test/sharings/va/va_sharing_tests.cpp | 8 ++++++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/opencl/source/sharings/va/va_surface.cpp b/opencl/source/sharings/va/va_surface.cpp index 3c034acf5e..edc97fef49 100644 --- a/opencl/source/sharings/va/va_surface.cpp +++ b/opencl/source/sharings/va/va_surface.cpp @@ -156,15 +156,15 @@ Image *VASurface::createSharedVaSurface(Context *context, VASharingFunctions *sh void VASurface::synchronizeObject(UpdateData &updateData) { updateData.synchronizationStatus = SynchronizeStatus::ACQUIRE_SUCCESFUL; if (!interopUserSync) { - if (sharingFunctions->syncSurface(*surfaceId) != VA_STATUS_SUCCESS) { + if (sharingFunctions->syncSurface(surfaceId) != VA_STATUS_SUCCESS) { updateData.synchronizationStatus = SYNCHRONIZE_ERROR; } } } void VASurface::getMemObjectInfo(size_t ¶mValueSize, void *¶mValue) { - paramValueSize = sizeof(surfaceId); - paramValue = &surfaceId; + paramValueSize = sizeof(surfaceIdPtr); + paramValue = &surfaceIdPtr; } bool VASurface::validate(cl_mem_flags flags, cl_uint plane) { diff --git a/opencl/source/sharings/va/va_surface.h b/opencl/source/sharings/va/va_surface.h index dc3415a08a..80757712d8 100644 --- a/opencl/source/sharings/va/va_surface.h +++ b/opencl/source/sharings/va/va_surface.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2021 Intel Corporation + * Copyright (C) 2018-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -31,10 +31,13 @@ class VASurface : VASharing { protected: VASurface(VASharingFunctions *sharingFunctions, VAImageID imageId, cl_uint plane, VASurfaceID *surfaceId, bool interopUserSync) - : VASharing(sharingFunctions, imageId), plane(plane), surfaceId(surfaceId), interopUserSync(interopUserSync){}; + : VASharing(sharingFunctions, imageId), plane(plane), surfaceId(*surfaceId), interopUserSync(interopUserSync) { + surfaceIdPtr = &this->surfaceId; + }; cl_uint plane; - VASurfaceID *surfaceId; + VASurfaceID surfaceId; + VASurfaceID *surfaceIdPtr; bool interopUserSync; }; } // namespace NEO 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 8be82947c1..820543d5ab 100644 --- a/opencl/test/unit_test/sharings/va/mock_va_sharing.h +++ b/opencl/test/unit_test/sharings/va/mock_va_sharing.h @@ -35,7 +35,7 @@ class VASharingFunctionsMock : public VASharingFunctions { bool syncSurfaceCalled = false; bool extGetSurfaceHandleCalled = false; bool exportSurfaceHandleCalled = false; - + VASurfaceID syncedSurfaceID = 0; osHandle acquiredVaHandle = 0; bool haveExportSurfaceHandle = false; @@ -110,6 +110,7 @@ class VASharingFunctionsMock : public VASharingFunctions { VAStatus syncSurface(VASurfaceID vaSurface) override { syncSurfaceCalled = true; + syncedSurfaceID = vaSurface; return syncSurfaceReturnStatus; } 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 84eda9037a..f07c668a6b 100644 --- a/opencl/test/unit_test/sharings/va/va_sharing_tests.cpp +++ b/opencl/test/unit_test/sharings/va/va_sharing_tests.cpp @@ -438,16 +438,18 @@ TEST_F(VaSharingTests, givenHwCommandQueueWhenAcquireAndReleaseCallsAreMadeWithE } TEST_F(VaSharingTests, givenVaMediaSurfaceWhenGetMemObjectInfoIsCalledThenSurfaceIdIsReturned) { + vaSurfaceId = 1u; createMediaSurface(); VASurfaceID *retVaSurfaceId = nullptr; size_t retSize = 0; + vaSurfaceId = 0; errCode = clGetMemObjectInfo(sharedClMem, CL_MEM_VA_API_MEDIA_SURFACE_INTEL, sizeof(VASurfaceID *), &retVaSurfaceId, &retSize); EXPECT_EQ(CL_SUCCESS, errCode); EXPECT_EQ(sizeof(VASurfaceID *), retSize); - EXPECT_EQ(vaSurfaceId, *retVaSurfaceId); + EXPECT_EQ(1u, *retVaSurfaceId); } TEST_F(VaSharingTests, givenVaMediaSurfaceWhenGetImageInfoIsCalledThenPlaneIsReturned) { @@ -507,8 +509,9 @@ TEST_F(VaSharingTests, givenSimpleParamsWhenCreateSurfaceIsCalledThenSetImgObjec TEST_F(VaSharingTests, givenNonInteropUserSyncContextWhenAcquireIsCalledThenSyncSurface) { context.setInteropUserSyncEnabled(false); - + vaSurfaceId = 1u; createMediaSurface(); + vaSurfaceId = 0u; auto memObj = castToObject(sharedClMem); @@ -516,6 +519,7 @@ TEST_F(VaSharingTests, givenNonInteropUserSyncContextWhenAcquireIsCalledThenSync auto ret = memObj->peekSharingHandler()->acquire(sharedImg, context.getDevice(0)->getRootDeviceIndex()); EXPECT_TRUE(vaSharing->sharingFunctions.syncSurfaceCalled); EXPECT_EQ(CL_SUCCESS, ret); + EXPECT_EQ(1u, vaSharing->sharingFunctions.syncedSurfaceID); } TEST_F(VaSharingTests, givenInteropUserSyncContextWhenAcquireIsCalledThenDontSyncSurface) {