forked from bartvdbraak/blender
Cycles: remove duplicate shader storage
Storing multiple copies of a shader was needed when the displacement method was a mesh option and could be different for each mesh. Now that its a shader option this is unnecessary. Reviewed By: brecht Differential Revision: https://developer.blender.org/D2156
This commit is contained in:
parent
f0159d1d48
commit
9f1c42392e
@ -610,7 +610,7 @@ void Mesh::pack_normals(Scene *scene, uint *tri_shader, float4 *vnormal)
|
|||||||
last_smooth = smooth[i];
|
last_smooth = smooth[i];
|
||||||
Shader *shader = (last_shader < used_shaders.size()) ?
|
Shader *shader = (last_shader < used_shaders.size()) ?
|
||||||
used_shaders[last_shader] : scene->default_surface;
|
used_shaders[last_shader] : scene->default_surface;
|
||||||
shader_id = scene->shader_manager->get_shader_id(shader, this, last_smooth);
|
shader_id = scene->shader_manager->get_shader_id(shader, last_smooth);
|
||||||
}
|
}
|
||||||
|
|
||||||
tri_shader[i] = shader_id;
|
tri_shader[i] = shader_id;
|
||||||
@ -679,7 +679,7 @@ void Mesh::pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, s
|
|||||||
int shader_id = curve_shader[i];
|
int shader_id = curve_shader[i];
|
||||||
Shader *shader = (shader_id < used_shaders.size()) ?
|
Shader *shader = (shader_id < used_shaders.size()) ?
|
||||||
used_shaders[shader_id] : scene->default_surface;
|
used_shaders[shader_id] : scene->default_surface;
|
||||||
shader_id = scene->shader_manager->get_shader_id(shader, this, false);
|
shader_id = scene->shader_manager->get_shader_id(shader, false);
|
||||||
|
|
||||||
curve_data[i] = make_float4(
|
curve_data[i] = make_float4(
|
||||||
__int_as_float(curve.first_key + curvekey_offset),
|
__int_as_float(curve.first_key + curvekey_offset),
|
||||||
|
@ -1146,13 +1146,14 @@ void OSLCompiler::compile(Scene *scene, OSLGlobals *og, Shader *shader)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* push state to array for lookup */
|
/* push state to array for lookup */
|
||||||
og->surface_state.push_back(shader->osl_surface_ref);
|
if(shader->displacement_method == DISPLACE_TRUE || !shader->graph_bump) {
|
||||||
og->surface_state.push_back(shader->osl_surface_bump_ref);
|
og->surface_state.push_back(shader->osl_surface_ref);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
og->surface_state.push_back(shader->osl_surface_bump_ref);
|
||||||
|
}
|
||||||
|
|
||||||
og->volume_state.push_back(shader->osl_volume_ref);
|
og->volume_state.push_back(shader->osl_volume_ref);
|
||||||
og->volume_state.push_back(shader->osl_volume_ref);
|
|
||||||
|
|
||||||
og->displacement_state.push_back(shader->osl_displacement_ref);
|
|
||||||
og->displacement_state.push_back(shader->osl_displacement_ref);
|
og->displacement_state.push_back(shader->osl_displacement_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,14 +312,11 @@ uint ShaderManager::get_attribute_id(AttributeStandard std)
|
|||||||
return (uint)std;
|
return (uint)std;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ShaderManager::get_shader_id(Shader *shader, Mesh *mesh, bool smooth)
|
int ShaderManager::get_shader_id(Shader *shader, bool smooth)
|
||||||
{
|
{
|
||||||
/* get a shader id to pass to the kernel */
|
/* get a shader id to pass to the kernel */
|
||||||
int id = shader->id*2;
|
int id = shader->id;
|
||||||
|
|
||||||
/* index depends bump since this setting is not in the shader */
|
|
||||||
if(mesh && shader->displacement_method != DISPLACE_TRUE)
|
|
||||||
id += 1;
|
|
||||||
/* smooth flag */
|
/* smooth flag */
|
||||||
if(smooth)
|
if(smooth)
|
||||||
id |= SHADER_SMOOTH_NORMAL;
|
id |= SHADER_SMOOTH_NORMAL;
|
||||||
@ -368,7 +365,7 @@ void ShaderManager::device_update_common(Device *device,
|
|||||||
if(scene->shaders.size() == 0)
|
if(scene->shaders.size() == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint shader_flag_size = scene->shaders.size()*4;
|
uint shader_flag_size = scene->shaders.size()*2;
|
||||||
uint *shader_flag = dscene->shader_flag.resize(shader_flag_size);
|
uint *shader_flag = dscene->shader_flag.resize(shader_flag_size);
|
||||||
uint i = 0;
|
uint i = 0;
|
||||||
bool has_volumes = false;
|
bool has_volumes = false;
|
||||||
@ -407,14 +404,11 @@ void ShaderManager::device_update_common(Device *device,
|
|||||||
if(shader->graph_bump)
|
if(shader->graph_bump)
|
||||||
flag |= SD_HAS_BUMP;
|
flag |= SD_HAS_BUMP;
|
||||||
|
|
||||||
/* regular shader */
|
|
||||||
shader_flag[i++] = flag;
|
|
||||||
shader_flag[i++] = shader->pass_id;
|
|
||||||
|
|
||||||
/* shader with bump mapping */
|
/* shader with bump mapping */
|
||||||
if(shader->graph_bump)
|
if(shader->displacement_method != DISPLACE_TRUE && shader->graph_bump)
|
||||||
flag |= SD_HAS_BSSRDF_BUMP;
|
flag |= SD_HAS_BSSRDF_BUMP;
|
||||||
|
|
||||||
|
/* regular shader */
|
||||||
shader_flag[i++] = flag;
|
shader_flag[i++] = flag;
|
||||||
shader_flag[i++] = shader->pass_id;
|
shader_flag[i++] = shader->pass_id;
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ public:
|
|||||||
uint get_attribute_id(AttributeStandard std);
|
uint get_attribute_id(AttributeStandard std);
|
||||||
|
|
||||||
/* get shader id for mesh faces */
|
/* get shader id for mesh faces */
|
||||||
int get_shader_id(Shader *shader, Mesh *mesh = NULL, bool smooth = false);
|
int get_shader_id(Shader *shader, bool smooth = false);
|
||||||
|
|
||||||
/* add default shaders to scene, to use as default for things that don't
|
/* add default shaders to scene, to use as default for things that don't
|
||||||
* have any shader assigned explicitly */
|
* have any shader assigned explicitly */
|
||||||
|
@ -63,7 +63,6 @@ void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene
|
|||||||
|
|
||||||
for(i = 0; i < scene->shaders.size(); i++) {
|
for(i = 0; i < scene->shaders.size(); i++) {
|
||||||
svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
|
svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
|
||||||
svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(Shader *shader, scene->shaders) {
|
foreach(Shader *shader, scene->shaders) {
|
||||||
@ -754,18 +753,16 @@ void SVMCompiler::compile(Scene *scene,
|
|||||||
shader->has_integrator_dependency = false;
|
shader->has_integrator_dependency = false;
|
||||||
|
|
||||||
/* generate surface shader */
|
/* generate surface shader */
|
||||||
{
|
if(shader->displacement_method == DISPLACE_TRUE || !shader->graph_bump) {
|
||||||
scoped_timer timer((summary != NULL)? &summary->time_generate_surface: NULL);
|
scoped_timer timer((summary != NULL)? &summary->time_generate_surface: NULL);
|
||||||
compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
|
compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
|
||||||
global_svm_nodes[index*2 + 0].y = global_svm_nodes.size();
|
global_svm_nodes[index].y = global_svm_nodes.size();
|
||||||
global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
|
|
||||||
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
if(shader->graph_bump) {
|
|
||||||
scoped_timer timer((summary != NULL)? &summary->time_generate_bump: NULL);
|
scoped_timer timer((summary != NULL)? &summary->time_generate_bump: NULL);
|
||||||
compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE);
|
compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE);
|
||||||
global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
|
global_svm_nodes[index].y = global_svm_nodes.size();
|
||||||
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -773,8 +770,7 @@ void SVMCompiler::compile(Scene *scene,
|
|||||||
{
|
{
|
||||||
scoped_timer timer((summary != NULL)? &summary->time_generate_volume: NULL);
|
scoped_timer timer((summary != NULL)? &summary->time_generate_volume: NULL);
|
||||||
compile_type(shader, shader->graph, SHADER_TYPE_VOLUME);
|
compile_type(shader, shader->graph, SHADER_TYPE_VOLUME);
|
||||||
global_svm_nodes[index*2 + 0].z = global_svm_nodes.size();
|
global_svm_nodes[index].z = global_svm_nodes.size();
|
||||||
global_svm_nodes[index*2 + 1].z = global_svm_nodes.size();
|
|
||||||
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -782,8 +778,7 @@ void SVMCompiler::compile(Scene *scene,
|
|||||||
{
|
{
|
||||||
scoped_timer timer((summary != NULL)? &summary->time_generate_displacement: NULL);
|
scoped_timer timer((summary != NULL)? &summary->time_generate_displacement: NULL);
|
||||||
compile_type(shader, shader->graph, SHADER_TYPE_DISPLACEMENT);
|
compile_type(shader, shader->graph, SHADER_TYPE_DISPLACEMENT);
|
||||||
global_svm_nodes[index*2 + 0].w = global_svm_nodes.size();
|
global_svm_nodes[index].w = global_svm_nodes.size();
|
||||||
global_svm_nodes[index*2 + 1].w = global_svm_nodes.size();
|
|
||||||
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user