You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-18 14:21:41 +00:00
Renderer agnostic motion vector rendering/OpenXR changes
This commit is contained in:
@@ -200,12 +200,16 @@ public:
|
||||
virtual void render_target_set_vrs_texture(RID p_render_target, RID p_texture) override {}
|
||||
virtual RID render_target_get_vrs_texture(RID p_render_target) const override { return RID(); }
|
||||
|
||||
virtual void render_target_set_override(RID p_render_target, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture) override {}
|
||||
virtual void render_target_set_override(RID p_render_target, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture, RID p_velocity_depth_texture) override {}
|
||||
virtual RID render_target_get_override_color(RID p_render_target) const override { return RID(); }
|
||||
virtual RID render_target_get_override_depth(RID p_render_target) const override { return RID(); }
|
||||
virtual RID render_target_get_override_velocity(RID p_render_target) const override { return RID(); }
|
||||
virtual RID render_target_get_override_velocity_depth(RID p_render_target) const override { return RID(); }
|
||||
|
||||
virtual RID render_target_get_texture(RID p_render_target) override { return RID(); }
|
||||
|
||||
virtual void render_target_set_velocity_target_size(RID p_render_target, const Size2i &p_target_size) override {}
|
||||
virtual Size2i render_target_get_velocity_target_size(RID p_render_target) const override { return Size2i(0, 0); }
|
||||
};
|
||||
|
||||
} // namespace RendererDummy
|
||||
|
||||
@@ -3436,7 +3436,7 @@ RID TextureStorage::render_target_get_texture(RID p_render_target) {
|
||||
return rt->texture;
|
||||
}
|
||||
|
||||
void TextureStorage::render_target_set_override(RID p_render_target, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture) {
|
||||
void TextureStorage::render_target_set_override(RID p_render_target, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture, RID p_velocity_depth_texture) {
|
||||
RenderTarget *rt = render_target_owner.get_or_null(p_render_target);
|
||||
ERR_FAIL_NULL(rt);
|
||||
|
||||
|
||||
@@ -779,15 +779,19 @@ public:
|
||||
virtual void render_target_set_vrs_texture(RID p_render_target, RID p_texture) override;
|
||||
virtual RID render_target_get_vrs_texture(RID p_render_target) const override;
|
||||
|
||||
virtual void render_target_set_override(RID p_render_target, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture) override;
|
||||
virtual void render_target_set_override(RID p_render_target, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture, RID p_velocity_depth_texture) override;
|
||||
virtual RID render_target_get_override_color(RID p_render_target) const override;
|
||||
virtual RID render_target_get_override_depth(RID p_render_target) const override;
|
||||
RID render_target_get_override_depth_slice(RID p_render_target, const uint32_t p_layer) const;
|
||||
virtual RID render_target_get_override_velocity(RID p_render_target) const override;
|
||||
RID render_target_get_override_velocity_slice(RID p_render_target, const uint32_t p_layer) const;
|
||||
virtual RID render_target_get_override_velocity_depth(RID p_render_target) const override { return RID(); }
|
||||
|
||||
virtual RID render_target_get_texture(RID p_render_target) override;
|
||||
|
||||
virtual void render_target_set_velocity_target_size(RID p_render_target, const Size2i &p_target_size) override {}
|
||||
virtual Size2i render_target_get_velocity_target_size(RID p_render_target) const override { return Size2i(0, 0); }
|
||||
|
||||
RID render_target_get_rd_framebuffer(RID p_render_target);
|
||||
RID render_target_get_rd_texture(RID p_render_target);
|
||||
RID render_target_get_rd_texture_slice(RID p_render_target, uint32_t p_layer);
|
||||
|
||||
@@ -789,7 +789,16 @@ void RendererViewport::draw_viewports(bool p_swap_buffers) {
|
||||
RSG::texture_storage->render_target_set_override(vp->render_target,
|
||||
xr_interface->get_color_texture(),
|
||||
xr_interface->get_depth_texture(),
|
||||
xr_interface->get_velocity_texture());
|
||||
xr_interface->get_velocity_texture(),
|
||||
xr_interface->get_velocity_depth_texture());
|
||||
|
||||
RSG::texture_storage->render_target_set_velocity_target_size(vp->render_target, xr_interface->get_velocity_target_size());
|
||||
|
||||
if (xr_interface->get_velocity_texture().is_valid()) {
|
||||
viewport_set_force_motion_vectors(vp->self, true);
|
||||
} else {
|
||||
viewport_set_force_motion_vectors(vp->self, false);
|
||||
}
|
||||
|
||||
// render...
|
||||
RSG::scene->set_debug_draw_mode(vp->debug_draw);
|
||||
@@ -990,7 +999,7 @@ void RendererViewport::_viewport_set_size(Viewport *p_viewport, int p_width, int
|
||||
}
|
||||
|
||||
bool RendererViewport::_viewport_requires_motion_vectors(Viewport *p_viewport) {
|
||||
return p_viewport->use_taa || p_viewport->scaling_3d_mode == RenderingServer::VIEWPORT_SCALING_3D_MODE_FSR2 || p_viewport->debug_draw == RenderingServer::VIEWPORT_DEBUG_DRAW_MOTION_VECTORS;
|
||||
return p_viewport->use_taa || p_viewport->scaling_3d_mode == RenderingServer::VIEWPORT_SCALING_3D_MODE_FSR2 || p_viewport->debug_draw == RenderingServer::VIEWPORT_DEBUG_DRAW_MOTION_VECTORS || p_viewport->force_motion_vectors;
|
||||
}
|
||||
|
||||
void RendererViewport::viewport_set_active(RID p_viewport, bool p_active) {
|
||||
@@ -1338,6 +1347,25 @@ void RendererViewport::viewport_set_use_debanding(RID p_viewport, bool p_use_deb
|
||||
_configure_3d_render_buffers(viewport);
|
||||
}
|
||||
|
||||
void RendererViewport::viewport_set_force_motion_vectors(RID p_viewport, bool p_force_motion_vectors) {
|
||||
Viewport *viewport = viewport_owner.get_or_null(p_viewport);
|
||||
ERR_FAIL_NULL(viewport);
|
||||
|
||||
if (viewport->force_motion_vectors == p_force_motion_vectors) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool motion_vectors_before = _viewport_requires_motion_vectors(viewport);
|
||||
viewport->force_motion_vectors = p_force_motion_vectors;
|
||||
|
||||
bool motion_vectors_after = _viewport_requires_motion_vectors(viewport);
|
||||
if (motion_vectors_before != motion_vectors_after) {
|
||||
num_viewports_with_motion_vectors += motion_vectors_after ? 1 : -1;
|
||||
}
|
||||
|
||||
_configure_3d_render_buffers(viewport);
|
||||
}
|
||||
|
||||
void RendererViewport::viewport_set_use_occlusion_culling(RID p_viewport, bool p_use_occlusion_culling) {
|
||||
Viewport *viewport = viewport_owner.get_or_null(p_viewport);
|
||||
ERR_FAIL_NULL(viewport);
|
||||
|
||||
@@ -77,6 +77,7 @@ public:
|
||||
RS::ViewportScreenSpaceAA screen_space_aa = RenderingServer::VIEWPORT_SCREEN_SPACE_AA_DISABLED;
|
||||
bool use_taa = false;
|
||||
bool use_debanding = false;
|
||||
bool force_motion_vectors = false;
|
||||
|
||||
RendererSceneRender::CameraData prev_camera_data;
|
||||
uint64_t prev_camera_data_frame = 0;
|
||||
@@ -277,6 +278,7 @@ public:
|
||||
void viewport_set_screen_space_aa(RID p_viewport, RS::ViewportScreenSpaceAA p_mode);
|
||||
void viewport_set_use_taa(RID p_viewport, bool p_use_taa);
|
||||
void viewport_set_use_debanding(RID p_viewport, bool p_use_debanding);
|
||||
void viewport_set_force_motion_vectors(RID p_viewport, bool p_force_motion_vectors);
|
||||
void viewport_set_use_occlusion_culling(RID p_viewport, bool p_use_occlusion_culling);
|
||||
void viewport_set_occlusion_rays_per_thread(int p_rays_per_thread);
|
||||
void viewport_set_occlusion_culling_build_quality(RS::ViewportOcclusionCullingBuildQuality p_quality);
|
||||
|
||||
@@ -724,6 +724,7 @@ public:
|
||||
FUNC2(viewport_set_screen_space_aa, RID, ViewportScreenSpaceAA)
|
||||
FUNC2(viewport_set_use_taa, RID, bool)
|
||||
FUNC2(viewport_set_use_debanding, RID, bool)
|
||||
FUNC2(viewport_set_force_motion_vectors, RID, bool)
|
||||
FUNC2(viewport_set_use_occlusion_culling, RID, bool)
|
||||
FUNC1(viewport_set_occlusion_rays_per_thread, int)
|
||||
FUNC1(viewport_set_occlusion_culling_build_quality, ViewportOcclusionCullingBuildQuality)
|
||||
|
||||
@@ -178,13 +178,18 @@ public:
|
||||
virtual RID render_target_get_vrs_texture(RID p_render_target) const = 0;
|
||||
|
||||
// override color, depth and velocity buffers (depth and velocity only for 3D)
|
||||
virtual void render_target_set_override(RID p_render_target, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture) = 0;
|
||||
virtual void render_target_set_override(RID p_render_target, RID p_color_texture, RID p_depth_texture, RID p_velocity_texture, RID p_velocity_depth_texture) = 0;
|
||||
virtual RID render_target_get_override_color(RID p_render_target) const = 0;
|
||||
virtual RID render_target_get_override_depth(RID p_render_target) const = 0;
|
||||
virtual RID render_target_get_override_velocity(RID p_render_target) const = 0;
|
||||
virtual RID render_target_get_override_velocity_depth(RID p_render_target) const = 0;
|
||||
|
||||
// get textures
|
||||
virtual RID render_target_get_texture(RID p_render_target) = 0;
|
||||
|
||||
// Motion vectors
|
||||
virtual void render_target_set_velocity_target_size(RID p_render_target, const Size2i &p_target_size) = 0;
|
||||
virtual Size2i render_target_get_velocity_target_size(RID p_render_target) const = 0;
|
||||
};
|
||||
|
||||
#endif // TEXTURE_STORAGE_H
|
||||
|
||||
Reference in New Issue
Block a user