Merge pull request #100282 from devloglogan/motion-vectors-openxr

Add renderer motion vectors API for use with OpenXR
This commit is contained in:
Thaddeus Crews 2024-12-12 16:13:36 -06:00
commit bfc66f0608
No known key found for this signature in database
GPG key ID: 62181B86FE9E5D84
25 changed files with 429 additions and 12 deletions

View file

@ -1942,6 +1942,9 @@ bool OpenXRAPI::get_view_projection(uint32_t p_view, double p_z_near, double p_z
}
}
render_state.z_near = p_z_near;
render_state.z_far = p_z_far;
// now update our projection
return graphics_extension->create_projection_fov(render_state.views[p_view].fov, p_z_near, p_z_far, p_camera_matrix);
}
@ -2369,6 +2372,30 @@ RID OpenXRAPI::get_depth_texture() {
}
}
void OpenXRAPI::set_velocity_texture(RID p_render_target) {
velocity_texture = p_render_target;
}
RID OpenXRAPI::get_velocity_texture() {
return velocity_texture;
}
void OpenXRAPI::set_velocity_depth_texture(RID p_render_target) {
velocity_depth_texture = p_render_target;
}
RID OpenXRAPI::get_velocity_depth_texture() {
return velocity_depth_texture;
}
void OpenXRAPI::set_velocity_target_size(const Size2i &p_target_size) {
velocity_target_size = p_target_size;
}
Size2i OpenXRAPI::get_velocity_target_size() {
return velocity_target_size;
}
void OpenXRAPI::post_draw_viewport(RID p_render_target) {
// Must be called from rendering thread!
ERR_NOT_ON_RENDER_THREAD;
@ -2474,6 +2501,20 @@ void OpenXRAPI::end_frame() {
render_state.view_count, // viewCount
render_state.projection_views, // views
};
if (projection_views_extensions.size() > 0) {
for (uint32_t v = 0; v < render_state.view_count; v++) {
void *next_pointer = nullptr;
for (OpenXRExtensionWrapper *wrapper : projection_views_extensions) {
void *np = wrapper->set_projection_views_and_get_next_pointer(v, next_pointer);
if (np != nullptr) {
next_pointer = np;
}
}
render_state.projection_views[v].next = next_pointer;
}
}
ordered_layers_list.push_back({ (const XrCompositionLayerBaseHeader *)&projection_layer, 0 });
// Sort our layers.
@ -2604,6 +2645,14 @@ Size2 OpenXRAPI::get_play_space_bounds() const {
return ret;
}
PackedInt64Array OpenXRAPI::get_supported_swapchain_formats() {
PackedInt64Array supported_swapchain_list;
for (uint32_t i = 0; i < num_swapchain_formats; i++) {
supported_swapchain_list.push_back(supported_swapchain_formats[i]);
}
return supported_swapchain_list;
}
OpenXRAPI::OpenXRAPI() {
// OpenXRAPI is only constructed if OpenXR is enabled.
singleton = this;
@ -3607,6 +3656,14 @@ void OpenXRAPI::unregister_composition_layer_provider(OpenXRCompositionLayerProv
composition_layer_providers.erase(provider);
}
void OpenXRAPI::register_projection_views_extension(OpenXRExtensionWrapper *p_extension) {
projection_views_extensions.append(p_extension);
}
void OpenXRAPI::unregister_projection_views_extension(OpenXRExtensionWrapper *p_extension) {
projection_views_extensions.erase(p_extension);
}
const XrEnvironmentBlendMode *OpenXRAPI::get_supported_environment_blend_modes(uint32_t &count) {
count = num_supported_environment_blend_modes;
return supported_environment_blend_modes;