Make submitting depth buffer in OpenXR optional
This commit is contained in:
parent
deb760fb1b
commit
484cd90d29
4 changed files with 48 additions and 3 deletions
|
@ -2299,6 +2299,9 @@
|
|||
<member name="xr/openxr/reference_space" type="int" setter="" getter="" default=""1"">
|
||||
Specify the default reference space.
|
||||
</member>
|
||||
<member name="xr/openxr/submit_depth_buffer" type="bool" setter="" getter="" default="false">
|
||||
If [code]true[/code], OpenXR will manage the depth buffer and use the depth buffer for advanced reprojection provided this is supported by the XR runtime. Note that some rendering features in Godot can't be used with this feature.
|
||||
</member>
|
||||
<member name="xr/openxr/view_configuration" type="int" setter="" getter="" default=""1"">
|
||||
Specify the view configuration with which to configure OpenXR setting up either Mono or Stereo rendering.
|
||||
</member>
|
||||
|
|
|
@ -1862,6 +1862,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
|
|||
GLOBAL_DEF_BASIC("xr/openxr/reference_space", "1");
|
||||
ProjectSettings::get_singleton()->set_custom_property_info("xr/openxr/reference_space", PropertyInfo(Variant::INT, "xr/openxr/reference_space", PROPERTY_HINT_ENUM, "Local,Stage"));
|
||||
|
||||
GLOBAL_DEF_BASIC("xr/openxr/submit_depth_buffer", false);
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
// Disabled for now, using XR inside of the editor we'll be working on during the coming months.
|
||||
|
||||
|
|
|
@ -740,9 +740,10 @@ bool OpenXRAPI::create_swapchains() {
|
|||
ERR_FAIL_NULL_V_MSG(projection_views, false, "OpenXR Couldn't allocate memory for projection views");
|
||||
|
||||
// We create our depth swapchain if:
|
||||
// - we've enabled submitting depth buffer
|
||||
// - we support our depth layer extension
|
||||
// - we have our spacewarp extension (not yet implemented)
|
||||
if (OpenXRCompositionLayerDepthExtension::get_singleton()->is_available()) {
|
||||
if (submit_depth_buffer && OpenXRCompositionLayerDepthExtension::get_singleton()->is_available()) {
|
||||
// Build a vector with swapchain formats we want to use, from best fit to worst
|
||||
Vector<int64_t> usable_swapchain_formats;
|
||||
int64_t swapchain_format_to_use = 0;
|
||||
|
@ -790,7 +791,7 @@ bool OpenXRAPI::create_swapchains() {
|
|||
projection_views[i].subImage.imageRect.extent.width = recommended_size.width;
|
||||
projection_views[i].subImage.imageRect.extent.height = recommended_size.height;
|
||||
|
||||
if (OpenXRCompositionLayerDepthExtension::get_singleton()->is_available() && depth_views) {
|
||||
if (submit_depth_buffer && OpenXRCompositionLayerDepthExtension::get_singleton()->is_available() && depth_views) {
|
||||
projection_views[i].next = &depth_views[i];
|
||||
|
||||
depth_views[i].type = XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR;
|
||||
|
@ -1066,6 +1067,30 @@ bool OpenXRAPI::on_state_exiting() {
|
|||
return true;
|
||||
}
|
||||
|
||||
void OpenXRAPI::set_form_factor(XrFormFactor p_form_factor) {
|
||||
ERR_FAIL_COND(is_initialized());
|
||||
|
||||
form_factor = p_form_factor;
|
||||
}
|
||||
|
||||
void OpenXRAPI::set_view_configuration(XrViewConfigurationType p_view_configuration) {
|
||||
ERR_FAIL_COND(is_initialized());
|
||||
|
||||
view_configuration = p_view_configuration;
|
||||
}
|
||||
|
||||
void OpenXRAPI::set_reference_space(XrReferenceSpaceType p_reference_space) {
|
||||
ERR_FAIL_COND(is_initialized());
|
||||
|
||||
reference_space = p_reference_space;
|
||||
}
|
||||
|
||||
void OpenXRAPI::set_submit_depth_buffer(bool p_submit_depth_buffer) {
|
||||
ERR_FAIL_COND(is_initialized());
|
||||
|
||||
submit_depth_buffer = p_submit_depth_buffer;
|
||||
}
|
||||
|
||||
bool OpenXRAPI::is_initialized() {
|
||||
return (instance != XR_NULL_HANDLE);
|
||||
}
|
||||
|
@ -1684,7 +1709,7 @@ RID OpenXRAPI::get_color_texture() {
|
|||
}
|
||||
|
||||
RID OpenXRAPI::get_depth_texture() {
|
||||
if (swapchains[OPENXR_SWAPCHAIN_DEPTH].image_acquired) {
|
||||
if (submit_depth_buffer && swapchains[OPENXR_SWAPCHAIN_DEPTH].image_acquired) {
|
||||
return graphics_extension->get_texture(swapchains[OPENXR_SWAPCHAIN_DEPTH].swapchain_graphics_data, swapchains[OPENXR_SWAPCHAIN_DEPTH].image_index);
|
||||
} else {
|
||||
return RID();
|
||||
|
@ -1862,6 +1887,8 @@ OpenXRAPI::OpenXRAPI() {
|
|||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
submit_depth_buffer = GLOBAL_GET("xr/openxr/submit_depth_buffer");
|
||||
}
|
||||
|
||||
// reset a few things that can't be done in our class definition
|
||||
|
|
|
@ -104,6 +104,7 @@ private:
|
|||
XrViewConfigurationType view_configuration = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
|
||||
XrReferenceSpaceType reference_space = XR_REFERENCE_SPACE_TYPE_STAGE;
|
||||
// XrEnvironmentBlendMode environment_blend_mode = XR_ENVIRONMENT_BLEND_MODE_OPAQUE;
|
||||
bool submit_depth_buffer = false; // if set to true we submit depth buffers to OpenXR if a suitable extension is enabled.
|
||||
|
||||
// state
|
||||
XrInstance instance = XR_NULL_HANDLE;
|
||||
|
@ -312,6 +313,18 @@ public:
|
|||
void set_xr_interface(OpenXRInterface *p_xr_interface);
|
||||
void register_extension_wrapper(OpenXRExtensionWrapper *p_extension_wrapper);
|
||||
|
||||
void set_form_factor(XrFormFactor p_form_factor);
|
||||
XrFormFactor get_form_factor() const { return form_factor; }
|
||||
|
||||
void set_view_configuration(XrViewConfigurationType p_view_configuration);
|
||||
XrViewConfigurationType get_view_configuration() const { return view_configuration; }
|
||||
|
||||
void set_reference_space(XrReferenceSpaceType p_reference_space);
|
||||
XrReferenceSpaceType get_reference_space() const { return reference_space; }
|
||||
|
||||
void set_submit_depth_buffer(bool p_submit_depth_buffer);
|
||||
bool get_submit_depth_buffer() const { return submit_depth_buffer; }
|
||||
|
||||
bool is_initialized();
|
||||
bool is_running();
|
||||
bool initialize(const String &p_rendering_driver);
|
||||
|
|
Loading…
Reference in a new issue