XR_EXT_spatial_container_self_rendering

Name String

XR_EXT_spatial_container_self_rendering

نوع الإضافة

إضافة مثيل

رقم الإضافة المسجَّل

814

المراجعة

1

حالة التصديق

لم تتم المصادقة عليها

الاعتماد على الإضافات والإصدارات

XR_EXT_spatial_container

تاريخ آخر تعديل

2026-08-06

حالة الملكية الفكرية

ما مِن مطالبات معروفة بشأن الملكية الفكرية.

المساهمون

"لاكلان فورد"، Google
"أندرياس لوف سيلفيك"، Meta Platforms
"آدم غوسيتيس"، Meta Platforms
"بيورن سوينسون"، LÖVR
"كاس إيفريت"، Meta Platforms
"كريستيان كروز"، Meta Platforms
"ديني رونغرين"، Varjo Technologies
"فريديا هويا كواديو"، Godot Engine
"جاكوب بورنيكرانتز"، NVIDIA
"جاريد فايندر"، Google
"جوناثان رايت"، Meta Platforms
"جيان تشانغ"، ByteDance
"كورتيس إيفلي"، Qualcomm
"ماوريسيو نارفايز"، Meta Platforms
"نيك كلينغينسميث"، Qualcomm
"نيكيتا لوتسينكو"، Meta Platforms
"برافين بابو جيه دي"، ByteDance
"رايلي بافليك"، Collabora
"سالار خان"، Google
"شواي ليو"، ByteDance
"والتر لوه"، Meta Platforms
"يين لي"، Microsoft

نظرة عامة

تحدّد هذه الإضافة "العرض الذاتي" للحاويات المكانية. يتم إنشاء جميع وحدات بكسل الحاوية المكانية التي يتم عرضها ذاتيًا بواسطة تطبيق وإرسالها إلى وقت التشغيل باستخدام سلاسل التبديل وطبقات التركيب العادية في OpenXR. بما أنّ الحاويات المكانية لا تشغل دائمًا جميع وحدات البكسل على الشاشة، فإنّ بيئة التشغيل تُعلم التطبيقات بدرجة الدقة المقترَحة وإعدادات العرض لكل حاوية مكانية لتمكين التطبيقات من العرض بكفاءة أكبر.

تهدف هذه الإضافة مع XR_EXT_spatial_container إلى تقديم مجموعة شاملة من إمكانات عرض طبقة التركيب الأساسية التقليدية في OpenXR 1.x. يجب على بيئات تشغيل OpenXR 1.x التي تتيح العرض الرسومي وهذه الإضافة ضبط XrSystemSpatialContainerPropertiesEXT :: supportsImmersive على "صحيح" للإشارة إلى أنّها تتيح استخدام الحاويات المكانية الغامرة.

دورة حياة عرض الحاوية المكانية

لاستخدام العرض الذاتي لحاوية مكانية، يضبط التطبيق XrSpatialContainerCreateInfoEXT :: graphicsPresentation على XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT عند استدعاء xrCreateSpatialContainerEXT . بعد ذلك، يمكن لهذا التطبيق إدارة ما إذا كانت الحاوية المكانية تعرض المحتوى بشكل نشط من خلال استدعاء الدالتَين xrBeginSpatialContainerRenderingEXT وxrEndSpatialContainerRenderingEXT. تحلّ هاتان الدالتان محلّ xrBeginSession وxrEndSession . وهي ليست عمليات لكل إطار، مثل xrBeginFrame وxrEndFrame .

في كل إطار، يمر التطبيق بالخطوات التالية:

  • استدعِ xrWaitFrame وxrBeginFrame . لا تحتوي هذه الدوال على بُنى خاصة بالحاويات وتعمل كما هي في المواصفات الأساسية.
  • استرداد أوضاع العرض ومَعلمات العرض وتوصيات العرض لجميع الحاويات المكانية التي يتم عرضها بشكل نشط باستخدام xrLocateSpatialContainerViewsEXT . بالنسبة إلى كل حاوية مكانية، يبلّغ وقت التشغيل عمّا إذا كان يجب عرض طبقات التركيب والطريقة المقترَحة لعرض الطبقات من خلال ملء XrSpatialContainerViewStateEXT .
  • عرض وحدات البكسل في طبقات التركيب بشكل طبيعي لا تتضمّن هذه العمليات أي هياكل خاصة بالحاويات.
  • أرسِل طبقات التركيب لجميع الحاويات المكانية التي يتم عرضها بشكل نشط من خلال استدعاء xrEndFrame وربط XrSpatialContainerLayerFrameEndInfoEXT .

يؤدي تدمير مؤشر XrSpatialContainerEXT إلى إزالته ضمنيًا من مجموعة العرض النشطة. يمكن للتطبيق إتلاف حاوية مكانية حتى إذا أجرى طلبًا ناجحًا إلى xrBeginSpatialContainerRenderingEXT غير مرتبط بطلب مقابل إلى xrEndSpatialContainerRenderingEXT . يجب أن يتصرف وقت التشغيل كما لو تم استدعاء xrEndSpatialContainerRenderingEXT ضمنيًا إذا لزم الأمر في وقت مبكر من تنفيذ xrDestroySpatialContainerEXT إذا تم عرضه بنجاح.

عندما يتلقّى تطبيق حدث XrEventDataSpatialContainerClosedEXT لحاوية في مجموعة العرض النشطة، يجب أن يستدعي هذا التطبيق xrEndSpatialContainerRenderingEXT ويتلف مؤشر XrSpatialContainerEXT.

تضيف الدالة xrBeginSpatialContainerRenderingEXT الحاوية المكانية إلى مجموعة العرض النشطة لكل جلسة، ما يتيح للتطبيق إرسال طبقات التركيب للحاوية المكانية إلى xrEndFrame .

XrResult xrBeginSpatialContainerRenderingEXT(
    XrSession                                   session,
    const XrSpatialContainerBeginInfoEXT*       beginInfo);

أوصاف المَعلمات

تستدعي التطبيقات عادةً هذه الدالة استجابةً لحدث visible-changed مع ضبط XrEventDataSpatialContainerVisibleChangedEXT :: visible على القيمة true.

إذا لم يتم إنشاء الحاوية المكانية باستخدام XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT عند استدعاء xrCreateSpatialContainerEXT، يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT .

إذا كانت الحاوية المكانية مضمّنة في مجموعة العرض النشطة، يجب أن يعرض وقت التشغيل القيمة XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT .

إذا تم استدعاء xrBeginSpatialContainerRenderingEXT في وقت لم يتمكّن فيه التطبيق من استدعاء xrWaitFrame (أي داخل نافذة xrBeginFrame وxrEndFrame)، يجب أن يعرض وقت التشغيل XR_ERROR_CALL_ORDER_INVALID .

الاستخدام الصالح (ضمني)

أمان Thread

رموز الإرجاع

Success

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

تعذّر الإجراء

  • XR_ERROR_CALL_ORDER_INVALID
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT
  • XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED

تُستخدَم بنية XrSpatialContainerBeginInfoEXT لتحديد مَعلمات بدء عرض حاوية مكانية.

typedef struct XrSpatialContainerBeginInfoEXT {
    XrStructureType            type;
    const void*                next;
    XrSpatialContainerEXT      spatialContainer;
    XrViewConfigurationType    primaryViewConfigurationType;
} XrSpatialContainerBeginInfoEXT;

وصف العضو

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى.
  • ‫spatialContainer هو XrSpatialContainerEXT لبدء العرض.
  • ‫primaryViewConfigurationType هو XrViewConfigurationType الأساسي الذي سيتم استخدامه للحاوية المكانية.

‫primaryViewConfigurationType هي إعدادات العرض التي ينوي التطبيق استخدامها عند العرض. قد يقلّل وقت التشغيل من إعدادات العرض إلى نوع يتضمّن عددًا أقل من طرق العرض لأغراض التحسين (على سبيل المثال، تكون الحاوية بعيدة جدًا وصغيرة بحيث لا يمكن إدراك العرض المجسّم). تعرض بيئة التشغيل تفاصيل حول إعدادات العرض المنخفضة من الطلبات إلى xrLocateSpatialContainerViewsEXT .

الاستخدام الصالح (ضمني)

تزيل الدالة xrEndSpatialContainerRenderingEXT الحاوية المكانية من مجموعة العرض النشطة.

XrResult xrEndSpatialContainerRenderingEXT(
    XrSession                                   session,
    const XrSpatialContainerEndInfoEXT*         endInfo);

أوصاف المَعلمات

تستدعي التطبيقات عادةً هذه الدالة استجابةً لحدث visible-changed مع ضبط XrEventDataSpatialContainerVisibleChangedEXT :: visible على القيمة false.

إذا لم تكن الحاوية المكانية ضمن مجموعة العرض النشطة، يجب أن تعرض بيئة التشغيل القيمة XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT .

إذا تم استدعاء xrEndSpatialContainerRenderingEXT في وقت لم يتمكّن فيه التطبيق من استدعاء xrWaitFrame (أي خلال الفترة بين استدعاءات xrBeginFrame وxrEndFrame)، يجب أن يعرض وقت التشغيل XR_ERROR_CALL_ORDER_INVALID.

الاستخدام الصالح (ضمني)

أمان Thread

رموز الإرجاع

Success

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

تعذّر الإجراء

  • XR_ERROR_CALL_ORDER_INVALID
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT
  • XR_ERROR_VALIDATION_FAILURE

تُستخدَم بنية XrSpatialContainerEndInfoEXT لتحديد مَعلمات إنهاء عرض حاوية مكانية.

typedef struct XrSpatialContainerEndInfoEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrSpatialContainerEndInfoEXT;

وصف العضو

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى.
  • ‫spatialContainer هو XrSpatialContainerEXT لإنهاء العرض.

الاستخدام الصالح (ضمني)

تحديد موضع طرق العرض من خلال xrLocateSpatialContainerViewsEXT

تحدّد الدالة xrLocateSpatialContainerViewsEXT مواقع العروض لمجموعة من الحاويات المكانية.

XrResult xrLocateSpatialContainerViewsEXT(
    XrSession                                   session,
    const XrSpatialContainerViewsLocateInfoEXT* locateInfo,
    uint32_t                                    viewStateCount,
    XrSpatialContainerViewStateEXT*             viewStates,
    uint32_t                                    viewCount,
    XrView*                                     views);

أوصاف المَعلمات

  • ‫session هي XrSession .
  • ‫locateInfo هو مؤشر إلى بنية XrSpatialContainerViewsLocateInfoEXT.
  • ‫viewStateCount هو عدد عناصر الصفيفة viewStates.
  • ‫viewStates هو مؤشر إلى مصفوفة من هياكل XrSpatialContainerViewStateEXT التي سيتم ملؤها من خلال وقت التشغيل.
  • ‫viewCount هو عدد عناصر الصفيفة views.
  • ‫views هو مؤشر إلى مصفوفة من بُنى XrView.

تحلّ هذه الدالة محلّ xrLocateViews، ما يتيح للتطبيق طلب معلومات عن طرق العرض لعدة حاويات مكانية في الوقت نفسه.

يتم عرض المشاهدات لجميع الحاويات المكانية في مصفوفة views واحدة. يتم ترتيب طرق العرض استنادًا إلى فهرس الحاوية المكانية في مصفوفة XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfos، ثم فهرس العرض لتلك الحاوية.

على سبيل المثال، إذا كان التطبيق يوفّر ثلاث حاويات مكانية في XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfos :

  • الفهرس 0: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO (مشاهدة واحدة)
  • الفهرس 1: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO (مشاهدتان)
  • الفهرس 2: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO_WITH_FOVEATED_INSET (4 مشاهدات)

بعد ذلك، يجب أن يملأ وقت التشغيل مصفوفة views بـ 7 طرق عرض:

  • views [0] هو العرض للحاوية 0.
  • ‫views [1] هي طريقة عرض العين اليسرى للحاوية 1.
  • ‫views [2] هو عرض العين اليمنى للحاوية 1.
  • ‫views [3] هو عرض العين اليسرى للحاوية 2.
  • ‫views [4] هو عرض العين اليمنى للحاوية 2.
  • ‫views [5] هو عرض العين اليسرى المضمّن للحاوية 2.
  • ‫views [6] هي طريقة العرض المضمّنة للعين اليمنى للحاوية 2.

إذا لم تكن قيمة viewCount مساوية لمجموع أعداد المشاهدات لكل نوع من أنواع إعدادات العرض المطلوبة في الحاوية المكانية، يجب أن يعرض وقت التشغيل القيمة XR_ERROR_VALIDATION_FAILURE .

قد يقلّل وقت التشغيل من إعدادات العرض إلى نوع يتضمّن عددًا أقل من طرق العرض لأغراض التحسين (على سبيل المثال، تكون الحاوية بعيدة جدًا وصغيرة بحيث لا يمكن إدراك العرض المجسّم). إذا أدى وقت التشغيل إلى تقليل عدد طرق العرض في الإعدادات، يجب أن يعرض وقت التشغيل العدد الأصلي لطرق العرض في تلك الحاوية، مع ملء طرق العرض الإضافية بنُسخ مكرّرة من طرق العرض التي تم تقليلها. على سبيل المثال، إذا تم تحويل XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO إلى XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO، سيحتوي كل من المؤشر 0 والمؤشر 1 على العرض الأحادي الواحد. وبالتالي، فإنّ إجمالي عدد طرق العرض التي تم عرضها في مصفوفة views لا يعتمد على ما إذا كان وقت التشغيل قد قرّر إيقاف أي إعدادات لطرق العرض أم لا.

يجب أن تكيّف بيئة التشغيل كل XrView :: fov يتم عرضه بحيث يكون الهرم الناقص صغيرًا قدر الإمكان مع استمرار احتوائه على الحدود الكاملة للحاوية المكانية المقابلة. قد تعرض بيئات التشغيل مجالات رؤية غير متماثلة، على سبيل المثال إذا كانت الحاوية المكانية بزاوية مائلة بالنسبة إلى مجال رؤية المستخدم، أو إذا كانت محجوبة جزئيًا بواسطة عنصر آخر. قد تضع بيئات التشغيل سطح العرض المستهدَف للحاوية المكانية في أي موضع. بسبب طبيعة عرض التطبيقات المتعددة، حيث يتم فصل الحاويات المكانية عن المستخدم، قد يعرض وقت التشغيل قيم XrView غير مناسبة لعرض وحدات البكسل، على سبيل المثال، إذا لم تكن الحاوية المكانية مرئية على الشاشة، لن تكون هناك قيم صالحة لضبط XrView :: fov. في هذه الحالات، يجب أن تضبط بيئات التشغيل XrSpatialContainerViewStateEXT :: shouldSubmitLayers على "خطأ".

تعرض بيئة التشغيل معلومات إضافية عن حالة العرض لكل حاوية مكانية في مصفوفة viewStates. إذا لم تكن قيمة viewStateCount مساوية لـ XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfoCount، يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE .

بعد أن تضع بيئة التشغيل حدث XrEventDataSpatialContainerClosedEXT في قائمة الانتظار لحاوية مكانية، يجب أن تعرض هذه الدالة XR_FALSE في XrSpatialContainerViewStateEXT :: shouldSubmitLayers و0 في XrSpatialContainerViewStateEXT :: viewStateFlags للحاوية المكانية المقابلة.

بالنسبة إلى الحاويات المكانية التي تتغيّر مواقعها الجغرافية بشكل نشط في العالم الواقعي، يجب أن يأخذ وقت التشغيل حركة الحاوية في الاعتبار عند ملء views لتقليل عيوب إعادة العرض.

إذا تم استدعاء xrLocateSpatialContainerViewsEXT لحاوية مكانية واحدة أو أكثر غير مضمّنة حاليًا في مجموعة العرض النشطة، يجب أن يعرض وقت التشغيل XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT .

الاستخدام الصالح (ضمني)

  • يجب تفعيل الإضافة XR_EXT_spatial_container_self_rendering قبل استدعاء xrLocateSpatialContainerViewsEXT
  • يجب أن يكون session اسم معرِّف XrSession صالحًا
  • يجب أن يكون locateInfo مؤشرًا إلى بنية XrSpatialContainerViewsLocateInfoEXT صالحة
  • viewStates يجب أن يكون مؤشرًا إلى مصفوفة من هياكل viewStateCount XrSpatialContainerViewStateEXT
  • يجب أن يكون views مؤشرًا إلى مصفوفة من بُنى viewCount XrView
  • يجب أن تكون المَعلمة viewStateCount أكبر من 0
  • يجب أن تكون المَعلمة viewCount أكبر من 0

رموز الإرجاع

Success

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

تعذّر الإجراء

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED

تحتوي البنية XrSpatialContainerViewsLocateInfoEXT على مَعلمات لتحديد موضع العروض في مجموعة من الحاويات المكانية.

typedef struct XrSpatialContainerViewsLocateInfoEXT {
    XrStructureType                               type;
    const void*                                   next;
    XrTime                                        displayTime;
    uint32_t                                      viewLocateInfoCount;
    const XrSpatialContainerViewLocateInfoEXT*    viewLocateInfos;
} XrSpatialContainerViewsLocateInfoEXT;

وصف العضو

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى.
  • ‫displayTime هي XrTime التي يتم فيها تحديد مكان طرق العرض.
  • ‫viewLocateInfoCount هو عدد الإدخالات في مصفوفة viewLocateInfos.
  • ‫viewLocateInfos هو مؤشر إلى مصفوفة من هياكل XrSpatialContainerViewLocateInfoEXT.

الاستخدام الصالح (ضمني)

تحتوي بنية XrSpatialContainerViewLocateInfoEXT على مَعلمات لحاوية مكانية فردية لتحديد أماكن العرض.

typedef struct XrSpatialContainerViewLocateInfoEXT {
    XrStructureType            type;
    const void*                next;
    XrViewConfigurationType    viewConfigurationType;
    XrSpace                    space;
    XrSpatialContainerEXT      spatialContainer;
} XrSpatialContainerViewLocateInfoEXT;

وصف العضو

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى.
  • ‫viewConfigurationType هو XrViewConfigurationType يُستخدَم للحاوية المكانية.
  • ‫space هو XrSpace الذي تقع فيه طرق عرض الحاوية المكانية.
  • ‫spatialContainer هو الاسم المعرِّف لـ XrSpatialContainerEXT.

يمكن للتطبيق تقديم أي XrSpace صالح في space، ولكن يُنصح بتقديم مساحة الحاوية المكانية لـ XrSpatialContainerEXT المقابل المحدّد ضمن بنية XrSpatialContainerViewLocateInfoEXT.

الاستخدام الصالح (ضمني)

تتم تعبئة بنية XrSpatialContainerViewStateEXT من خلال طلبات إلى xrLocateSpatialContainerViewsEXT مع معلومات حول مدى ملاءمة العرض لكل حاوية مكانية.

typedef struct XrSpatialContainerViewStateEXT {
    XrStructureType            type;
    void*                      next;
    XrViewStateFlags           viewStateFlags;
    XrViewConfigurationType    viewConfigurationType;
    XrBool32                   shouldSubmitLayers;
    XrExtent2Di                recommendedImageExtent;
} XrSpatialContainerViewStateEXT;

وصف العضو

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى.
  • ‫viewStateFlags هو قناع بت من XrViewStateFlags . هذه العلامات لها الغرض نفسه مثل viewStateFlags في بنية XrViewState الأساسية.
  • ‫viewConfigurationType هو XrViewConfigurationType يشير إلى نوع إعدادات العرض التي تستخدمها بيئة التشغيل للحاوية المكانية، والتي قد تتراجع بيئات التشغيل إلى إعدادات عرض بعدد أقل من العروض مقارنةً بالعدد المطلوب.
  • ‫shouldSubmitLayers هو XrBool32 يعرضه وقت التشغيل. إذا كانت القيمة XR_FALSE، يجب على التطبيق تجنُّب إرسال التركيب لهذه الحاوية المكانية لأنّها غير مرئية حاليًا أو في حالة لا تتطلّب العرض.
  • ‫recommendedImageExtent هي بنية XrExtent2Di تمثّل درجة الدقة المقترَحة للحاوية المكانية.

كما هو الحال مع موقع العرض الأساسي في OpenXR، يجب أن يتحقّق التطبيق من XrSpatialContainerViewStateEXT :: viewStateFlags للتأكّد من أنّ الموضع والاتجاه صالحان ويتم تتبُّعهما قبل استخدام بيانات العرض للعرض.

يجب أن يتحقّق التطبيق من shouldSubmitLayers وviewConfigurationType لتجنُّب عرض أكثر مما يوصي به وقت التشغيل. عندما تكون قيمة shouldSubmitLayers هي "خطأ"، يغيّر التطبيق سلوك العرض على النحو التالي:

  • يجب ألّا يقرأ التطبيق السمة XrView :: fov المقابلة.
  • يجب ألّا يقرأ التطبيق recommendedImageExtent .
  • يجب أن يتجنّب التطبيق العرض على سلاسل التبديل وإرسال طبقات التركيب للحاوية المكانية المقابلة.
  • يجب أن يضبط التطبيق XrSpatialContainerLayerEXT :: retainPreviousSubmission على "صحيح". إذا اختار التطبيق إرسال الطبقات على أي حال، يعود الأمر إلى وقت التشغيل لتحديد ما يريد فعله بالطبقات (على سبيل المثال، قد يختار وقت التشغيل تجاهلها).

‫recommendedImageExtent مخصّصة للطبقات التي سيتم تعديلها استنادًا إلى موضع الحاوية أو طريقة عرض المستخدم. عند تعديل الطبقات بمحتوى يعتمد على موضع الحاوية المكانية أو طريقة عرض المستخدم (مثل المحتوى العادي الثلاثي الأبعاد)، يجب أن يعرض التطبيق إطار العرض الأصغر هذا بدلاً من حجم العرض التلقائي المقترَح. عند تعديل الطبقات بمحتوى لا يعتمد على موضع الحاوية المكانية أو عرض المستخدم (مثل طبقات الأشكال الرباعية الثابتة)، يمكن للتطبيق تجاهل هذه القيم بأمان. بالنسبة إلى الطبقات التي تعتمد على العرض، يُعدّ recommendedImageExtent اقتراحًا للتطبيق من وقت التشغيل يهدف إلى تقليل التعرّج وتحسين أداء العرض. ويمكن للتطبيق إرسال الوسائط بدقة كاملة إذا أراد ذلك.

يجب أن يكون XrExtent2Di :: width وXrExtent2Di :: height من recommendedImageExtent دائمًا عددًا صحيحًا موجبًا أقل من أو يساوي XrViewConfigurationView :: recommendedImageRectWidth وXrViewConfigurationView :: recommendedImageRectHeight من XrViewConfigurationView لإعدادات العرض الأساسية للحاوية المكانية. يجب ألّا يعيد التطبيق إنشاء سلسلة تبديل لمجرد تغيير recommendedImageExtent، لأنّه تلميح ديناميكي للتطبيق يحدّد XrSwapchainSubImage :: imageRect لاستخدامه في XrSwapchainSubImage لأي طبقات تركيب بدقة كاملة يرسلها، ويمكن أن يتغيّر كل إطار.

الاستخدام الصالح (ضمني)

عرض مساحة المرجع

تبقى مساحة مرجع العرض بدون تغيير كما هي في OpenXR core. كما هو الحال في الإصدار الأساسي، لا يُقصد استخدامه في العرض.

إرسال الطبقات من خلال xrEndFrame

لعرض الحاويات المكانية، يجب أن يوفّر التطبيق قائمة بالطبقات المرتبطة بحاوياتها المكانية إلى xrEndFrame . يتم تنفيذ ذلك من خلال بنية XrSpatialContainerLayerFrameEndInfoEXT.

typedef struct XrSpatialContainerLayerFrameEndInfoEXT {
    XrStructureType                      type;
    const void*                          next;
    uint32_t                             containerLayerCount;
    const XrSpatialContainerLayerEXT*    containerLayers;
} XrSpatialContainerLayerFrameEndInfoEXT;

وصف العضو

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى.
  • ‫containerLayerCount هو عدد العناصر في مصفوفة containerLayers.
  • ‫containerLayers هو مؤشر إلى مصفوفة من بُنى XrSpatialContainerLayerEXT.

تحتوي مصفوفة containerLayers على XrSpatialContainerLayerEXT لكل حاوية مكانية في مجموعة العرض النشطة (الحاويات التي تتم إدارتها لكل جلسة من خلال xrBeginSpatialContainerRenderingEXT وxrEndSpatialContainerRenderingEXT). تحتوي كل XrSpatialContainerLayerEXT على قائمة بمؤشرات XrCompositionLayerBaseHeader المرتبطة بالحاوية المكانية المحدّدة. يمكن لبيئات التشغيل دمج الحاويات بأي ترتيب تختاره، بغض النظر عن ترتيب containerLayers . على سبيل المثال، قد تدمج بيئات التشغيل الحاويات استنادًا إلى عمقها بالنسبة إلى المستخدم، أو تجعل حاوية مكانية تعمل كطبقة خلفية، أو "تثبّت" حاوية مكانية بحيث تكون دائمًا في الأعلى بغض النظر عن عمقها. قد تدمج بيئات التشغيل الطبقات باستخدام استراتيجيات مختلفة للحاويات المكانية في الوضعَين المحدود أو المجسم. على سبيل المثال، قد تدمج بيئات التشغيل مسبقًا طبقات تركيب كل حاوية مكانية محدودة في طبقة رباعية مجسّمة واحدة يتم دمجها مع جميع الحاويات الأخرى في خطوة تركيب ثانية.

سيتم تطبيق XrFrameEndInfo :: displayTime وXrFrameEndInfo :: environmentBlendMode على جميع الحاويات المكانية المتوفّرة في XrSpatialContainerLayerFrameEndInfoEXT .

عند تمرير هذه البنية إلى xrEndFrame من خلال ربطها بـ XrFrameEndInfo، تتم إضافة حالات الخطأ الإضافية التالية استنادًا إلى مجموعة العرض النشطة:

  • إذا تمت الإشارة إلى حاوية مكانية من خلال أكثر من عنصر واحد من containerLayers، يجب أن تعرض بيئات التشغيل XR_ERROR_SPATIAL_CONTAINER_DUPLICATE_EXT .
  • إذا لم تتم الإشارة إلى حاوية مكانية في مجموعة العرض النشطة من خلال عنصر من containerLayers، يجب أن تعرض بيئات التشغيل XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT .
  • إذا لم تكن الحاوية المكانية التي تشير إليها السمة containerLayers عضوًا في مجموعة العرض النشطة، يجب أن تعرض بيئات التشغيل القيمة XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT .

Furthermore, if there are any spatial containers in the active render set and this structure is not chained onto XrFrameEndInfo , runtimes must return XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT .

في أي من حالات الخطأ المذكورة أعلاه، يجب ألا يعرض وقت التشغيل أي محتوى لأي حاوية مكانية.

إذا لم تكن هناك حاويات مكانية في مجموعة العرض النشطة، يمكن للتطبيق استدعاء xrEndFrame طالما أنّه لا يرسل أي طبقات تركيب.

يُرجى العِلم أنّه يمكن إرسال سلاسل تبديل فردية إلى حاويات متعددة من خلال طبقات في بنية صالحة، مثل طبقة رباعية يتم عرضها من خلال سلسلة تبديل واحدة يتم إرسالها إلى حاويات مكانية متعددة. يتم التعامل مع هذه الحالة بشكل موحّد مع عمليات العرض الأخرى: يجب أن يعرض وقت التشغيل الرباعي في جميع هذه الحاويات المكانية.

الاستخدام الصالح (ضمني)

تجمع بنية XrSpatialContainerLayerEXT طبقات التركيب العادية وتربطها بحاوية مكانية معيّنة.

typedef struct XrSpatialContainerLayerEXT {
    XrStructureType                               type;
    const void*                                   next;
    XrSpatialContainerEXT                         spatialContainer;
    XrBool32                                      retainPreviousSubmission;
    uint32_t                                      layerCount;
    const XrCompositionLayerBaseHeader* const*    layers;
} XrSpatialContainerLayerEXT;

وصف العضو

  • ‫type هو XrStructureType لهذه البنية.
  • ‫next هو NULL أو مؤشر إلى البنية التالية في سلسلة البنى.
  • ‫spatialContainer هي السمة XrSpatialContainerEXT التي تحدّد الحاوية المستهدَفة.
  • ‫"retainPreviousSubmission" هو XrBool32 . إذا كانت القيمة XR_TRUE، سيحتفظ وقت التشغيل بآخر إطار تم إرساله لهذه الحاوية المكانية.
  • ‫layerCount هو عدد طبقات التركيب في مصفوفة layers.
  • ‫layers هو مؤشر إلى مصفوفة من مؤشرات XrCompositionLayerBaseHeader.

عندما تكون قيمة retainPreviousSubmission هي XR_TRUE، يجب أن يعيد وقت التشغيل استخدام طبقات التركيب ومحتوى صورة سلسلة التبديل كما تم تثبيتها خلال آخر طلب xrEndFrame حيث كانت قيمة retainPreviousSubmission هي XR_FALSE . يجب ألا تظهر أي تعديلات لاحقة على سلاسل التبديل التي تستخدمها الطبقات المحفوظة في الناتج المعروض.

بالنسبة إلى الطبقات التي يتم إرسالها لحاوية مكانية فردية (العرض داخل الحاوية)، يجب أن يتّبع وقت التشغيل القواعد المحدّدة مسبقًا لترتيب تركيب الطبقات. وهذا يعني أنّه يجب رسم الطبقات داخل الحاويات بالترتيب نفسه المحدّد لها، ويتم إنشاؤها من خلال خوارزمية الرسام.

يشير "محو" حاوية مكانية إلى إزالة كل المحتوى من حاوية مكانية، ما يؤدي إلى عدم عرض أي محتوى لتلك الحاوية في الإطار الحالي. يجب أن تتعامل بيئات التشغيل مع هذا الإجراء على أنّه يعادل إرسال التطبيق للون أسود شفاف (جميع وحدات البت 0) لكل بكسل داخل الحاوية. يشير مصطلح "الاحتفاظ" بحاوية مكانية إلى استمرار وقت التشغيل في عرض أحدث مجموعة من الطبقات التي تم إرسالها لتلك الحاوية.

بالنسبة إلى كل حاوية مكانية، يمكن للتطبيق تحديد ما إذا كان سيتم إرسال طبقات جديدة أو الاحتفاظ بالإرسال السابق أو محو الحاوية المكانية:

  • لإرسال طبقات جديدة، يوفّر التطبيق قيمة layerCount غير صفرية ومؤشر layers صالحًا.
  • لمحو حاوية مكانية، يجب أن تكون قيمة layerCount لإدخالها 0 ويجب أن تكون قيمة retainPreviousSubmission هي XR_FALSE .
  • للاحتفاظ بآخر الطبقات وصور swapchain التي تم إرسالها (الاحتفاظ)، يجب أن تكون قيمة layerCount لإدخالها 0 ويجب أن تكون قيمة retainPreviousSubmission هي XR_TRUE .

يضمن عنصر التحكّم الصريح هذا لكل حاوية أن يتم توصيل هدف التطبيق بوضوح في كل إطار.

إذا كانت قيمة retainPreviousSubmission هي XR_TRUE وقيمة layerCount ليست 0، يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE .

إذا لم تكن السمة XrSpatialContainerCompositionLayerViewConfigurationEXT مرتبطة بالسمة XrCompositionLayerProjection التي تشكّل جزءًا من حاوية مكانية، يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE . لا تنطبق هذه البنية إلا على طبقات XrCompositionLayerProjection. إذا كانت مرتبطة بأنواع طبقات أخرى (مثل طبقات رباعية أو أسطوانية)، يجب أن يعرض وقت التشغيل XR_ERROR_VALIDATION_FAILURE .

الاستخدام الصالح (ضمني)

تحديد إعدادات العرض لطبقات العرض

تُستخدَم بنية XrSpatialContainerCompositionLayerViewConfigurationEXT لتحديد إعدادات العرض المستخدَمة لعرض طبقة إسقاط لحاوية مكانية.

typedef struct XrSpatialContainerCompositionLayerViewConfigurationEXT {
    XrStructureType            type;
    const void*                next;
    XrViewConfigurationType    viewConfigurationType;
} XrSpatialContainerCompositionLayerViewConfigurationEXT;

وصف العضو

عند إرسال XrCompositionLayerProjection لحاوية مكانية، يجب أن يحدّد التطبيق إعدادات العرض التي تم استخدامها لعرض الطبقة. هذا الإجراء ضروري لأنّ التطبيق يمكنه اختيار ما إذا كان سيتم عرض كل إطار باستخدام إعدادات العرض الأساسية للحاوية المكانية أو إعدادات العرض المنخفضة المقترَحة من وقت التشغيل، إن توفّرت.

عند ربط XrSpatialContainerCompositionLayerViewConfigurationEXT، يجب أن يتأكّد التطبيق من أنّ XrCompositionLayerProjection :: viewCount هو عدد مشاهدات صالح لـ XrViewConfigurationType المحدّد في البنية المرتبطة. يجب أن يكون viewConfigurationType المحدّد في البنية المتسلسلة هو XrSpatialContainerBeginInfoEXT :: primaryViewConfigurationType المحدّد عند بدء الحاوية، أو نوع إعدادات العرض المتدهورة التي يعرضها وقت التشغيل في XrSpatialContainerViewStateEXT، أو القيم الإضافية التي تم تفعيلها من خلال إضافة.

الاستخدام الصالح (ضمني)

سلوك اقتصاص وحدات البكسل

يجب أن تُعلم التطبيقات بيئة التشغيل بما إذا كانت تعرض وحدات بكسل خارج حدود الحاوية المكانية أم لا، وذلك من خلال ربط XrSpatialContainerLayerVolumeClippingEXT عند إرسال طبقات التركيب.

typedef struct XrSpatialContainerLayerVolumeClippingEXT {
    XrStructureType                        type;
    const void*                            next;
    XrSpatialContainerVolumeClippingEXT    volumeClipping;
} XrSpatialContainerLayerVolumeClippingEXT;

وصف العضو

تُعدّ هذه البنية تلميحًا لما إذا كان التطبيق يعرض وحدات بكسل خارج حدود حاوية مكانية. عندما تكون الحاوية المكانية في وضع مجسم، لا يكون لهذا التلميح أي معنى لأنّ الحدود لا نهائية.

بالنسبة إلى الحاويات المكانية المحدودة التي تستخدم العرض الذاتي، يحتاج وقت التشغيل إلى التفكير في كل من حدود الحجم الثلاثي الأبعاد وحدود وحدات البكسل الثنائية الأبعاد. يتم عرض حدود مستوى الصوت الثلاثي الأبعاد من xrGetSpatialContainerBoundsEXT . حدود وحدات البكسل الثنائية الأبعاد هي إسقاط حدود الحجم الثلاثي الأبعاد على كل شاشة للنظام.

يجب أن تتجاهل بيئات التشغيل وحدات البكسل من صور سلسلة التبديل خارج حدود البكسل الثنائية الأبعاد، ولكن يجب ألا تتجاهل بيئات التشغيل وحدات البكسل التي تقع داخل حدود البكسل الثنائية الأبعاد ولكن خارج حدود الحجم الثلاثية الأبعاد. يمكن استخدام تأثيرات الاستيريو التي يظهر فيها المحتوى وكأنّه يمتد إلى ما وراء حدود الحجم الثلاثي الأبعاد للحاوية أو أمامها. يمكن للتطبيقات تجاهل وحدات البكسل خارج حدود الحجم الثلاثي الأبعاد للحاوية المكانية المحدودة لتقليل مفارقات العمق، ويجب ضبط volumeClipping بناءً على كيفية إجراء ذلك، لأنّ مفارقات العمق غالبًا ما تسبّب إجهادًا للعين وعدم راحة للمستخدم.

قد تستخدم بيئات التشغيل السمة volumeClipping لتعديل طريقة عرض حاوية مكانية معيّنة. على سبيل المثال، عند ضبطه على XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT، يمكن أن يعرض وقت التشغيل الوجوه الخلفية لحدود الحجم الثلاثي الأبعاد التي قد تسبّب مفارقات في العمق إذا رسمت الحاوية المكانية وحدات بكسل خلف حدود الحجم الثلاثي الأبعاد للحاوية.

قد تسمح الإضافات المستقبلية بالاقتصاص استنادًا إلى حدود الحجم الثلاثي الأبعاد في حال إرسال معلومات العمق.

الاستخدام الصالح (ضمني)

الأوامر الجديدة

منشآت جديدة

ثوابت تعداد جديدة

  • XR_EXT_SPATIAL_CONTAINER_SELF_RENDERING_EXTENSION_NAME
  • XR_EXT_spatial_container_self_rendering_SPEC_VERSION
  • توسيع XrResult :

    • XR_ERROR_SPATIAL_CONTAINER_DUPLICATE_EXT
    • XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT
    • XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT
    • XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT
    • XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT
  • توسيع XrSpatialContainerGraphicsPresentationEXT :

    • XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
  • توسيع XrStructureType :

    • XR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_COMPOSITION_LAYER_VIEW_CONFIGURATION_EXT
    • XR_TYPE_SPATIAL_CONTAINER_END_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_LAYER_EXT
    • XR_TYPE_SPATIAL_CONTAINER_LAYER_FRAME_END_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXT
    • XR_TYPE_SPATIAL_CONTAINER_VIEWS_LOCATE_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_VIEW_LOCATE_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_VIEW_STATE_EXT

تعليمات برمجية نموذجية

// Example: Complete lifecycle, view location, and frame submission for spatial containers
PFN_xrBeginSpatialContainerRenderingEXT xrBeginSpatialContainerRenderingEXT; // previously initialized
PFN_xrEndSpatialContainerRenderingEXT xrEndSpatialContainerRenderingEXT; // previously initialized
PFN_xrLocateSpatialContainerViewsEXT xrLocateSpatialContainerViewsEXT; // previously initialized

XrSession session; // previously initialized

// We want to update this container
XrSpatialContainerEXT containerA; // previously initialized with XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
XrSpace containerASpace; // previously initialized

// We want to retain this container
XrSpatialContainerEXT containerB; // previously initialized with XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
XrSpace containerBSpace; // previously initialized

// 1. Add to active render set when the app is ready to start submitting layers
XrSpatialContainerBeginInfoEXT beginInfoA {
  .type = XR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXT,
  .spatialContainer = containerA,
  .primaryViewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
};
CHK_XR(xrBeginSpatialContainerRenderingEXT(session, &beginInfoA));

XrSpatialContainerBeginInfoEXT beginInfoB {
  .type = XR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXT,
  .spatialContainer = containerB,
  .primaryViewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
};
CHK_XR(xrBeginSpatialContainerRenderingEXT(session, &beginInfoB));

// ... Frame Loop ...


XrTime displayTime; // returned from xrWaitFrame

const std::vector<XrSpatialContainerEXT> containers = {containerA, containerB};
const std::vector<XrSpace> containerSpaces = {containerASpace, containerBSpace};
uint32_t containerCount = static_cast<uint32_t>(containers.size());

// 2. Setup individual locate info for each container
std::vector<XrSpatialContainerViewLocateInfoEXT> containerLocateInfos(containerCount, {
  .type = XR_TYPE_SPATIAL_CONTAINER_VIEW_LOCATE_INFO_EXT,
});

for (uint32_t i = 0; i < containerCount; ++i) {
    containerLocateInfos[i].viewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
    containerLocateInfos[i].space = containerSpaces[i]; // Recommended to use container's own space
    containerLocateInfos[i].spatialContainer = containers[i];
}

// Setup bulk locate info
XrSpatialContainerViewsLocateInfoEXT locateInfo {
  .type = XR_TYPE_SPATIAL_CONTAINER_VIEWS_LOCATE_INFO_EXT,
  .displayTime = displayTime,
  .viewLocateInfoCount = containerCount,
  .viewLocateInfos = containerLocateInfos.data(),
};

// Prepare states to be populated by the runtime
std::vector<XrSpatialContainerViewStateEXT> viewStates(containerCount, {
  .type = XR_TYPE_SPATIAL_CONTAINER_VIEW_STATE_EXT,
});

// Call the dedicated locate views function
// We know the required view count is 2 per container for STEREO
const uint32_t viewsPerConfig = 2;
uint32_t totalViewCount = containerCount * viewsPerConfig;
std::vector<XrView> views(totalViewCount, {.type = XR_TYPE_VIEW});

CHK_XR(xrLocateSpatialContainerViewsEXT(session, &locateInfo, containerCount, viewStates.data(), totalViewCount, views.data()));

// Process results
for (uint32_t i = 0; i < containerCount; ++i) {
    XrBool32 shouldSubmitLayers = viewStates[i].shouldSubmitLayers;
    XrExtent2Di recommendedImageExtent = viewStates[i].recommendedImageExtent;
    XrViewConfigurationType viewConfigurationType = viewStates[i].viewConfigurationType;
    bool isDecayedToMono = (viewConfigurationType == XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO);
    if (shouldSubmitLayers) {
        // App is expected to also verify viewStates[i].viewStateFlags has valid orientation/position bits before rendering
        XrView& leftView = views[i * viewsPerConfig];
        XrView& rightView = views[i * viewsPerConfig + 1];
        // If isDecayedToMono is true, left and right will be identical.
    } else {
        // Skip layer submission but retain previous submission when calling
        // xrEndFrame.
    }
}

// 3. Setup projection layer for container A
XrCompositionLayerProjection projectionLayer = {.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION};
// ... standard projection layer setup (space, viewCount, views, etc.) ...

// Specify which view configuration was used to render this specific layer
XrSpatialContainerCompositionLayerViewConfigurationEXT containerViewConfig {
  .type = XR_TYPE_SPATIAL_CONTAINER_COMPOSITION_LAYER_VIEW_CONFIGURATION_EXT,
  // Even if the runtime decayed to MONO, we indicate what we actually rendered
  .viewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
};

// Chain it to the projection layer
projectionLayer.next = &containerViewConfig;
const XrCompositionLayerBaseHeader* layersA[1] = {reinterpret_cast<const XrCompositionLayerBaseHeader*>(&projectionLayer)};

// Note: In a real app, you are required to submit ALL active containers in the render set.

XrSpatialContainerLayerVolumeClippingEXT containerClippingA = {
  .type = XR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXT,
  // Set volumeClipping appropriately for the rendering done.
  .volumeClipping = XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT,
};

// Setup container A (Update with new pixels)
XrSpatialContainerLayerEXT containerLayerA {
  .type = XR_TYPE_SPATIAL_CONTAINER_LAYER_EXT,
  .next = &containerClippingA,
  .spatialContainer = containerA,
  .retainPreviousSubmission = XR_FALSE,
  .layerCount = 1,
  .layers = layersA,
};

XrSpatialContainerLayerVolumeClippingEXT containerClippingB {
  .type = XR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXT,
  // Set volumeClipping appropriately for the rendering done.
  .volumeClipping = XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT,
};

// Setup container B (Explicitly retain previous frame)
XrSpatialContainerLayerEXT containerLayerB {
  .type = XR_TYPE_SPATIAL_CONTAINER_LAYER_EXT,
  .next = &containerClippingB,
  .spatialContainer = containerB,
  .retainPreviousSubmission = XR_TRUE,
  .layerCount = 0, // Required to be 0 when retaining
  .layers = nullptr,
};

// Aggregate all container layers
XrSpatialContainerLayerEXT containerLayers[] = { containerLayerA, containerLayerB };

XrSpatialContainerLayerFrameEndInfoEXT spatialEndInfo {
  .type = XR_TYPE_SPATIAL_CONTAINER_LAYER_FRAME_END_INFO_EXT,
  .containerLayerCount = 2, // Must equal the number of active containers
  .containerLayers = containerLayers,
};

XrFrameEndInfo frameEndInfo {
  .type = XR_TYPE_FRAME_END_INFO,
  .next = &spatialEndInfo,
  .displayTime = displayTime,
  .environmentBlendMode = XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND,
  .layerCount = 0, // MANDATORY: Must be 0 for self rendering extension
};

CHK_XR(xrEndFrame(session, &frameEndInfo));

// ... End Frame Loop ...

// 4. Remove from active render set when the container is destroyed or no longer needs rendering
XrSpatialContainerEndInfoEXT endInfoA {
  .type = XR_TYPE_SPATIAL_CONTAINER_END_INFO_EXT,
  .spatialContainer = containerA,
};
CHK_XR(xrEndSpatialContainerRenderingEXT(session, &endInfoA));

XrSpatialContainerEndInfoEXT endInfoB {
  .type = XR_TYPE_SPATIAL_CONTAINER_END_INFO_EXT,
  .spatialContainer = containerB,
};
CHK_XR(xrEndSpatialContainerRenderingEXT(session, &endInfoB));

سجلّ الإصدارات

  • المراجعة 1، ‏06-08-2026 (لاكلان فورد)

    • الوصف الأولي للإضافة