forked from bartvdbraak/blender
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:
parent
c0078a9879
commit
a9d889cba4
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user