Skip to content

Commit

Permalink
Fix params.update unnecessary hash computation
Browse files Browse the repository at this point in the history
  • Loading branch information
Speierers committed Oct 11, 2022
1 parent 78fd2b8 commit f57e741
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 7 deletions.
17 changes: 14 additions & 3 deletions src/python/python/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,17 @@ def copy(self):
def __contains__(self, key: str):
return self.properties.__contains__(key)

def __getitem__(self, key: str):
def __get_value(self, key: str):
value, value_type, node, _ = self.properties[key]

if value_type is not None:
value = self.get_property(value, value_type, node)

return value

def __getitem__(self, key: str):
value = self.__get_value(key)

if key not in self.update_candidates:
self.update_candidates[key] = _jit_id_hash(value)

Expand Down Expand Up @@ -193,17 +199,19 @@ def update(self, values: dict = None) -> list[tuple[Any, set]]:
for k, v in values.items():
if k in self:
self[k] = v
dr.schedule(self)

update_candidate_keys = list(self.update_candidates.keys())
for key in update_candidate_keys:
# Candidate objects might have been modified inplace, we must check
# the JIT identifiers to see if the object has truly changed.
if _jit_id_hash(self[key]) == self.update_candidates[key]:
if _jit_id_hash(self.__get_value(key)) == self.update_candidates[key]:
continue

self.set_dirty(key)

for key in self.keys():
dr.schedule(self.__get_value(key))

# Notify nodes from bottom to top
work_list = [(d, n, k) for (d, n), k in self.nodes_to_update.items()]
work_list = reversed(sorted(work_list, key=lambda x: x[0]))
Expand Down Expand Up @@ -260,6 +268,9 @@ def jit_ids(value: Any) -> list[tuple[int, Optional[int]]]:
ids.extend(jit_ids(value.array))
else:
ids.append((value.index, 0))
elif dr.is_array_v(value) and dr.is_dynamic_array_v(value):
for i in range(len(value)):
ids.extend(jit_ids(value[i]))
elif dr.is_struct_v(value):
for k in value.DRJIT_STRUCT.keys():
ids.extend(jit_ids(getattr(value, k)))
Expand Down
2 changes: 2 additions & 0 deletions src/render/scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,8 @@ MI_VARIANT void Scene<Float, Spectrum>::parameters_changed(const std::vector<std
accel_parameters_changed_gpu();
else
accel_parameters_changed_cpu();

clear_shapes_dirty();
}

// Check whether any shape parameters have gradient tracking enabled
Expand Down
2 changes: 0 additions & 2 deletions src/render/scene_embree.inl
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,6 @@ MI_VARIANT void Scene<Float, Spectrum>::accel_parameters_changed_cpu() {
(void *) m_accel
);
}

clear_shapes_dirty();
}

MI_VARIANT void Scene<Float, Spectrum>::accel_release_cpu() {
Expand Down
2 changes: 0 additions & 2 deletions src/render/scene_optix.inl
Original file line number Diff line number Diff line change
Expand Up @@ -395,8 +395,6 @@ MI_VARIANT void Scene<Float, Spectrum>::accel_parameters_changed_gpu() {
},
(void *) s.ias_buffer
);

clear_shapes_dirty();
}
}

Expand Down

0 comments on commit f57e741

Please sign in to comment.