1 /*
2  * Copyright (C) 2018-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #pragma once
9 #include "shared/source/memory_manager/graphics_allocation.h"
10 
11 namespace NEO {
12 class Context;
13 class MemObj;
14 
15 enum SynchronizeStatus {
16     SHARED_OBJECT_NOT_CHANGED,
17     SHARED_OBJECT_REQUIRES_UPDATE,
18     ACQUIRE_SUCCESFUL,
19     SYNCHRONIZE_ERROR
20 };
21 
22 struct UpdateData {
UpdateDataUpdateData23     UpdateData(uint32_t inRootDeviceIndex) : rootDeviceIndex(inRootDeviceIndex){};
24     const uint32_t rootDeviceIndex;
25     SynchronizeStatus synchronizationStatus = SHARED_OBJECT_NOT_CHANGED;
26     osHandle sharedHandle = 0;
27     MemObj *memObject = nullptr;
28     void *updateData = nullptr;
29 };
30 
31 class SharingFunctions {
32   public:
33     virtual uint32_t getId() const = 0;
34 
35     virtual ~SharingFunctions() = default;
36 };
37 
38 class SharingHandler {
39   public:
40     int acquire(MemObj *memObj, uint32_t rootDeviceIndex);
41     void release(MemObj *memObject, uint32_t rootDeviceIndex);
42     virtual ~SharingHandler() = default;
43 
getMemObjectInfo(size_t & paramValueSize,void * & paramValue)44     virtual void getMemObjectInfo(size_t &paramValueSize, void *&paramValue){};
releaseReusedGraphicsAllocation()45     virtual void releaseReusedGraphicsAllocation(){};
46 
47   protected:
48     virtual int synchronizeHandler(UpdateData &updateData);
49     virtual int validateUpdateData(UpdateData &updateData);
synchronizeObject(UpdateData & updateData)50     virtual void synchronizeObject(UpdateData &updateData) { updateData.synchronizationStatus = SYNCHRONIZE_ERROR; }
51     virtual void resolveGraphicsAllocationChange(osHandle currentSharedHandle, UpdateData *updateData);
releaseResource(MemObj * memObject,uint32_t rootDeviceIndex)52     virtual void releaseResource(MemObj *memObject, uint32_t rootDeviceIndex){};
53     unsigned int acquireCount = 0u;
54 };
55 } // namespace NEO
56