diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-12-09 01:55:35 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-12-09 01:55:35 +0400 |
commit | 3314184f4d77bed0d9b4cdc186154b2289b5ab75 (patch) | |
tree | a062f4da3dbd72fccfdb9e0bda63fcff8f87c264 /intern/cycles | |
parent | 601b0b284e1ec87917c47341165c111ef5b8d96c (diff) |
Fix #29528: crash adding subsurf modifier in a particular scene with viewport render.
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/blender/blender_sync.cpp | 2 | ||||
-rw-r--r-- | intern/cycles/render/mesh.cpp | 18 | ||||
-rw-r--r-- | intern/cycles/render/sobol.cpp | 27 | ||||
-rw-r--r-- | intern/cycles/render/sobol.h | 4 |
4 files changed, 29 insertions, 22 deletions
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index b89b7ebb9be..b66004bee58 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -269,7 +269,7 @@ SessionParams BlenderSync::get_session_params(BL::Scene b_scene, bool background if(!experimental || RNA_enum_get(&cscene, "gpu_type") == 0) dtype = DEVICE_CUDA; else - dtype = DEVICE_CUDA; + dtype = DEVICE_OPENCL; if(device_type_available(types, dtype)) params.device_type = dtype; diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index fc2dd49205a..5d65ce69a00 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -270,15 +270,19 @@ void Mesh::compute_bvh(SceneParams *params, Progress& progress) void Mesh::tag_update(Scene *scene, bool rebuild) { need_update = true; - if(rebuild) + + if(rebuild) { need_update_rebuild = true; + scene->light_manager->need_update = true; + } + else { + foreach(uint sindex, used_shaders) + if(scene->shaders[sindex]->has_surface_emission) + scene->light_manager->need_update = true; + } scene->mesh_manager->need_update = true; scene->object_manager->need_update = true; - - foreach(uint sindex, used_shaders) - if(scene->shaders[sindex]->has_surface_emission) - scene->light_manager->need_update = true; } /* Mesh Manager */ @@ -685,9 +689,9 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen if(!mesh->transform_applied) { string msg = "Updating Mesh BVH "; if(mesh->name == "") - msg += string_printf("%lu/%lu", (unsigned long)(i+1), (unsigned long)num_instance_bvh); + msg += string_printf("%u/%u", (uint)(i+1), (uint)num_instance_bvh); else - msg += string_printf("%s %lu/%lu", mesh->name.c_str(), (unsigned long)(i+1), (unsigned long)num_instance_bvh); + msg += string_printf("%s %u/%u", mesh->name.c_str(), (uint)(i+1), (uint)num_instance_bvh); progress.set_status(msg, "Building BVH"); mesh->compute_bvh(&scene->params, progress); diff --git a/intern/cycles/render/sobol.cpp b/intern/cycles/render/sobol.cpp index be8939174b4..e3c2e802067 100644 --- a/intern/cycles/render/sobol.cpp +++ b/intern/cycles/render/sobol.cpp @@ -47,6 +47,7 @@ */ #include "util_debug.h" +#include "util_types.h" #include "sobol.h" @@ -55,8 +56,8 @@ CCL_NAMESPACE_BEGIN #define SOBOL_MAX_NUMBER 32 typedef struct SobolDirectionNumbers { - unsigned int d, s, a; - unsigned int m[SOBOL_MAX_NUMBER]; + uint d, s, a; + uint m[SOBOL_MAX_NUMBER]; } SobolDirectionNumbers; static SobolDirectionNumbers SOBOL_NUMBERS[SOBOL_MAX_DIMENSIONS-1] = { @@ -21262,38 +21263,38 @@ static SobolDirectionNumbers SOBOL_NUMBERS[SOBOL_MAX_DIMENSIONS-1] = { {21201, 18, 131059, {1, 1, 7, 11, 15, 7, 37, 239, 337, 245, 1557, 3681, 7357, 9639, 27367, 26869, 114603, 86317}} }; -void sobol_generate_direction_vectors(unsigned int vectors[][SOBOL_BITS], int dimensions) +void sobol_generate_direction_vectors(uint vectors[][SOBOL_BITS], int dimensions) { assert(dimensions <= SOBOL_MAX_DIMENSIONS); - const unsigned int L = SOBOL_BITS; + const uint L = SOBOL_BITS; /* first dimension is exception */ - unsigned int *v = vectors[0]; + uint *v = vectors[0]; - for(unsigned int i = 0; i < L; i++) + for(uint i = 0; i < L; i++) v[i] = 1 << (31-i); // all m's = 1 for(int dim = 1; dim < dimensions; dim++) { SobolDirectionNumbers *numbers = &SOBOL_NUMBERS[dim-1]; - unsigned int s = numbers->s; - unsigned int a = numbers->a; - unsigned int *m = numbers->m; + uint s = numbers->s; + uint a = numbers->a; + uint *m = numbers->m; v = vectors[dim]; if(L <= s) { - for(unsigned int i = 0; i < L; i++) + for(uint i = 0; i < L; i++) v[i] = m[i] << (31-i); } else { - for(unsigned int i = 0; i < s; i++) + for(uint i = 0; i < s; i++) v[i] = m[i] << (31-i); - for(unsigned int i = s; i < L; i++) { + for(uint i = s; i < L; i++) { v[i] = v[i-s] ^ (v[i-s] >> s); - for(unsigned int k = 1; k < s; k++) + for(uint k = 1; k < s; k++) v[i] ^= (((a >> (s-1-k)) & 1) * v[i-k]); } } diff --git a/intern/cycles/render/sobol.h b/intern/cycles/render/sobol.h index bfc2f5512aa..0f52a5fee68 100644 --- a/intern/cycles/render/sobol.h +++ b/intern/cycles/render/sobol.h @@ -19,12 +19,14 @@ #ifndef __SOBOL_H__ #define __SOBOL_H__ +#include "util_types.h" + CCL_NAMESPACE_BEGIN #define SOBOL_BITS 32 #define SOBOL_MAX_DIMENSIONS 21201 -void sobol_generate_direction_vectors(unsigned int vectors[][SOBOL_BITS], int dimensions); +void sobol_generate_direction_vectors(uint vectors[][SOBOL_BITS], int dimensions); CCL_NAMESPACE_END |