Skip to content

Commit c242cef

Browse files
committed
Use vectors for OpenXRAPI memory management
1 parent 5b52b4b commit c242cef

File tree

5 files changed

+144
-266
lines changed

5 files changed

+144
-266
lines changed

modules/openxr/extensions/platform/openxr_opengl_extension.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -228,33 +228,32 @@ bool OpenXROpenGLExtension::get_swapchain_image_data(XrSwapchain p_swapchain, in
228228
}
229229

230230
#ifdef ANDROID_ENABLED
231-
XrSwapchainImageOpenGLESKHR *images = (XrSwapchainImageOpenGLESKHR *)memalloc(sizeof(XrSwapchainImageOpenGLESKHR) * swapchain_length);
231+
LocalVector<XrSwapchainImageOpenGLESKHR> images;
232232
#else
233-
XrSwapchainImageOpenGLKHR *images = (XrSwapchainImageOpenGLKHR *)memalloc(sizeof(XrSwapchainImageOpenGLKHR) * swapchain_length);
233+
LocalVector<XrSwapchainImageOpenGLKHR> images;
234234
#endif
235-
ERR_FAIL_NULL_V_MSG(images, false, "OpenXR Couldn't allocate memory for swap chain image");
235+
images.resize(swapchain_length);
236236

237-
for (uint64_t i = 0; i < swapchain_length; i++) {
238237
#ifdef ANDROID_ENABLED
239-
images[i].type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR;
238+
for (XrSwapchainImageOpenGLESKHR &image : images) {
239+
image.type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR;
240240
#else
241-
images[i].type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR;
241+
for (XrSwapchainImageOpenGLKHR &image : images) {
242+
image.type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR;
242243
#endif
243-
images[i].next = nullptr;
244-
images[i].image = 0;
244+
image.next = nullptr;
245+
image.image = 0;
245246
}
246247

247-
result = xrEnumerateSwapchainImages(p_swapchain, swapchain_length, &swapchain_length, (XrSwapchainImageBaseHeader *)images);
248+
result = xrEnumerateSwapchainImages(p_swapchain, swapchain_length, &swapchain_length, (XrSwapchainImageBaseHeader *)images.ptr());
248249
if (XR_FAILED(result)) {
249250
print_line("OpenXR: Failed to get swapchaim images [", OpenXRAPI::get_singleton()->get_error_string(result), "]");
250-
memfree(images);
251251
return false;
252252
}
253253

254254
SwapchainGraphicsData *data = memnew(SwapchainGraphicsData);
255255
if (data == nullptr) {
256256
print_line("OpenXR: Failed to allocate memory for swapchain data");
257-
memfree(images);
258257
return false;
259258
}
260259
*r_swapchain_graphics_data = data;
@@ -279,8 +278,6 @@ bool OpenXROpenGLExtension::get_swapchain_image_data(XrSwapchain p_swapchain, in
279278

280279
data->texture_rids = texture_rids;
281280

282-
memfree(images);
283-
284281
return true;
285282
}
286283

modules/openxr/extensions/platform/openxr_vulkan_extension.cpp

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ void OpenXRVulkanExtension::get_usable_depth_formats(Vector<int64_t> &p_usable_s
239239
}
240240

241241
bool OpenXRVulkanExtension::get_swapchain_image_data(XrSwapchain p_swapchain, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size, void **r_swapchain_graphics_data) {
242-
XrSwapchainImageVulkanKHR *images = nullptr;
242+
LocalVector<XrSwapchainImageVulkanKHR> images;
243243

244244
RenderingServer *rendering_server = RenderingServer::get_singleton();
245245
ERR_FAIL_NULL_V(rendering_server, false);
@@ -253,27 +253,23 @@ bool OpenXRVulkanExtension::get_swapchain_image_data(XrSwapchain p_swapchain, in
253253
return false;
254254
}
255255

256-
images = (XrSwapchainImageVulkanKHR *)memalloc(sizeof(XrSwapchainImageVulkanKHR) * swapchain_length);
257-
ERR_FAIL_NULL_V_MSG(images, false, "OpenXR Couldn't allocate memory for swap chain image");
256+
images.resize(swapchain_length);
258257

259-
for (uint64_t i = 0; i < swapchain_length; i++) {
260-
images[i].type = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR;
261-
images[i].next = nullptr;
262-
images[i].image = VK_NULL_HANDLE;
258+
for (XrSwapchainImageVulkanKHR &image : images) {
259+
image.type = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR;
260+
image.next = nullptr;
261+
image.image = VK_NULL_HANDLE;
263262
}
264263

265-
result = xrEnumerateSwapchainImages(p_swapchain, swapchain_length, &swapchain_length, (XrSwapchainImageBaseHeader *)images);
264+
result = xrEnumerateSwapchainImages(p_swapchain, swapchain_length, &swapchain_length, (XrSwapchainImageBaseHeader *)images.ptr());
266265
if (XR_FAILED(result)) {
267266
print_line("OpenXR: Failed to get swapchaim images [", OpenXRAPI::get_singleton()->get_error_string(result), "]");
268-
memfree(images);
269267
return false;
270268
}
271269

272-
// SwapchainGraphicsData *data = (SwapchainGraphicsData *)memalloc(sizeof(SwapchainGraphicsData));
273270
SwapchainGraphicsData *data = memnew(SwapchainGraphicsData);
274271
if (data == nullptr) {
275272
print_line("OpenXR: Failed to allocate memory for swapchain data");
276-
memfree(images);
277273
return false;
278274
}
279275
*r_swapchain_graphics_data = data;
@@ -357,13 +353,13 @@ bool OpenXRVulkanExtension::get_swapchain_image_data(XrSwapchain p_swapchain, in
357353
Vector<RID> texture_rids;
358354

359355
// create Godot texture objects for each entry in our swapchain
360-
for (uint64_t i = 0; i < swapchain_length; i++) {
356+
for (const XrSwapchainImageVulkanKHR &swapchain_image : images) {
361357
RID image_rid = rendering_device->texture_create_from_extension(
362358
p_array_size == 1 ? RenderingDevice::TEXTURE_TYPE_2D : RenderingDevice::TEXTURE_TYPE_2D_ARRAY,
363359
format,
364360
samples,
365361
usage_flags,
366-
(uint64_t)images[i].image,
362+
(uint64_t)swapchain_image.image,
367363
p_width,
368364
p_height,
369365
1,
@@ -374,8 +370,6 @@ bool OpenXRVulkanExtension::get_swapchain_image_data(XrSwapchain p_swapchain, in
374370

375371
data->texture_rids = texture_rids;
376372

377-
memfree(images);
378-
379373
return true;
380374
}
381375

0 commit comments

Comments
 (0)