Skip to content

Commit ef3f222

Browse files
authored
Merge pull request #2620 from RossBrunton/ross/l0devirtual
Remove virtual methods from ur_mem_handle_t_
2 parents eb6ea20 + bdf99e9 commit ef3f222

File tree

2 files changed

+83
-50
lines changed

2 files changed

+83
-50
lines changed

source/adapters/level_zero/memory.cpp

+42-13
Original file line numberDiff line numberDiff line change
@@ -1747,11 +1747,12 @@ ur_result_t urMemRelease(
17471747
if (ZeResult && ZeResult != ZE_RESULT_ERROR_UNINITIALIZED)
17481748
return ze2urResult(ZeResult);
17491749
}
1750+
delete Image;
17501751
} else {
17511752
auto Buffer = reinterpret_cast<_ur_buffer *>(Mem);
17521753
Buffer->free();
1754+
delete Buffer;
17531755
}
1754-
delete Mem;
17551756

17561757
return UR_RESULT_SUCCESS;
17571758
}
@@ -2081,10 +2082,11 @@ static ur_result_t ZeDeviceMemAllocHelper(void **ResultPtr,
20812082
return UR_RESULT_SUCCESS;
20822083
}
20832084

2084-
ur_result_t _ur_buffer::getZeHandle(char *&ZeHandle, access_mode_t AccessMode,
2085-
ur_device_handle_t Device,
2086-
const ur_event_handle_t *phWaitEvents,
2087-
uint32_t numWaitEvents) {
2085+
ur_result_t _ur_buffer::getBufferZeHandle(char *&ZeHandle,
2086+
access_mode_t AccessMode,
2087+
ur_device_handle_t Device,
2088+
const ur_event_handle_t *phWaitEvents,
2089+
uint32_t numWaitEvents) {
20882090

20892091
// NOTE: There might be no valid allocation at all yet and we get
20902092
// here from piEnqueueKernelLaunch that would be doing the buffer
@@ -2393,7 +2395,7 @@ ur_result_t _ur_buffer::free() {
23932395
// Buffer constructor
23942396
_ur_buffer::_ur_buffer(ur_context_handle_t Context, size_t Size, char *HostPtr,
23952397
bool ImportedHostPtr = false)
2396-
: ur_mem_handle_t_(Context), Size(Size) {
2398+
: ur_mem_handle_t_(mem_type_t::buffer, Context), Size(Size) {
23972399

23982400
// We treat integrated devices (physical memory shared with the CPU)
23992401
// differently from discrete devices (those with distinct memories).
@@ -2422,13 +2424,13 @@ _ur_buffer::_ur_buffer(ur_context_handle_t Context, size_t Size, char *HostPtr,
24222424

24232425
_ur_buffer::_ur_buffer(ur_context_handle_t Context, ur_device_handle_t Device,
24242426
size_t Size)
2425-
: ur_mem_handle_t_(Context, Device), Size(Size) {}
2427+
: ur_mem_handle_t_(mem_type_t::buffer, Context, Device), Size(Size) {}
24262428

24272429
// Interop-buffer constructor
24282430
_ur_buffer::_ur_buffer(ur_context_handle_t Context, size_t Size,
24292431
ur_device_handle_t Device, char *ZeMemHandle,
24302432
bool OwnZeMemHandle)
2431-
: ur_mem_handle_t_(Context, Device), Size(Size) {
2433+
: ur_mem_handle_t_(mem_type_t::buffer, Context, Device), Size(Size) {
24322434

24332435
// Device == nullptr means host allocation
24342436
Allocations[Device].ZeHandle = ZeMemHandle;
@@ -2449,11 +2451,38 @@ _ur_buffer::_ur_buffer(ur_context_handle_t Context, size_t Size,
24492451
LastDeviceWithValidAllocation = Device;
24502452
}
24512453

2452-
ur_result_t _ur_buffer::getZeHandlePtr(char **&ZeHandlePtr,
2453-
access_mode_t AccessMode,
2454-
ur_device_handle_t Device,
2455-
const ur_event_handle_t *phWaitEvents,
2456-
uint32_t numWaitEvents) {
2454+
ur_result_t ur_mem_handle_t_::getZeHandle(char *&ZeHandle, access_mode_t mode,
2455+
ur_device_handle_t Device,
2456+
const ur_event_handle_t *phWaitEvents,
2457+
uint32_t numWaitEvents) {
2458+
switch (mem_type) {
2459+
case ur_mem_handle_t_::image:
2460+
return reinterpret_cast<_ur_image *>(this)->getImageZeHandle(
2461+
ZeHandle, mode, Device, phWaitEvents, numWaitEvents);
2462+
case ur_mem_handle_t_::buffer:
2463+
return reinterpret_cast<_ur_buffer *>(this)->getBufferZeHandle(
2464+
ZeHandle, mode, Device, phWaitEvents, numWaitEvents);
2465+
}
2466+
ur::unreachable();
2467+
}
2468+
2469+
ur_result_t ur_mem_handle_t_::getZeHandlePtr(
2470+
char **&ZeHandlePtr, access_mode_t mode, ur_device_handle_t Device,
2471+
const ur_event_handle_t *phWaitEvents, uint32_t numWaitEvents) {
2472+
switch (mem_type) {
2473+
case ur_mem_handle_t_::image:
2474+
return reinterpret_cast<_ur_image *>(this)->getImageZeHandlePtr(
2475+
ZeHandlePtr, mode, Device, phWaitEvents, numWaitEvents);
2476+
case ur_mem_handle_t_::buffer:
2477+
return reinterpret_cast<_ur_buffer *>(this)->getBufferZeHandlePtr(
2478+
ZeHandlePtr, mode, Device, phWaitEvents, numWaitEvents);
2479+
}
2480+
ur::unreachable();
2481+
}
2482+
2483+
ur_result_t _ur_buffer::getBufferZeHandlePtr(
2484+
char **&ZeHandlePtr, access_mode_t AccessMode, ur_device_handle_t Device,
2485+
const ur_event_handle_t *phWaitEvents, uint32_t numWaitEvents) {
24572486
char *ZeHandle;
24582487
UR_CALL(
24592488
getZeHandle(ZeHandle, AccessMode, Device, phWaitEvents, numWaitEvents));

source/adapters/level_zero/memory.hpp

+41-37
Original file line numberDiff line numberDiff line change
@@ -70,34 +70,41 @@ struct ur_mem_handle_t_ : _ur_object {
7070
// Keeps device of this memory handle
7171
ur_device_handle_t UrDevice;
7272

73+
// Whether this is an image or buffer
74+
enum mem_type_t { image, buffer };
75+
mem_type_t mem_type;
76+
7377
// Enumerates all possible types of accesses.
7478
enum access_mode_t { unknown, read_write, read_only, write_only };
7579

7680
// Interface of the _ur_mem object
7781

7882
// Get the Level Zero handle of the current memory object
79-
virtual ur_result_t getZeHandle(char *&ZeHandle, access_mode_t,
80-
ur_device_handle_t Device,
81-
const ur_event_handle_t *phWaitEvents,
82-
uint32_t numWaitEvents) = 0;
83+
ur_result_t getZeHandle(char *&ZeHandle, access_mode_t,
84+
ur_device_handle_t Device,
85+
const ur_event_handle_t *phWaitEvents,
86+
uint32_t numWaitEvents);
8387

8488
// Get a pointer to the Level Zero handle of the current memory object
85-
virtual ur_result_t getZeHandlePtr(char **&ZeHandlePtr, access_mode_t,
86-
ur_device_handle_t Device,
87-
const ur_event_handle_t *phWaitEvents,
88-
uint32_t numWaitEvents) = 0;
89+
ur_result_t getZeHandlePtr(char **&ZeHandlePtr, access_mode_t,
90+
ur_device_handle_t Device,
91+
const ur_event_handle_t *phWaitEvents,
92+
uint32_t numWaitEvents);
8993

9094
// Method to get type of the derived object (image or buffer)
91-
virtual bool isImage() const = 0;
92-
93-
virtual ~ur_mem_handle_t_() = default;
95+
bool isImage() const { return mem_type == mem_type_t::image; }
9496

9597
protected:
96-
ur_mem_handle_t_(ur_context_handle_t Context)
97-
: UrContext{Context}, UrDevice{nullptr} {}
98+
ur_mem_handle_t_(mem_type_t type, ur_context_handle_t Context)
99+
: UrContext{Context}, UrDevice{nullptr}, mem_type(type) {}
98100

99-
ur_mem_handle_t_(ur_context_handle_t Context, ur_device_handle_t Device)
100-
: UrContext{Context}, UrDevice(Device) {}
101+
ur_mem_handle_t_(mem_type_t type, ur_context_handle_t Context,
102+
ur_device_handle_t Device)
103+
: UrContext{Context}, UrDevice(Device), mem_type(type) {}
104+
105+
// Since the destructor isn't virtual, callers must destruct it via _ur_buffer
106+
// or _ur_image
107+
~ur_mem_handle_t_() {};
101108
};
102109

103110
struct _ur_buffer final : ur_mem_handle_t_ {
@@ -110,7 +117,7 @@ struct _ur_buffer final : ur_mem_handle_t_ {
110117

111118
// Sub-buffer constructor
112119
_ur_buffer(_ur_buffer *Parent, size_t Origin, size_t Size)
113-
: ur_mem_handle_t_(Parent->UrContext), Size(Size),
120+
: ur_mem_handle_t_(mem_type_t::buffer, Parent->UrContext), Size(Size),
114121
SubBuffer{{Parent, Origin}} {
115122
// Retain the Parent Buffer due to the Creation of the SubBuffer.
116123
Parent->RefCount.increment();
@@ -127,16 +134,15 @@ struct _ur_buffer final : ur_mem_handle_t_ {
127134
// up-to-date and any data copies needed for that are performed under
128135
// the hood.
129136
//
130-
virtual ur_result_t getZeHandle(char *&ZeHandle, access_mode_t,
131-
ur_device_handle_t Device,
132-
const ur_event_handle_t *phWaitEvents,
133-
uint32_t numWaitEvents) override;
134-
virtual ur_result_t getZeHandlePtr(char **&ZeHandlePtr, access_mode_t,
135-
ur_device_handle_t Device,
136-
const ur_event_handle_t *phWaitEvents,
137-
uint32_t numWaitEvents) override;
137+
ur_result_t getBufferZeHandle(char *&ZeHandle, access_mode_t,
138+
ur_device_handle_t Device,
139+
const ur_event_handle_t *phWaitEvents,
140+
uint32_t numWaitEvents);
141+
ur_result_t getBufferZeHandlePtr(char **&ZeHandlePtr, access_mode_t,
142+
ur_device_handle_t Device,
143+
const ur_event_handle_t *phWaitEvents,
144+
uint32_t numWaitEvents);
138145

139-
bool isImage() const override { return false; }
140146
bool isSubBuffer() const { return SubBuffer != std::nullopt; }
141147

142148
// Frees all allocations made for the buffer.
@@ -206,35 +212,33 @@ struct _ur_buffer final : ur_mem_handle_t_ {
206212
struct _ur_image final : ur_mem_handle_t_ {
207213
// Image constructor
208214
_ur_image(ur_context_handle_t UrContext, ze_image_handle_t ZeImage)
209-
: ur_mem_handle_t_(UrContext), ZeImage{ZeImage} {}
215+
: ur_mem_handle_t_(mem_type_t::image, UrContext), ZeImage{ZeImage} {}
210216

211217
_ur_image(ur_context_handle_t UrContext, ze_image_handle_t ZeImage,
212218
bool OwnZeMemHandle)
213-
: ur_mem_handle_t_(UrContext), ZeImage{ZeImage} {
219+
: ur_mem_handle_t_(mem_type_t::image, UrContext), ZeImage{ZeImage} {
214220
OwnNativeHandle = OwnZeMemHandle;
215221
}
216222

217-
virtual ur_result_t getZeHandle(char *&ZeHandle, access_mode_t,
218-
ur_device_handle_t,
219-
const ur_event_handle_t *phWaitEvents,
220-
uint32_t numWaitEvents) override {
223+
ur_result_t getImageZeHandle(char *&ZeHandle, access_mode_t,
224+
ur_device_handle_t,
225+
const ur_event_handle_t *phWaitEvents,
226+
uint32_t numWaitEvents) {
221227
std::ignore = phWaitEvents;
222228
std::ignore = numWaitEvents;
223229
ZeHandle = reinterpret_cast<char *>(ZeImage);
224230
return UR_RESULT_SUCCESS;
225231
}
226-
virtual ur_result_t getZeHandlePtr(char **&ZeHandlePtr, access_mode_t,
227-
ur_device_handle_t,
228-
const ur_event_handle_t *phWaitEvents,
229-
uint32_t numWaitEvents) override {
232+
ur_result_t getImageZeHandlePtr(char **&ZeHandlePtr, access_mode_t,
233+
ur_device_handle_t,
234+
const ur_event_handle_t *phWaitEvents,
235+
uint32_t numWaitEvents) {
230236
std::ignore = phWaitEvents;
231237
std::ignore = numWaitEvents;
232238
ZeHandlePtr = reinterpret_cast<char **>(&ZeImage);
233239
return UR_RESULT_SUCCESS;
234240
}
235241

236-
bool isImage() const override { return true; }
237-
238242
// Keep the descriptor of the image
239243
ZeStruct<ze_image_desc_t> ZeImageDesc;
240244

0 commit comments

Comments
 (0)