|
9 | 9 | from webgpu.colormap import Colormap |
10 | 10 | from webgpu.renderer import Renderer, RenderOptions, check_timestamp |
11 | 11 | from webgpu.shapes import ShapeRenderer, generate_cylinder |
12 | | -from webgpu.utils import BufferBinding, UniformBinding, buffer_from_array, write_array_to_buffer, read_shader_file |
| 12 | +from webgpu.utils import BufferBinding, UniformBinding, buffer_from_array, write_array_to_buffer, read_shader_file, device_generation |
13 | 13 | from webgpu.renderer import BaseRenderer, RenderOptions, check_timestamp |
14 | 14 | from webgpu.uniforms import UniformBase, ct |
15 | 15 | from webgpu.utils import ( |
@@ -212,6 +212,7 @@ class FunctionData: |
212 | 212 | order_3d: int |
213 | 213 | _timestamp: float = -1 |
214 | 214 | _gpu_dirty: bool = True |
| 215 | + _gpu_generation: int = -1 |
215 | 216 | minval: list[float] |
216 | 217 | maxval: list[float] |
217 | 218 |
|
@@ -336,21 +337,24 @@ def get_buffers(self, include_mesh_data=True): |
336 | 337 | buffers = self.mesh_data.get_buffers().copy() |
337 | 338 | else: |
338 | 339 | buffers = {} |
| 340 | + gen = device_generation() |
| 341 | + stale = self._gpu_generation != gen |
339 | 342 | if self.data_2d is not None: |
340 | | - if self._gpu_dirty or self.gpu_2d is None: |
| 343 | + if self._gpu_dirty or stale or self.gpu_2d is None: |
341 | 344 | self.gpu_2d = buffer_from_array( |
342 | 345 | self.data_2d, label="function_data_2d", reuse=self.gpu_2d |
343 | 346 | ) |
344 | 347 | buffers["data_2d"] = self.gpu_2d |
345 | 348 |
|
346 | 349 | if self.data_3d is not None: |
347 | | - if self._gpu_dirty or self.gpu_3d is None: |
| 350 | + if self._gpu_dirty or stale or self.gpu_3d is None: |
348 | 351 | self.gpu_3d = buffer_from_array( |
349 | 352 | self.data_3d, label="function_data_3d", reuse=self.gpu_3d |
350 | 353 | ) |
351 | 354 | buffers["data_3d"] = self.gpu_3d |
352 | 355 |
|
353 | 356 | self._gpu_dirty = False |
| 357 | + self._gpu_generation = gen |
354 | 358 |
|
355 | 359 | return buffers |
356 | 360 |
|
|
0 commit comments