Fix #33405: preview render getting stuck in a particular .blend file, ObjectKey

operator< had wrong brackets, changed it now to be more clear.

Fix #33404: crash GPU rendering with OSL option still enabled. There was a check
to disable OSL in this case, but it shouldn't have modified scene->params because
this is used for comparison in scene->modified().
This commit is contained in:
Brecht Van Lommel 2012-12-04 07:48:09 +00:00
parent c0078a9879
commit a9d889cba4
8 changed files with 35 additions and 16 deletions

@ -445,7 +445,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
} }
case BL::ShaderNode::type_SCRIPT: { case BL::ShaderNode::type_SCRIPT: {
#ifdef WITH_OSL #ifdef WITH_OSL
if(scene->params.shadingsystem != SceneParams::OSL) if(!scene->shader_manager->use_osl())
break; break;
/* create script node */ /* create script node */

@ -367,12 +367,22 @@ struct ObjectKey {
bool operator<(const ObjectKey& k) const bool operator<(const ObjectKey& k) const
{ {
return (parent < k.parent) || if(ob < k.ob) {
(parent == k.parent && (memcmp(id, k.id, sizeof(id)) < 0)) || return true;
(memcmp(id, k.id, sizeof(id)) == 0 && ob < k.ob); }
else if(ob == k.ob) {
if(parent < k.parent)
return true;
else if(parent == k.parent)
return memcmp(id, k.id, sizeof(id)) < 0;
}
return false;
} }
}; };
/* Particle System Key */
struct ParticleSystemKey { struct ParticleSystemKey {
void *ob; void *ob;
int id[OBJECT_PERSISTENT_ID_SIZE]; int id[OBJECT_PERSISTENT_ID_SIZE];
@ -389,8 +399,12 @@ struct ParticleSystemKey {
bool operator<(const ParticleSystemKey& k) const bool operator<(const ParticleSystemKey& k) const
{ {
/* first id is particle index, we don't compare that */ /* first id is particle index, we don't compare that */
return (ob < k.ob) || if(ob < k.ob)
(ob == k.ob && (memcmp(id+1, k.id+1, sizeof(int)*(OBJECT_PERSISTENT_ID_SIZE-1)) < 0)); return true;
else if(ob == k.ob)
return memcmp(id+1, k.id+1, sizeof(int)*(OBJECT_PERSISTENT_ID_SIZE-1)) < 0;
return false;
} }
}; };

@ -698,7 +698,7 @@ __device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd,
#ifdef __SVM__ #ifdef __SVM__
svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, randb, path_flag); svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, randb, path_flag);
#else #else
bsdf_diffuse_setup(sd, &sd->closure); bsdf_diffuse_setup(&sd->closure);
sd->closure.weight = make_float3(0.8f, 0.8f, 0.8f); sd->closure.weight = make_float3(0.8f, 0.8f, 0.8f);
#endif #endif
} }

@ -547,7 +547,7 @@ void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene,
} }
/* create attribute lookup maps */ /* create attribute lookup maps */
if(scene->params.shadingsystem == SceneParams::OSL) if(scene->shader_manager->use_osl())
update_osl_attributes(device, scene, mesh_attributes); update_osl_attributes(device, scene, mesh_attributes);
else else
update_svm_attributes(device, dscene, scene, mesh_attributes); update_svm_attributes(device, dscene, scene, mesh_attributes);

@ -52,6 +52,8 @@ public:
OSLShaderManager(); OSLShaderManager();
~OSLShaderManager(); ~OSLShaderManager();
bool use_osl() { return true; }
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress); void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
void device_free(Device *device, DeviceScene *dscene); void device_free(Device *device, DeviceScene *dscene);

@ -44,10 +44,6 @@ Scene::Scene(const SceneParams& params_, const DeviceInfo& device_info_)
device = NULL; device = NULL;
memset(&dscene.data, 0, sizeof(dscene.data)); memset(&dscene.data, 0, sizeof(dscene.data));
/* OSL only works on the CPU */
if(device_info_.type != DEVICE_CPU)
params.shadingsystem = SceneParams::SVM;
camera = new Camera(); camera = new Camera();
filter = new Filter(); filter = new Filter();
film = new Film(); film = new Film();
@ -57,9 +53,14 @@ Scene::Scene(const SceneParams& params_, const DeviceInfo& device_info_)
object_manager = new ObjectManager(); object_manager = new ObjectManager();
integrator = new Integrator(); integrator = new Integrator();
image_manager = new ImageManager(); image_manager = new ImageManager();
shader_manager = ShaderManager::create(this);
particle_system_manager = new ParticleSystemManager(); particle_system_manager = new ParticleSystemManager();
/* OSL only works on the CPU */
if(device_info_.type == DEVICE_CPU)
shader_manager = ShaderManager::create(this, params.shadingsystem);
else
shader_manager = ShaderManager::create(this, SceneParams::SVM);
if (device_info_.type == DEVICE_CPU) if (device_info_.type == DEVICE_CPU)
image_manager->set_extended_image_limits(); image_manager->set_extended_image_limits();
} }

@ -121,12 +121,12 @@ ShaderManager::~ShaderManager()
{ {
} }
ShaderManager *ShaderManager::create(Scene *scene) ShaderManager *ShaderManager::create(Scene *scene, int shadingsystem)
{ {
ShaderManager *manager; ShaderManager *manager;
#ifdef WITH_OSL #ifdef WITH_OSL
if(scene->params.shadingsystem == SceneParams::OSL) if(shadingsystem == SceneParams::OSL)
manager = new OSLShaderManager(); manager = new OSLShaderManager();
else else
#endif #endif

@ -107,9 +107,11 @@ class ShaderManager {
public: public:
bool need_update; bool need_update;
static ShaderManager *create(Scene *scene); static ShaderManager *create(Scene *scene, int shadingsystem);
virtual ~ShaderManager(); virtual ~ShaderManager();
virtual bool use_osl() { return false; }
/* device update */ /* device update */
virtual void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) = 0; virtual void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) = 0;
virtual void device_free(Device *device, DeviceScene *dscene) = 0; virtual void device_free(Device *device, DeviceScene *dscene) = 0;