Cleanup: Vulkan/OpenXR: Pass Blender context via constructor

Similar to Direct3D.

Pull Request: https://projects.blender.org/blender/blender/pulls/137254
This commit is contained in:
Jeroen Bakker
2025-04-10 08:51:20 +02:00
parent a564a27c1f
commit 07a9306bb4
3 changed files with 19 additions and 10 deletions

View File

@@ -542,7 +542,7 @@ std::unique_ptr<GHOST_IXrGraphicsBinding> GHOST_XrGraphicsBindingCreateFromType(
return std::make_unique<GHOST_XrGraphicsBindingOpenGL>();
#ifdef WITH_VULKAN_BACKEND
case GHOST_kXrGraphicsVulkan:
return std::make_unique<GHOST_XrGraphicsBindingVulkan>();
return std::make_unique<GHOST_XrGraphicsBindingVulkan>(context);
#endif
#ifdef WIN32
case GHOST_kXrGraphicsOpenGLD3D11:

View File

@@ -28,14 +28,23 @@ PFN_xrCreateVulkanInstanceKHR GHOST_XrGraphicsBindingVulkan::s_xrCreateVulkanIns
nullptr;
PFN_xrCreateVulkanDeviceKHR GHOST_XrGraphicsBindingVulkan::s_xrCreateVulkanDeviceKHR_fn = nullptr;
/* -------------------------------------------------------------------- */
/** \name Constructor
* \{ */
GHOST_XrGraphicsBindingVulkan::GHOST_XrGraphicsBindingVulkan(GHOST_Context &ghost_ctx)
: GHOST_IXrGraphicsBinding(), m_ghost_ctx(static_cast<GHOST_ContextVK &>(ghost_ctx))
{
}
/* \} */
/* -------------------------------------------------------------------- */
/** \name Destroying resources.
* \{ */
GHOST_XrGraphicsBindingVulkan::~GHOST_XrGraphicsBindingVulkan()
{
m_ghost_ctx = nullptr;
/* Destroy buffer */
if (m_vk_buffer != VK_NULL_HANDLE) {
vmaUnmapMemory(m_vma_allocator, m_vk_buffer_allocation);
@@ -137,11 +146,10 @@ bool GHOST_XrGraphicsBindingVulkan::checkVersionRequirements(GHOST_Context &ghos
return true;
}
void GHOST_XrGraphicsBindingVulkan::initFromGhostContext(GHOST_Context &ghost_ctx,
void GHOST_XrGraphicsBindingVulkan::initFromGhostContext(GHOST_Context & /*ghost_ctx*/,
XrInstance instance,
XrSystemId system_id)
{
m_ghost_ctx = static_cast<GHOST_ContextVK *>(&ghost_ctx);
/* Create a new VkInstance that is compatible with OpenXR */
VkApplicationInfo vk_application_info = {VK_STRUCTURE_TYPE_APPLICATION_INFO,
nullptr,
@@ -268,7 +276,7 @@ void GHOST_XrGraphicsBindingVulkan::initFromGhostContext(GHOST_Context &ghost_ct
GHOST_TVulkanXRModes GHOST_XrGraphicsBindingVulkan::choseDataTransferMode()
{
GHOST_VulkanHandles vulkan_handles;
m_ghost_ctx->getVulkanHandles(vulkan_handles);
m_ghost_ctx.getVulkanHandles(vulkan_handles);
/* Retrieve the Context physical device properties. */
VkPhysicalDeviceVulkan11Properties vk_physical_device_vulkan11_properties = {
@@ -436,7 +444,7 @@ void GHOST_XrGraphicsBindingVulkan::submitToSwapchainImageCpu(
{
/* Acquire frame buffer image. */
GHOST_VulkanOpenXRData openxr_data = {GHOST_kVulkanXRModeCPU};
m_ghost_ctx->openxr_acquire_framebuffer_image_callback_(&openxr_data);
m_ghost_ctx.openxr_acquire_framebuffer_image_callback_(&openxr_data);
/* Import render result. */
VkDeviceSize component_size = 4 * sizeof(uint8_t);
@@ -542,7 +550,7 @@ void GHOST_XrGraphicsBindingVulkan::submitToSwapchainImageCpu(
vkResetCommandBuffer(vk_command_buffer, 0);
/* Release frame buffer image. */
m_ghost_ctx->openxr_release_framebuffer_image_callback_(&openxr_data);
m_ghost_ctx.openxr_release_framebuffer_image_callback_(&openxr_data);
}
/* \} */
@@ -555,7 +563,7 @@ void GHOST_XrGraphicsBindingVulkan::submitToSwapchainImageGpu(
XrSwapchainImageVulkan2KHR &swapchain_image, const GHOST_XrDrawViewInfo &draw_info)
{
GHOST_VulkanOpenXRData openxr_data = {m_data_transfer_mode};
m_ghost_ctx->openxr_acquire_framebuffer_image_callback_(&openxr_data);
m_ghost_ctx.openxr_acquire_framebuffer_image_callback_(&openxr_data);
/* Create an image handle */
VkExternalMemoryImageCreateInfo vk_external_memory_image_info = {

View File

@@ -17,6 +17,7 @@
class GHOST_XrGraphicsBindingVulkan : public GHOST_IXrGraphicsBinding {
public:
GHOST_XrGraphicsBindingVulkan(GHOST_Context &ghost_ctx);
~GHOST_XrGraphicsBindingVulkan() override;
/**
@@ -41,7 +42,7 @@ class GHOST_XrGraphicsBindingVulkan : public GHOST_IXrGraphicsBinding {
bool needsUpsideDownDrawing(GHOST_Context &ghost_ctx) const override;
private:
GHOST_ContextVK *m_ghost_ctx = nullptr;
GHOST_ContextVK &m_ghost_ctx;
VkInstance m_vk_instance = VK_NULL_HANDLE;
VkPhysicalDevice m_vk_physical_device = VK_NULL_HANDLE;