Skip to content

Commit 53b273c

Browse files
committed
fix calling update only when data is invalidated
1 parent f533d81 commit 53b273c

3 files changed

Lines changed: 35 additions & 19 deletions

File tree

ngsolve_webgpu/cf.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ class FunctionData:
211211
order: int
212212
order_3d: int
213213
_timestamp: float = -1
214+
_gpu_dirty: bool = True
214215
minval: list[float]
215216
maxval: list[float]
216217

@@ -257,6 +258,7 @@ def update(self, options: RenderOptions):
257258
self._timestamp = options.timestamp
258259
self.mesh_data.update(options)
259260
self._create_data()
261+
self._gpu_dirty = True
260262

261263
@property
262264
def needs_update(self) -> bool:
@@ -334,19 +336,21 @@ def get_buffers(self, include_mesh_data=True):
334336
buffers = self.mesh_data.get_buffers().copy()
335337
else:
336338
buffers = {}
337-
338339
if self.data_2d is not None:
339-
self.gpu_2d = buffer_from_array(
340-
self.data_2d, label="function_data_2d", reuse=self.gpu_2d
341-
)
340+
if self._gpu_dirty or self.gpu_2d is None:
341+
self.gpu_2d = buffer_from_array(
342+
self.data_2d, label="function_data_2d", reuse=self.gpu_2d
343+
)
342344
buffers["data_2d"] = self.gpu_2d
343345

344346
if self.data_3d is not None:
345-
self.gpu_3d = buffer_from_array(
346-
self.data_3d, label="function_data_3d", reuse=self.gpu_3d
347-
)
347+
if self._gpu_dirty or self.gpu_3d is None:
348+
self.gpu_3d = buffer_from_array(
349+
self.data_3d, label="function_data_3d", reuse=self.gpu_3d
350+
)
348351
buffers["data_3d"] = self.gpu_3d
349-
self._need_gpu_update = False
352+
353+
self._gpu_dirty = False
350354

351355
return buffers
352356

@@ -1093,6 +1097,8 @@ def redraw(self, timestamp=None):
10931097

10941098
def update(self, options: RenderOptions):
10951099
self.options = options
1100+
if not self.needs_update:
1101+
return
10961102
bb = self.mesh.ngmesh.bounding_box
10971103
self.bounding_box = np.array(
10981104
[[bb[0][0], bb[0][1], bb[0][2]], [bb[1][0], bb[1][1], bb[1][2]]]
@@ -1171,6 +1177,9 @@ def update(self, options):
11711177
import numpy as np
11721178
from ngsolve.webgui import FieldLines
11731179

1180+
if not self.needs_update:
1181+
return
1182+
11741183
if self.seed is not None:
11751184
np.random.seed(self.seed)
11761185
data = FieldLines(self.cf, self.start_region, **self.fieldline_options)

ngsolve_webgpu/facet_cf.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,15 @@ def update(self, options: RenderOptions):
194194
self.n_instances = data.n_edges
195195
self.n_vertices = 2 * (self.subdivision + 1)
196196

197-
self._buffers["geometry"] = buffer_from_array(
198-
data.geometry_buffer, label="facet_geometry",
199-
reuse=self._buffers.get("geometry"),
200-
)
201-
self._buffers["values"] = buffer_from_array(
202-
data.function_buffer, label="facet_values",
203-
reuse=self._buffers.get("values"),
204-
)
197+
if self.needs_update or "geometry" not in self._buffers:
198+
self._buffers["geometry"] = buffer_from_array(
199+
data.geometry_buffer, label="facet_geometry",
200+
reuse=self._buffers.get("geometry"),
201+
)
202+
self._buffers["values"] = buffer_from_array(
203+
data.function_buffer, label="facet_values",
204+
reuse=self._buffers.get("values"),
205+
)
205206
self._buffers["subdivision"] = uniform_from_array(
206207
np.array([self.subdivision], dtype=np.uint32),
207208
label="facet_subdivision",
@@ -324,9 +325,10 @@ def update(self, options: RenderOptions):
324325
self.active = False
325326
return
326327

327-
self._facet_gpu = buffer_from_array(
328-
self._facet_data, label="facet_values_3d", reuse=self._facet_gpu
329-
)
328+
if self.needs_update or self._facet_gpu is None:
329+
self._facet_gpu = buffer_from_array(
330+
self._facet_data, label="facet_values_3d", reuse=self._facet_gpu
331+
)
330332

331333
self.shader_defines["FACET_CF"] = "1"
332334
self.shader_defines["MAX_EVAL_ORDER"] = max(

ngsolve_webgpu/vectors.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def __init__(
7171
scale_by_value: bool = False,
7272
):
7373
self.u_nvectors = None
74+
self._last_data_ts = None
7475
self.clipping = clipping or Clipping()
7576
self.function_data = function_data
7677
self.scale_by_value = scale_by_value
@@ -298,6 +299,10 @@ def _expand_vectors_for_symmetry(self):
298299
def update(self, options):
299300
self.function_data.update(options)
300301
self._complex_settings.update(options)
302+
dirty = self.needs_update or self._last_data_ts != self.function_data._timestamp
303+
if not dirty:
304+
return
305+
self._last_data_ts = self.function_data._timestamp
301306
self.compute_vectors()
302307
is_complex = self.function_data.cf.is_complex
303308
max_val = self.function_data.maxval[0]

0 commit comments

Comments
 (0)