From c3bab1c060aa066839bb412961d305e8ef177700 Mon Sep 17 00:00:00 2001 From: Francois Beaune Date: Sat, 21 Nov 2015 11:56:41 +0100 Subject: [PATCH 1/7] Tweak formatting --- src/appleseed/foundation/platform/system.cpp | 125 ++++++++++--------- 1 file changed, 63 insertions(+), 62 deletions(-) diff --git a/src/appleseed/foundation/platform/system.cpp b/src/appleseed/foundation/platform/system.cpp index c8b2e791f3..6ddbd87d0a 100644 --- a/src/appleseed/foundation/platform/system.cpp +++ b/src/appleseed/foundation/platform/system.cpp @@ -537,183 +537,184 @@ namespace // Descriptor decode values from the Intel manual, Table 2-7. switch ((regs[i / 4] >> (i % 4) * 8) & 0xFF) { - case 0x0A: + case 0x0A: caches[L1D].size = 8; caches[L1D].linesize = 32; break; - case 0x0C: + case 0x0C: caches[L1D].size = 16; caches[L1D].linesize = 32; break; - case 0x0D: - case 0x60: - case 0x67: + case 0x0D: + case 0x60: + case 0x67: caches[L1D].size = 16; caches[L1D].linesize = 64; break; - case 0x21: - case 0x3C: - case 0x7A: + case 0x21: + case 0x3C: + case 0x7A: caches[L2].size = 256; caches[L2].linesize = 64; break; - case 0x22: - case 0xD0: + case 0x22: + case 0xD0: caches[L3].size = 512; caches[L3].linesize = 64; break; - case 0x23: - case 0xD1: - case 0xD6: + case 0x23: + case 0xD1: + case 0xD6: caches[L3].size = 1024; caches[L3].linesize = 64; break; - case 0x25: - case 0xD2: - case 0xD7: - case 0xE2: + case 0x25: + case 0xD2: + case 0xD7: + case 0xE2: caches[L3].size = 2048; caches[L3].linesize = 64; break; - case 0x29: - case 0x46: - case 0xD8: - case 0xE3: + case 0x29: + case 0x46: + case 0xD8: + case 0xE3: caches[L3].size = 4096; caches[L3].linesize = 64; break; - case 0x2C: + case 0x2C: caches[L1D].size = 32; caches[L1D].linesize = 64; break; - case 0x39: - case 0x3B: - case 0x79: + case 0x39: + case 0x3B: + case 0x79: caches[L2].size = 128; caches[L2].linesize = 64; break; - case 0x3A: + case 0x3A: caches[L2].size = 192; caches[L2].linesize = 64; break; - case 0x3D: + case 0x3D: caches[L2].size = 384; caches[L2].linesize = 64; break; - case 0x3E: - case 0x7B: - case 0x7F: - case 0x86: + case 0x3E: + case 0x7B: + case 0x7F: + case 0x86: caches[L2].size = 512; caches[L2].linesize = 64; break; - case 0x40: + case 0x40: no_higher_level_cache = 1; break; - case 0x41: + case 0x41: caches[L2].size = 128; caches[L2].linesize = 32; break; - case 0x42: - case 0x82: + case 0x42: + case 0x82: caches[L2].size = 256; caches[L2].linesize = 32; break; - case 0x43: - case 0x83: + case 0x43: + case 0x83: caches[L2].size = 512; caches[L2].linesize = 32; break; - case 0x44: + case 0x44: caches[L2].size = 1024; caches[L2].linesize = 32; break; - case 0x45: + case 0x45: caches[L2].size = 2048; caches[L2].linesize = 32; break; - case 0x47: - case 0x4B: - case 0xE4: + case 0x47: + case 0x4B: + case 0xE4: caches[L3].size = 8192; caches[L3].linesize = 64; break; - case 0x48: + case 0x48: caches[L2].size = 3072; caches[L2].linesize = 64; break; - case 0x49: + case 0x49: // TODO: check for Intel Xeon processor MP, Family 0Fh, // Model 06h, because 0x49 means L3 cache (4MB, 16-way, // 64-byte linesize) for this CPU. caches[L2].size = 4096; caches[L2].linesize = 64; break; - case 0x4A: - case 0xDE: + case 0x4A: + case 0xDE: caches[L3].size = 6 * 1024; caches[L3].linesize = 64; break; - case 0x4C: - case 0xEA: + case 0x4C: + case 0xEA: caches[L3].size = 12 * 1024; caches[L3].linesize = 64; break; - case 0x4D: + case 0x4D: caches[L3].size = 16 * 1024; caches[L3].linesize = 64; break; - case 0x4E: + case 0x4E: caches[L2].size = 6 * 1024; caches[L2].linesize = 64; break; - case 0x66: + case 0x66: caches[L1D].size = 8; caches[L1D].linesize = 64; break; - case 0x68: + case 0x68: caches[L1D].size = 32; caches[L1D].linesize = 64; break; - case 0x78: - case 0x7C: + case 0x78: + case 0x7C: caches[L2].size = 1024; caches[L2].linesize = 64; break; - case 0x7D: + case 0x7D: caches[L2].size = 2048; caches[L2].linesize = 64; break; - case 0x84: + case 0x84: caches[L2].size = 1024; caches[L2].linesize = 32; break; - case 0x85: + case 0x85: caches[L2].size = 2048; caches[L2].linesize = 32; break; - case 0x87: + case 0x87: caches[L2].size = 1024; caches[L2].linesize = 64; break; - case 0xDC: + case 0xDC: caches[L3].size = 1536; caches[L3].linesize = 64; break; - case 0xDD: + case 0xDD: caches[L3].size = 3 * 1024; caches[L3].linesize = 64; break; - case 0xEB: + case 0xEB: caches[L3].size = 18 * 1024; caches[L3].linesize = 64; break; - case 0xEC: + case 0xEC: caches[L3].size = 24 * 1024; caches[L3].linesize = 64; break; } } + // Convert Kbytes to bytes. caches[L1D].size *= 1024; caches[L2].size *= 1024; From c559a03ce571d2f8bea2150cd96d876b7f248bfe Mon Sep 17 00:00:00 2001 From: Francois Beaune Date: Sat, 21 Nov 2015 12:26:07 +0100 Subject: [PATCH 2/7] Cosmetics --- .../mainwindow/rendering/renderwidget.cpp | 8 ++++---- .../kernel/rendering/serialrenderercontroller.cpp | 14 +++++++------- .../kernel/rendering/serialrenderercontroller.h | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/appleseed.studio/mainwindow/rendering/renderwidget.cpp b/src/appleseed.studio/mainwindow/rendering/renderwidget.cpp index 1ebaf98d47..d38763c311 100644 --- a/src/appleseed.studio/mainwindow/rendering/renderwidget.cpp +++ b/src/appleseed.studio/mainwindow/rendering/renderwidget.cpp @@ -203,8 +203,8 @@ void RenderWidget::highlight_region( uint8* dest = get_image_pointer(m_image, x, y); // Draw a bracket around the tile. - const uint8 BracketColor[3] = { 255, 255, 255 }; const size_t BracketExtent = 5; + const uint8 BracketColor[3] = { 255, 255, 255 }; draw_bracket( dest, width, @@ -235,10 +235,10 @@ void RenderWidget::blit_frame(const Frame& frame) allocate_working_storage(frame_props); - for (size_t ty = 0; ty < frame_props.m_tile_count_y; ++ty) + for (size_t y = 0; y < frame_props.m_tile_count_y; ++y) { - for (size_t tx = 0; tx < frame_props.m_tile_count_x; ++tx) - blit_tile_no_lock(frame, tx, ty); + for (size_t x = 0; x < frame_props.m_tile_count_x; ++x) + blit_tile_no_lock(frame, x, y); } } diff --git a/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.cpp b/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.cpp index cfb9a28b13..c4eaf2c499 100644 --- a/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.cpp +++ b/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.cpp @@ -58,9 +58,9 @@ void SerialRendererController::on_rendering_begin() void SerialRendererController::on_rendering_success() { - // Execute any pending callback since the - // last time on_progress was called. + // Execute any pending callback since the last time on_progress() was called. exec_callbacks(); + m_controller->on_rendering_success(); } @@ -142,20 +142,20 @@ void SerialRendererController::add_post_render_tile_callback(const Frame* frame) m_pending_callbacks.push_back(callback); } -void SerialRendererController::exec_callback(const PendingTileCallback& call) +void SerialRendererController::exec_callback(const PendingTileCallback& cb) { - switch (call.m_type) + switch (cb.m_type) { case PendingTileCallback::PreRender: - m_tile_callback->pre_render(call.m_x, call.m_y, call.m_width, call.m_height); + m_tile_callback->pre_render(cb.m_x, cb.m_y, cb.m_width, cb.m_height); break; case PendingTileCallback::PostRenderTile: - m_tile_callback->post_render_tile(call.m_frame, call.m_x, call.m_y); + m_tile_callback->post_render_tile(cb.m_frame, cb.m_x, cb.m_y); break; case PendingTileCallback::PostRender: - m_tile_callback->post_render(call.m_frame); + m_tile_callback->post_render(cb.m_frame); break; assert_otherwise; diff --git a/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.h b/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.h index f81f938161..0b3a3cfa06 100644 --- a/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.h +++ b/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.h @@ -105,7 +105,7 @@ class SerialRendererController boost::mutex m_mutex; std::deque m_pending_callbacks; - void exec_callback(const PendingTileCallback& call); + void exec_callback(const PendingTileCallback& cb); void exec_callbacks(); }; From 349f38c42802e4e46b3622ec45c3853ede9bb990 Mon Sep 17 00:00:00 2001 From: Francois Beaune Date: Sat, 21 Nov 2015 12:27:11 +0100 Subject: [PATCH 3/7] Call pending tile callbacks when aborting rendering --- .../renderer/kernel/rendering/serialrenderercontroller.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.cpp b/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.cpp index c4eaf2c499..31fd937074 100644 --- a/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.cpp +++ b/src/appleseed/renderer/kernel/rendering/serialrenderercontroller.cpp @@ -66,6 +66,9 @@ void SerialRendererController::on_rendering_success() void SerialRendererController::on_rendering_abort() { + // Execute any pending callback since the last time on_progress() was called. + exec_callbacks(); + m_controller->on_rendering_abort(); } From a66101b60bbc3eaf0aa9127b6b058d8482966da8 Mon Sep 17 00:00:00 2001 From: Francois Beaune Date: Sat, 21 Nov 2015 18:39:15 +0100 Subject: [PATCH 4/7] Simplify code --- .../project/materialcollectionitem.cpp | 7 +-- .../modeling/material/disneymaterial.cpp | 47 ++++++++++--------- .../modeling/material/disneymaterial.h | 8 +++- 3 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/appleseed.studio/mainwindow/project/materialcollectionitem.cpp b/src/appleseed.studio/mainwindow/project/materialcollectionitem.cpp index ed8066d138..430af4c562 100644 --- a/src/appleseed.studio/mainwindow/project/materialcollectionitem.cpp +++ b/src/appleseed.studio/mainwindow/project/materialcollectionitem.cpp @@ -95,15 +95,15 @@ MaterialCollectionItem::MaterialCollectionItem( } #ifdef APPLESEED_WITH_DISNEY_MATERIAL + const Material& MaterialCollectionItem::create_default_disney_material(const string& material_name) { auto_release_ptr material = DisneyMaterialFactory().create(material_name.c_str(), ParamArray()); - Material* material_ptr = material.get(); - const Dictionary layer_values = static_cast(material.get())->get_new_layer_values(); - material->get_parameters().insert(layer_values.get("layer_name"), layer_values); + static_cast(material.get())->add_new_layer(); + Material* material_ptr = material.get(); add_item(material_ptr); EntityTraits::insert_entity(material, m_parent); @@ -111,6 +111,7 @@ const Material& MaterialCollectionItem::create_default_disney_material(const str return *material_ptr; } + #endif // APPLESEED_WITH_DISNEY_MATERIAL QMenu* MaterialCollectionItem::get_single_item_context_menu() const diff --git a/src/appleseed/renderer/modeling/material/disneymaterial.cpp b/src/appleseed/renderer/modeling/material/disneymaterial.cpp index 874ed604a5..370d8f4600 100644 --- a/src/appleseed/renderer/modeling/material/disneymaterial.cpp +++ b/src/appleseed/renderer/modeling/material/disneymaterial.cpp @@ -921,6 +921,22 @@ void DisneyMaterial::on_frame_end( Material::on_frame_end(project, assembly); } +void DisneyMaterial::add_new_layer() +{ + const string layer_name = make_unique_name("layer", impl->m_layers); + + int layer_number = 0; + for (const_each i = impl->m_layers; i; ++i) + layer_number = max(layer_number, i->get_layer_number()); + + const Dictionary layer_values = + DisneyMaterialLayer::get_default_values() + .insert("layer_name", layer_name) + .insert("layer_number", layer_number); + + m_params.insert(layer_name, layer_values); +} + size_t DisneyMaterial::get_layer_count() const { return impl->m_layers.size(); @@ -940,35 +956,22 @@ const DisneyMaterialLayer& DisneyMaterial::get_layer( vector* layers = impl->m_per_thread_layers[thread_index]; - if (layers) - return (*layers)[index]; + if (layers == 0) + { + layers = new vector(impl->m_layers); - layers = new vector(impl->m_layers); + for (const_each > it = *layers; it; ++it) + { + const bool ok = it->prepare_expressions(); + assert(ok); + } - for (const_each > it = *layers; it; ++it) - { - const bool ok = it->prepare_expressions(); - assert(ok); + impl->m_per_thread_layers[thread_index] = layers; } - impl->m_per_thread_layers[thread_index] = layers; - return (*layers)[index]; } -Dictionary DisneyMaterial::get_new_layer_values() const -{ - int layer_number = 0; - - for (const_each i = impl->m_layers; i; ++i) - layer_number = max(layer_number, i->get_layer_number()); - - return - DisneyMaterialLayer::get_default_values() - .insert("layer_name", make_unique_name("layer", impl->m_layers)) - .insert("layer_number", layer_number); -} - bool DisneyMaterial::prepare_layers(const MessageContext& context) { assert(impl->m_layers.empty()); diff --git a/src/appleseed/renderer/modeling/material/disneymaterial.h b/src/appleseed/renderer/modeling/material/disneymaterial.h index 4fd16322f6..5ccc878ef9 100644 --- a/src/appleseed/renderer/modeling/material/disneymaterial.h +++ b/src/appleseed/renderer/modeling/material/disneymaterial.h @@ -159,14 +159,17 @@ class APPLESEED_DLLSYMBOL DisneyMaterial const Project& project, const Assembly& assembly) APPLESEED_OVERRIDE; + // Add a new layer using default values to the material. + void add_new_layer(); + + // Retrieve the number of layers in the material. size_t get_layer_count() const; + // Retrieve a given layer of the material. const DisneyMaterialLayer& get_layer( const size_t index, const size_t thread_index = ~0) const; - foundation::Dictionary get_new_layer_values() const; - private: friend class DisneyMaterialFactory; @@ -181,6 +184,7 @@ class APPLESEED_DLLSYMBOL DisneyMaterial // Destructor. ~DisneyMaterial(); + // Prepare all layers for rendering. Returns true on success. bool prepare_layers(const MessageContext& context); }; From 933345a13c8706fd9eba2a4a462e06e870a669c0 Mon Sep 17 00:00:00 2001 From: Francois Beaune Date: Sun, 22 Nov 2015 10:09:08 +0100 Subject: [PATCH 5/7] Add DisneyMaterial::add_layer() --- .../project/materialcollectionitem.cpp | 2 +- .../modeling/material/disneymaterial.cpp | 34 +++++++++++++------ .../modeling/material/disneymaterial.h | 9 ++++- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/appleseed.studio/mainwindow/project/materialcollectionitem.cpp b/src/appleseed.studio/mainwindow/project/materialcollectionitem.cpp index 430af4c562..5aece4ed55 100644 --- a/src/appleseed.studio/mainwindow/project/materialcollectionitem.cpp +++ b/src/appleseed.studio/mainwindow/project/materialcollectionitem.cpp @@ -101,7 +101,7 @@ const Material& MaterialCollectionItem::create_default_disney_material(const str auto_release_ptr material = DisneyMaterialFactory().create(material_name.c_str(), ParamArray()); - static_cast(material.get())->add_new_layer(); + static_cast(material.get())->add_new_default_layer(); Material* material_ptr = material.get(); add_item(material_ptr); diff --git a/src/appleseed/renderer/modeling/material/disneymaterial.cpp b/src/appleseed/renderer/modeling/material/disneymaterial.cpp index 370d8f4600..e40cd4cac6 100644 --- a/src/appleseed/renderer/modeling/material/disneymaterial.cpp +++ b/src/appleseed/renderer/modeling/material/disneymaterial.cpp @@ -921,20 +921,34 @@ void DisneyMaterial::on_frame_end( Material::on_frame_end(project, assembly); } -void DisneyMaterial::add_new_layer() +string DisneyMaterial::add_layer(Dictionary layer_values) { - const string layer_name = make_unique_name("layer", impl->m_layers); - - int layer_number = 0; - for (const_each i = impl->m_layers; i; ++i) - layer_number = max(layer_number, i->get_layer_number()); + // Assign a name to the layer if there isn't one already. + if (!layer_values.strings().exist("layer_name")) + { + const string layer_name = make_unique_name("layer", impl->m_layers); + layer_values.insert("layer_name", layer_name); + } - const Dictionary layer_values = - DisneyMaterialLayer::get_default_values() - .insert("layer_name", layer_name) - .insert("layer_number", layer_number); + // Assign a number to the layer if there isn't one already. + if (!layer_values.strings().exist("layer_number")) + { + int layer_number = 0; + for (const_each i = impl->m_layers; i; ++i) + layer_number = max(layer_number, i->get_layer_number()); + layer_values.insert("layer_number", layer_number); + } + // Insert the layer into the material. + const string& layer_name = layer_values.get("layer_name"); m_params.insert(layer_name, layer_values); + + return layer_name; +} + +string DisneyMaterial::add_new_default_layer() +{ + return add_layer(DisneyMaterialLayer::get_default_values()); } size_t DisneyMaterial::get_layer_count() const diff --git a/src/appleseed/renderer/modeling/material/disneymaterial.h b/src/appleseed/renderer/modeling/material/disneymaterial.h index 5ccc878ef9..7b212a0a17 100644 --- a/src/appleseed/renderer/modeling/material/disneymaterial.h +++ b/src/appleseed/renderer/modeling/material/disneymaterial.h @@ -159,8 +159,15 @@ class APPLESEED_DLLSYMBOL DisneyMaterial const Project& project, const Assembly& assembly) APPLESEED_OVERRIDE; + // Add a new layer with given values to the material. + // A name and a number will be automatically assigned + // to the layer if it lacks them. + // Returns the name of the layer. + std::string add_layer( + foundation::Dictionary layer_values); + // Add a new layer using default values to the material. - void add_new_layer(); + std::string add_new_default_layer(); // Retrieve the number of layers in the material. size_t get_layer_count() const; From 37f0095e9ad436d305f05383d1b0678d6e51c1d1 Mon Sep 17 00:00:00 2001 From: Francois Beaune Date: Sun, 22 Nov 2015 10:37:20 +0100 Subject: [PATCH 6/7] Don't return std::string in a public API --- .../renderer/modeling/material/disneymaterial.cpp | 8 +++----- src/appleseed/renderer/modeling/material/disneymaterial.h | 5 ++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/appleseed/renderer/modeling/material/disneymaterial.cpp b/src/appleseed/renderer/modeling/material/disneymaterial.cpp index e40cd4cac6..b6aa6cc5da 100644 --- a/src/appleseed/renderer/modeling/material/disneymaterial.cpp +++ b/src/appleseed/renderer/modeling/material/disneymaterial.cpp @@ -921,7 +921,7 @@ void DisneyMaterial::on_frame_end( Material::on_frame_end(project, assembly); } -string DisneyMaterial::add_layer(Dictionary layer_values) +void DisneyMaterial::add_layer(Dictionary layer_values) { // Assign a name to the layer if there isn't one already. if (!layer_values.strings().exist("layer_name")) @@ -942,13 +942,11 @@ string DisneyMaterial::add_layer(Dictionary layer_values) // Insert the layer into the material. const string& layer_name = layer_values.get("layer_name"); m_params.insert(layer_name, layer_values); - - return layer_name; } -string DisneyMaterial::add_new_default_layer() +void DisneyMaterial::add_new_default_layer() { - return add_layer(DisneyMaterialLayer::get_default_values()); + add_layer(DisneyMaterialLayer::get_default_values()); } size_t DisneyMaterial::get_layer_count() const diff --git a/src/appleseed/renderer/modeling/material/disneymaterial.h b/src/appleseed/renderer/modeling/material/disneymaterial.h index 7b212a0a17..43371234d7 100644 --- a/src/appleseed/renderer/modeling/material/disneymaterial.h +++ b/src/appleseed/renderer/modeling/material/disneymaterial.h @@ -162,12 +162,11 @@ class APPLESEED_DLLSYMBOL DisneyMaterial // Add a new layer with given values to the material. // A name and a number will be automatically assigned // to the layer if it lacks them. - // Returns the name of the layer. - std::string add_layer( + void add_layer( foundation::Dictionary layer_values); // Add a new layer using default values to the material. - std::string add_new_default_layer(); + void add_new_default_layer(); // Retrieve the number of layers in the material. size_t get_layer_count() const; From 5caeaaf769691733d14efc8bd41b74d7b7ce56f9 Mon Sep 17 00:00:00 2001 From: Francois Beaune Date: Sun, 22 Nov 2015 14:53:07 +0100 Subject: [PATCH 7/7] Add foundation::is_zero(foundation::Color<>) --- src/appleseed/foundation/image/color.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/appleseed/foundation/image/color.h b/src/appleseed/foundation/image/color.h index f661c0bc28..44a1bfe9e4 100644 --- a/src/appleseed/foundation/image/color.h +++ b/src/appleseed/foundation/image/color.h @@ -88,6 +88,9 @@ class Color template bool operator!=(const Color& lhs, const Color& rhs); template bool operator==(const Color& lhs, const Color& rhs); +// Return whether all components of a color are exactly zero. +template bool is_zero(const Color& c); + // Approximate equality tests. template bool feq(const Color& lhs, const Color& rhs); template bool feq(const Color& lhs, const Color& rhs, const T eps); @@ -338,6 +341,18 @@ inline bool operator==(const Color& lhs, const Color& rhs) return !(lhs != rhs); } +template +inline bool is_zero(const Color& c) +{ + for (size_t i = 0; i < N; ++i) + { + if (c[i] != T(0.0)) + return false; + } + + return true; +} + template inline bool feq(const Color& lhs, const Color& rhs) {