diff --git a/selfdrive/ui/onroad/cameraview.py b/selfdrive/ui/onroad/cameraview.py index 47c91260d..b1e7a871d 100644 --- a/selfdrive/ui/onroad/cameraview.py +++ b/selfdrive/ui/onroad/cameraview.py @@ -174,10 +174,6 @@ class CameraView(Widget): self.texture_y: rl.Texture | None = None self.texture_uv: rl.Texture | None = None - self._camera_render_texture = None - self._camera_render_texture_size = (0, 0) - self._camera_render_key = None - # EGL resources self.egl_images: dict[int, EGLImage] = {} self.egl_texture: rl.Texture | None = None @@ -222,7 +218,6 @@ class CameraView(Widget): self._regressive_frame_count = 0 self.available_streams.clear() self._texture_needs_update = True - self._camera_render_key = None self.last_connection_attempt = 0.0 self._last_stream_discovery = -float("inf") self._last_switch_request = -float("inf") @@ -302,7 +297,6 @@ class CameraView(Widget): self._last_frame_id = -1 self._regressive_frame_count = 0 self._texture_needs_update = True - self._camera_render_key = None self._reentry_stream_selected = True @property @@ -331,7 +325,6 @@ class CameraView(Widget): self.available_streams.clear() self._onroad_reentry_pending = False self._reentry_stream_selected = False - self._release_camera_render_texture() def __del__(self): self.close() @@ -376,7 +369,6 @@ class CameraView(Widget): elif not self.client.is_connected(): # ensure we clear the displayed frame when the connection is lost self.frame = None - self._camera_render_key = None if not self.frame: self._draw_placeholder(rect) @@ -401,12 +393,6 @@ class CameraView(Widget): dst_rect = rl.Rectangle(x_offset, y_offset, scale_x, scale_y) - if TICI: - self._render_cached_camera(rect, src_rect, dst_rect, transform) - else: - self._render_current_frame(src_rect, dst_rect) - - def _render_current_frame(self, src_rect: rl.Rectangle, dst_rect: rl.Rectangle) -> None: if self._use_egl: try: rendered = self._render_egl(src_rect, dst_rect) @@ -419,75 +405,6 @@ class CameraView(Widget): if not self._use_egl: self._render_textures(src_rect, dst_rect) - def _render_cached_camera(self, rect: rl.Rectangle, src_rect: rl.Rectangle, - dst_rect: rl.Rectangle, transform: np.ndarray) -> None: - size = (max(1, int(round(rect.width))), max(1, int(round(rect.height)))) - if self._camera_render_texture is None or self._camera_render_texture_size != size: - self._release_camera_render_texture() - try: - self._camera_render_texture = rl.load_render_texture(*size) - except Exception: - cloudlog.exception("CameraView failed to create camera render texture") - self._camera_render_texture = None - self._camera_render_texture_size = size - self._camera_render_key = None - - if (self._camera_render_texture is None or - not getattr(self._camera_render_texture.texture, "id", 0)): - self._render_current_frame(src_rect, dst_rect) - return - - frame_id = int(getattr(self.frame, "frame_id", -1)) - transform_key = tuple(round(float(value), 5) for value in transform.flat) - cache_key = (frame_id, self._stream_type, size, transform_key, self._use_egl) - if cache_key != self._camera_render_key: - local_dst = rl.Rectangle( - dst_rect.x - rect.x, - dst_rect.y - rect.y, - dst_rect.width, - dst_rect.height, - ) - scissor = (int(rect.x), int(rect.y), int(rect.width), int(rect.height)) - rl.end_scissor_mode() - rendered_to_cache = False - texture_mode_started = False - try: - rl.begin_texture_mode(self._camera_render_texture) - texture_mode_started = True - try: - rl.clear_background(rl.BLACK) - self._render_current_frame(src_rect, local_dst) - finally: - if texture_mode_started: - rl.end_texture_mode() - rendered_to_cache = True - except Exception: - cloudlog.exception("CameraView failed to render cached camera frame") - self._release_camera_render_texture() - finally: - rl.begin_scissor_mode(*scissor) - if not rendered_to_cache: - self._render_current_frame(src_rect, dst_rect) - return - self._camera_render_key = cache_key - - if self._camera_render_texture is None: - return - - source = rl.Rectangle(0, 0, float(size[0]), -float(size[1])) - rl.draw_texture_pro(self._camera_render_texture.texture, source, rect, - rl.Vector2(0, 0), 0.0, rl.WHITE) - - def _release_camera_render_texture(self) -> None: - if self._camera_render_texture is not None: - try: - rl.unload_render_texture(self._camera_render_texture) - except Exception: - cloudlog.exception("CameraView failed to release camera render texture") - self._camera_render_texture = None - self._camera_render_texture_size = (0, 0) - self._camera_render_key = None - def _draw_placeholder(self, rect: rl.Rectangle): if self._placeholder_color: rl.draw_rectangle_rec(rect, self._placeholder_color) @@ -538,7 +455,6 @@ class CameraView(Widget): self._texture_needs_update = True self._onroad_reentry_pending = False self._reentry_stream_selected = False - self._camera_render_key = None return True def _render_egl(self, src_rect: rl.Rectangle, dst_rect: rl.Rectangle) -> bool: @@ -572,7 +488,6 @@ class CameraView(Widget): cloudlog.error(f"CameraView switching from EGL to texture rendering: {reason}") self._use_egl = False - self._camera_render_key = None try: self._clear_textures() except Exception: @@ -703,7 +618,6 @@ class CameraView(Widget): self._texture_needs_update = True self._onroad_reentry_pending = False self._reentry_stream_selected = False - self._camera_render_key = None # Initialize textures for new stream self._initialize_textures() diff --git a/selfdrive/ui/tests/test_camera_frame_order.py b/selfdrive/ui/tests/test_camera_frame_order.py index bde83c32a..e4217ff3b 100644 --- a/selfdrive/ui/tests/test_camera_frame_order.py +++ b/selfdrive/ui/tests/test_camera_frame_order.py @@ -1,6 +1,4 @@ from types import SimpleNamespace - -import numpy as np import pytest from openpilot.selfdrive.ui.mici.onroad import cameraview as mici_cameraview @@ -168,41 +166,6 @@ def test_newer_camera_frame_is_accepted(): assert view._texture_needs_update -def test_device_camera_render_cache_reuses_processed_frame(monkeypatch): - view = _camera_view() - view._camera_render_texture = None - view._camera_render_texture_size = (0, 0) - view._camera_render_key = None - view._use_egl = True - view.frame = FakeFrame(frame_id=10, idx=0) - - render_texture = SimpleNamespace(texture=SimpleNamespace(id=1)) - processed_frames = [] - draws = [] - - monkeypatch.setattr(big_cameraview, "TICI", True) - monkeypatch.setattr(big_cameraview.rl, "load_render_texture", lambda *_size: render_texture) - monkeypatch.setattr(big_cameraview.rl, "unload_render_texture", lambda _texture: None) - monkeypatch.setattr(big_cameraview.rl, "begin_texture_mode", lambda _texture: None) - monkeypatch.setattr(big_cameraview.rl, "end_texture_mode", lambda: None) - monkeypatch.setattr(big_cameraview.rl, "clear_background", lambda _color: None) - monkeypatch.setattr(big_cameraview.rl, "end_scissor_mode", lambda: None) - monkeypatch.setattr(big_cameraview.rl, "begin_scissor_mode", lambda *_args: None) - monkeypatch.setattr(big_cameraview.rl, "draw_texture_pro", lambda *_args: draws.append(1)) - view._render_current_frame = lambda *_args: processed_frames.append(1) - - rect = big_cameraview.rl.Rectangle(10, 20, 100, 80) - src = big_cameraview.rl.Rectangle(0, 0, 1928, 1208) - dst = big_cameraview.rl.Rectangle(0, 0, 100, 80) - transform = np.eye(3) - - view._render_cached_camera(rect, src, dst, transform) - view._render_cached_camera(rect, src, dst, transform) - - assert processed_frames == [1] - assert draws == [1, 1] - - def test_shared_camera_has_upstream_shaders_and_driver_enhancement(): assert "samplerExternalOES" in big_cameraview.FRAME_FRAGMENT_SHADER_EXTERNAL assert "pow(color.rgb, vec3(1.0/1.28))" in big_cameraview.FRAME_FRAGMENT_SHADER_EXTERNAL