From cdb0b3b1dcd4e9962426422868b2f40535670a5c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 8 Oct 2017 04:32:25 +0200 Subject: Code refactor: use DeviceInfo to enable QBVH and decoupled volume shading. --- intern/cycles/render/integrator.cpp | 1 + intern/cycles/render/mesh.cpp | 16 +++++++++------- intern/cycles/render/mesh.h | 3 ++- intern/cycles/render/scene.h | 2 +- intern/cycles/render/shader.cpp | 10 ++++++---- 5 files changed, 19 insertions(+), 13 deletions(-) (limited to 'intern/cycles/render') diff --git a/intern/cycles/render/integrator.cpp b/intern/cycles/render/integrator.cpp index 15b728d6e02..b268478e6d3 100644 --- a/intern/cycles/render/integrator.cpp +++ b/intern/cycles/render/integrator.cpp @@ -145,6 +145,7 @@ void Integrator::device_update(Device *device, DeviceScene *dscene, Scene *scene kintegrator->sample_clamp_indirect = (sample_clamp_indirect == 0.0f)? FLT_MAX: sample_clamp_indirect*3.0f; kintegrator->branched = (method == BRANCHED_PATH); + kintegrator->volume_decoupled = device->info.has_volume_decoupled; kintegrator->diffuse_samples = diffuse_samples; kintegrator->glossy_samples = glossy_samples; kintegrator->transmission_samples = transmission_samples; diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 84537bf5993..c02a5222463 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -1016,7 +1016,8 @@ void Mesh::pack_patches(uint *patch_data, uint vert_offset, uint face_offset, ui } } -void Mesh::compute_bvh(DeviceScene *dscene, +void Mesh::compute_bvh(Device *device, + DeviceScene *dscene, SceneParams *params, Progress *progress, int n, @@ -1050,7 +1051,7 @@ void Mesh::compute_bvh(DeviceScene *dscene, BVHParams bparams; bparams.use_spatial_split = params->use_bvh_spatial_split; - bparams.use_qbvh = params->use_qbvh; + bparams.use_qbvh = params->use_qbvh && device->info.has_qbvh; bparams.use_unaligned_nodes = dscene->data.bvh.have_curves && params->use_bvh_unaligned_nodes; bparams.num_motion_triangle_steps = params->num_bvh_time_steps; @@ -1814,18 +1815,18 @@ void MeshManager::device_update_bvh(Device *device, DeviceScene *dscene, Scene * /* bvh build */ progress.set_status("Updating Scene BVH", "Building"); - VLOG(1) << (scene->params.use_qbvh ? "Using QBVH optimization structure" - : "Using regular BVH optimization structure"); - BVHParams bparams; bparams.top_level = true; - bparams.use_qbvh = scene->params.use_qbvh; + bparams.use_qbvh = scene->params.use_qbvh && device->info.has_qbvh; bparams.use_spatial_split = scene->params.use_bvh_spatial_split; bparams.use_unaligned_nodes = dscene->data.bvh.have_curves && scene->params.use_bvh_unaligned_nodes; bparams.num_motion_triangle_steps = scene->params.num_bvh_time_steps; bparams.num_motion_curve_steps = scene->params.num_bvh_time_steps; + VLOG(1) << (bparams.use_qbvh ? "Using QBVH optimization structure" + : "Using regular BVH optimization structure"); + delete bvh; bvh = BVH::create(bparams, scene->objects); bvh->build(progress); @@ -1879,7 +1880,7 @@ void MeshManager::device_update_bvh(Device *device, DeviceScene *dscene, Scene * } dscene->data.bvh.root = pack.root_index; - dscene->data.bvh.use_qbvh = scene->params.use_qbvh; + dscene->data.bvh.use_qbvh = bparams.use_qbvh; dscene->data.bvh.use_bvh_steps = (scene->params.num_bvh_time_steps != 0); } @@ -2084,6 +2085,7 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen if(mesh->need_update) { pool.push(function_bind(&Mesh::compute_bvh, mesh, + device, dscene, &scene->params, &progress, diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h index 043ce9d0ffc..9a51ca73950 100644 --- a/intern/cycles/render/mesh.h +++ b/intern/cycles/render/mesh.h @@ -282,7 +282,8 @@ public: void pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, size_t curvekey_offset); void pack_patches(uint *patch_data, uint vert_offset, uint face_offset, uint corner_offset); - void compute_bvh(DeviceScene *dscene, + void compute_bvh(Device *device, + DeviceScene *dscene, SceneParams *params, Progress *progress, int n, diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h index 0194327f567..a1966afd23b 100644 --- a/intern/cycles/render/scene.h +++ b/intern/cycles/render/scene.h @@ -149,7 +149,7 @@ public: use_bvh_spatial_split = false; use_bvh_unaligned_nodes = true; num_bvh_time_steps = 0; - use_qbvh = false; + use_qbvh = true; persistent_data = false; texture_limit = 0; } diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 864875361c0..3992ada2e85 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -451,10 +451,12 @@ void ShaderManager::device_update_common(Device *device, flag |= SD_HETEROGENEOUS_VOLUME; if(shader->has_bssrdf_bump) flag |= SD_HAS_BSSRDF_BUMP; - if(shader->volume_sampling_method == VOLUME_SAMPLING_EQUIANGULAR) - flag |= SD_VOLUME_EQUIANGULAR; - if(shader->volume_sampling_method == VOLUME_SAMPLING_MULTIPLE_IMPORTANCE) - flag |= SD_VOLUME_MIS; + if(device->info.has_volume_decoupled) { + if(shader->volume_sampling_method == VOLUME_SAMPLING_EQUIANGULAR) + flag |= SD_VOLUME_EQUIANGULAR; + if(shader->volume_sampling_method == VOLUME_SAMPLING_MULTIPLE_IMPORTANCE) + flag |= SD_VOLUME_MIS; + } if(shader->volume_interpolation_method == VOLUME_INTERPOLATION_CUBIC) flag |= SD_VOLUME_CUBIC; if(shader->has_bump) -- cgit v1.2.3