Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Werner <stefan.werner@tangent-animation.com>2018-03-08 02:35:24 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-10 06:54:04 +0300
commitf3010e98c343a83e07ff6c2a5437d0043122b083 (patch)
tree5b65da3162727bf00c88babcb216d8dbb4c5a269 /intern/cycles/render
parentfa9175ff02acffd02679398e17732f3832d3fc28 (diff)
Code refactor: use KernelShader and KernelParticle instead of float arrays.
Original patch by Stefan with modifications by Brecht.
Diffstat (limited to 'intern/cycles/render')
-rw-r--r--intern/cycles/render/particles.cpp22
-rw-r--r--intern/cycles/render/scene.cpp2
-rw-r--r--intern/cycles/render/scene.h4
-rw-r--r--intern/cycles/render/shader.cpp21
4 files changed, 23 insertions, 26 deletions
diff --git a/intern/cycles/render/particles.cpp b/intern/cycles/render/particles.cpp
index 3ee620c9d01..e4be3306d7e 100644
--- a/intern/cycles/render/particles.cpp
+++ b/intern/cycles/render/particles.cpp
@@ -62,14 +62,10 @@ void ParticleSystemManager::device_update_particles(Device *, DeviceScene *dscen
for(size_t j = 0; j < scene->particle_systems.size(); j++)
num_particles += scene->particle_systems[j]->particles.size();
- float4 *particles = dscene->particles.alloc(PARTICLE_SIZE*num_particles);
+ KernelParticle *kparticles = dscene->particles.alloc(num_particles);
/* dummy particle */
- particles[0] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
- particles[1] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
- particles[2] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
- particles[3] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
- particles[4] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ memset(kparticles, 0, sizeof(KernelParticle));
int i = 1;
for(size_t j = 0; j < scene->particle_systems.size(); j++) {
@@ -78,13 +74,15 @@ void ParticleSystemManager::device_update_particles(Device *, DeviceScene *dscen
for(size_t k = 0; k < psys->particles.size(); k++) {
/* pack in texture */
Particle& pa = psys->particles[k];
- int offset = i*PARTICLE_SIZE;
- particles[offset] = make_float4(__uint_as_float(pa.index), pa.age, pa.lifetime, pa.size);
- particles[offset+1] = pa.rotation;
- particles[offset+2] = make_float4(pa.location.x, pa.location.y, pa.location.z, pa.velocity.x);
- particles[offset+3] = make_float4(pa.velocity.y, pa.velocity.z, pa.angular_velocity.x, pa.angular_velocity.y);
- particles[offset+4] = make_float4(pa.angular_velocity.z, 0.0f, 0.0f, 0.0f);
+ kparticles[i].index = pa.index;
+ kparticles[i].age = pa.age;
+ kparticles[i].lifetime = pa.lifetime;
+ kparticles[i].size = pa.size;
+ kparticles[i].rotation = pa.rotation;
+ kparticles[i].location = float3_to_float4(pa.location);
+ kparticles[i].velocity = float3_to_float4(pa.velocity);
+ kparticles[i].angular_velocity = float3_to_float4(pa.angular_velocity);
i++;
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index aca28fc32fb..f5b8e2fd6a6 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -71,7 +71,7 @@ DeviceScene::DeviceScene(Device *device)
light_background_conditional_cdf(device, "__light_background_conditional_cdf", MEM_TEXTURE),
particles(device, "__particles", MEM_TEXTURE),
svm_nodes(device, "__svm_nodes", MEM_TEXTURE),
- shader_flag(device, "__shader_flag", MEM_TEXTURE),
+ shaders(device, "__shaders", MEM_TEXTURE),
object_flag(device, "__object_flag", MEM_TEXTURE),
lookup_table(device, "__lookup_table", MEM_TEXTURE),
sobol_directions(device, "__sobol_directions", MEM_TEXTURE)
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 3f089b9138f..316ffeb1092 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -102,11 +102,11 @@ public:
device_vector<float2> light_background_conditional_cdf;
/* particles */
- device_vector<float4> particles;
+ device_vector<KernelParticle> particles;
/* shaders */
device_vector<int4> svm_nodes;
- device_vector<uint> shader_flag;
+ device_vector<KernelShader> shaders;
device_vector<uint> object_flag;
/* lookup tables */
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 578c61a3e79..ec52c51e337 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -432,14 +432,12 @@ void ShaderManager::device_update_common(Device *device,
Scene *scene,
Progress& /*progress*/)
{
- dscene->shader_flag.free();
+ dscene->shaders.free();
if(scene->shaders.size() == 0)
return;
- uint shader_flag_size = scene->shaders.size()*SHADER_SIZE;
- uint *shader_flag = dscene->shader_flag.alloc(shader_flag_size);
- uint i = 0;
+ KernelShader *kshader = dscene->shaders.alloc(scene->shaders.size());
bool has_volumes = false;
bool has_transparent_shadow = false;
@@ -487,16 +485,17 @@ void ShaderManager::device_update_common(Device *device,
flag |= SD_HAS_CONSTANT_EMISSION;
/* regular shader */
- shader_flag[i++] = flag;
- shader_flag[i++] = shader->pass_id;
- shader_flag[i++] = __float_as_int(constant_emission.x);
- shader_flag[i++] = __float_as_int(constant_emission.y);
- shader_flag[i++] = __float_as_int(constant_emission.z);
+ kshader->flags = flag;
+ kshader->pass_id = shader->pass_id;
+ kshader->constant_emission[0] = constant_emission.x;
+ kshader->constant_emission[1] = constant_emission.y;
+ kshader->constant_emission[2] = constant_emission.z;
+ kshader++;
has_transparent_shadow |= (flag & SD_HAS_TRANSPARENT_SHADOW) != 0;
}
- dscene->shader_flag.copy_to_device();
+ dscene->shaders.copy_to_device();
/* lookup tables */
KernelTables *ktables = &dscene->data.tables;
@@ -525,7 +524,7 @@ void ShaderManager::device_free_common(Device *, DeviceScene *dscene, Scene *sce
{
scene->lookup_tables->remove_table(&beckmann_table_offset);
- dscene->shader_flag.free();
+ dscene->shaders.free();
}
void ShaderManager::add_default(Scene *scene)