Fix #35102: crash with experimental cycles displacement feature due to

uninitialized memory usage.
This commit is contained in:
Brecht Van Lommel
2013-04-27 02:54:24 +00:00
parent 2b640a2519
commit ac849f98f5
3 changed files with 6 additions and 3 deletions

View File

@@ -889,7 +889,7 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
bool displacement_done = false; bool displacement_done = false;
foreach(Mesh *mesh, scene->meshes) foreach(Mesh *mesh, scene->meshes)
if(mesh->need_update && displace(device, scene, mesh, progress)) if(mesh->need_update && displace(device, dscene, scene, mesh, progress))
displacement_done = true; displacement_done = true;
/* todo: properly handle cancel halfway displacement */ /* todo: properly handle cancel halfway displacement */

View File

@@ -140,7 +140,7 @@ public:
MeshManager(); MeshManager();
~MeshManager(); ~MeshManager();
bool displace(Device *device, Scene *scene, Mesh *mesh, Progress& progress); bool displace(Device *device, DeviceScene *dscene, Scene *scene, Mesh *mesh, Progress& progress);
/* attributes */ /* attributes */
void update_osl_attributes(Device *device, Scene *scene, vector<AttributeRequestSet>& mesh_attributes); void update_osl_attributes(Device *device, Scene *scene, vector<AttributeRequestSet>& mesh_attributes);

View File

@@ -28,7 +28,7 @@
CCL_NAMESPACE_BEGIN CCL_NAMESPACE_BEGIN
bool MeshManager::displace(Device *device, Scene *scene, Mesh *mesh, Progress& progress) bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Mesh *mesh, Progress& progress)
{ {
/* verify if we have a displacement shader */ /* verify if we have a displacement shader */
bool has_displacement = false; bool has_displacement = false;
@@ -106,6 +106,9 @@ bool MeshManager::displace(Device *device, Scene *scene, Mesh *mesh, Progress& p
device_vector<float4> d_output; device_vector<float4> d_output;
d_output.resize(d_input_size); d_output.resize(d_input_size);
/* needs to be up to data for attribute access */
device->const_copy_to("__data", &dscene->data, sizeof(dscene->data));
device->mem_alloc(d_input, MEM_READ_ONLY); device->mem_alloc(d_input, MEM_READ_ONLY);
device->mem_copy_to(d_input); device->mem_copy_to(d_input);
device->mem_alloc(d_output, MEM_WRITE_ONLY); device->mem_alloc(d_output, MEM_WRITE_ONLY);