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: {
#ifdef WITH_OSL
if(scene->params.shadingsystem != SceneParams::OSL)
if(!scene->shader_manager->use_osl())
break;
/* create script node */

@ -367,12 +367,22 @@ struct ObjectKey {
bool operator<(const ObjectKey& k) const
{
return (parent < k.parent) ||
(parent == k.parent && (memcmp(id, k.id, sizeof(id)) < 0)) ||
(memcmp(id, k.id, sizeof(id)) == 0 && ob < k.ob);
if(ob < k.ob) {
return true;
}
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 {
void *ob;
int id[OBJECT_PERSISTENT_ID_SIZE];
@ -389,8 +399,12 @@ struct ParticleSystemKey {
bool operator<(const ParticleSystemKey& k) const
{
/* first id is particle index, we don't compare that */
return (ob < k.ob) ||
(ob == k.ob && (memcmp(id+1, k.id+1, sizeof(int)*(OBJECT_PERSISTENT_ID_SIZE-1)) < 0));
if(ob < k.ob)
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__
svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, randb, path_flag);
#else
bsdf_diffuse_setup(sd, &sd->closure);
bsdf_diffuse_setup(&sd->closure);
sd->closure.weight = make_float3(0.8f, 0.8f, 0.8f);
#endif
}

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

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

@ -44,10 +44,6 @@ Scene::Scene(const SceneParams& params_, const DeviceInfo& device_info_)
device = NULL;
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();
filter = new Filter();
film = new Film();
@ -57,9 +53,14 @@ Scene::Scene(const SceneParams& params_, const DeviceInfo& device_info_)
object_manager = new ObjectManager();
integrator = new Integrator();
image_manager = new ImageManager();
shader_manager = ShaderManager::create(this);
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)
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;
#ifdef WITH_OSL
if(scene->params.shadingsystem == SceneParams::OSL)
if(shadingsystem == SceneParams::OSL)
manager = new OSLShaderManager();
else
#endif

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