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: {
|
||||
#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;
|
||||
|
Loading…
Reference in New Issue
Block a user