Fix #35102: crash with experimental cycles displacement feature due to
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Sat, 27 Apr 2013 02:54:24 +0000 (02:54 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Sat, 27 Apr 2013 02:54:24 +0000 (02:54 +0000)
uninitialized memory usage.

intern/cycles/render/mesh.cpp
intern/cycles/render/mesh.h
intern/cycles/render/mesh_displace.cpp

index ddb4a1ee2cf38e9e952815221a07b035ed1d5409..4a2a64bb0f3f6f6b49e3cf92d58c03bbfffb1f6e 100644 (file)
@@ -889,7 +889,7 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
        bool displacement_done = false;
 
        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;
 
        /* todo: properly handle cancel halfway displacement */
index 63d6b50ffca89d5b9bebbc868a2ce2f71e8b4bbe..b74c41f64535974a681dcb04b05b1b02ac714eb1 100644 (file)
@@ -140,7 +140,7 @@ public:
        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 */
        void update_osl_attributes(Device *device, Scene *scene, vector<AttributeRequestSet>& mesh_attributes);
index 04267697b29f621b069c9f719de713308a4a2f4c..f20bc73a5421cddcce4126c0d7036e93900aeeaa 100644 (file)
@@ -28,7 +28,7 @@
 
 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 */
        bool has_displacement = false;
@@ -106,6 +106,9 @@ bool MeshManager::displace(Device *device, Scene *scene, Mesh *mesh, Progress& p
        device_vector<float4> d_output;
        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_copy_to(d_input);
        device->mem_alloc(d_output, MEM_WRITE_ONLY);