11#include <nv/index/icompute.h>
12#include <nv/index/idistributed_data_access.h>
15#define USE_NVINDEX_ACCESS
16#include "utility/example_shared.h"
17#include "utility/app_rendering_context.h"
18#include "utility/canvas_utility.h"
20#include <nv/index/app/iimage_importer.h>
21#include <nv/index/app/index_connect_.h>
31 public nv::index::app::Index_connect
54 mi::neuraylib::INetwork_configuration* network_configuration,
55 nv::index::app::String_dict& options) CPP11_OVERRIDE
60 const bool is_unittest = nv::index::app::get_bool(options.get(
"unittest"));
63 info_cout(
"NETWORK: disabled networking mode.", options);
64 network_configuration->set_mode(mi::neuraylib::INetwork_configuration:
:MODE_OFF);
68 return initialize_networking_as_default_udp(network_configuration, options);
74 mi::neuraylib::Tag m_session_tag;
76 mi::base::Handle<nv::index::ICluster_configuration> m_cluster_configuration;
78 mi::base::Handle<nv::index::app::canvas_infrastructure::IIndex_image_file_canvas> m_image_file_canvas;
80 std::string m_outfname;
101using mi::base::Handle;
102using mi::neuraylib::IDice_transaction;
103using mi::neuraylib::Tag_struct;
110 int argc,
char* argv[])
113 process_command_line(argc, argv, opt_map.
get_map());
115 if (nv::index::app::get_bool(opt_map[
"unittest"])) {
116 if (nv::index::app::get_bool(opt_map[
"is_call_from_test"])) {
117 opt_map[
"is_dump_comparison_image_when_failed"] =
"0";
119 opt_map[
"outfname"] =
"";
120 opt_map[
"dice::verbose"] =
"2";
122 const std::string com_name(argv[0]);
123 info_cout(std::string(
"running ") + com_name, opt_map.
get_map());
124 info_cout(std::string(
"outfname = [") + opt_map[
"outfname"] +
125 "], verify_image_fname = [" + opt_map[
"verify_image_fname"] +
126 "], dice::verbose = " + opt_map[
"dice::verbose"], opt_map.
get_map());
131 std::cout <<
"info: Usage: " << com_name <<
" [option]\n" <<
get_usage(opt_map);
136 int iscene = nv::index::app::get_sint32(opt_map[
"scene"]);
147 std::ostringstream os;
148 const mi::Uint32 nb_err = err_set->get_nb_errors();
149 for (mi::Uint32 e = 0; e < nb_err; ++e)
151 if (e != 0) os <<
'\n';
152 Handle<const nv::index::IError> err(err_set->get_error(e));
153 os << err->get_error_string();
165 x = ((x & 0xaaaaaaaau) >> 1u) | ((x & 0x55555555u) << 1u);
166 x = ((x & 0xccccccccu) >> 2u) | ((x & 0x33333333u) << 2u);
167 x = ((x & 0xf0f0f0f0u) >> 4u) | ((x & 0x0f0f0f0fu) << 4u);
168 x = ((x & 0xff00ff00u) >> 8u) | ((x & 0x00ff00ffu) << 8u);
169 x = (x >> 16u) | (x << 16u);
178 nv::index::app::IApplication_layer* app_layer,
180 const std::string& plane_img_basename,
181 const std::string& verify_img_basename)
185 ,
img_basename(!verify_img_basename.empty() ? verify_img_basename : plane_img_basename)
194 std::vector<mi::math::Color_struct>
colors;
209 mi::base::Handle<nv::index::app::image::IImage_importer> image_importer(
210 app_layer_ref->get_api_component<nv::index::app::image::IImage_importer>());
212 mi::base::Handle<mi::neuraylib::ICanvas> canvas(
213 image_importer->create_canvas_from_file(imgfname.c_str()));
216 std::map<std::string, std::string> opt_map;
218 opt_map[
"is_dump_comparison_image"] =
"0";
220 opt_map[
"is_dump_comparison_image_when_failed"] =
"0";
221 return verify_canvas_result(
app_layer_ref, canvas.get(), imgfname, opt_map);
233 Nvindex_access& nvindex_accessor,
235 const nv::index::ICompute_results* cpt_results,
236 IDice_transaction* transaction,
237 const std::string& plane_img_basename,
238 const std::string& verify_img_basename)
240 if (cpt_results == NULL) {
241 ERROR_LOG <<
"NULL compute results.";
245 if (!cpt_results->is_valid()) {
246 ERROR_LOG <<
"Invalid compute results.";
249 Handle<const nv::index::IError_set> err_set(cpt_results->get_error_set());
250 if (err_set && err_set->any_errors()) {
251 ERROR_LOG <<
"Compute results has errors: \n" <<
get_error_info(err_set.get());
256 const bool use_compute_plane = launch_info.
plane_tag.is_valid();
257 if (use_compute_plane) {
258 Handle<nv::index::IDistributed_data_access> data_access(cpt_results->access_compute_results());
260 ERROR_LOG <<
"Compute plane results - no data access.";
264 const int access_status = data_access->access(
268 if (access_status < 0) {
269 ERROR_LOG <<
"Compute plane results - access error " << access_status <<
".";
273 Handle<const nv::index::IDistributed_data_subset> result_data_subset(
274 data_access->get_distributed_data_subset());
275 if (!result_data_subset) {
276 ERROR_LOG <<
"Compute plane results - no data subset.";
279 Handle<const nv::index::ICompute_result_buffer_2D> result_buffer(
280 result_data_subset->get_interface<
const nv::index::ICompute_result_buffer_2D>());
281 if (!result_buffer) {
282 ERROR_LOG <<
"Compute plane results - data subset is not result buffer.";
287 std::ostringstream ss;
288 const Vec2u res = result_buffer->get_resolution();
289 ss <<
"Compute plane result [" << res.x <<
"x" << res.y <<
"]["
290 << result_buffer->get_nb_values() <<
"] ( ";
291 for (mi::Uint32 i=0; i < result_buffer->get_nb_values(); ++i) {
292 ss << result_buffer->get_value_size(i) <<
" ";
295 INFO_LOG << ss.str();
299 res, plane_img_basename, verify_img_basename);
303 const size_t nb_pixels = res.x * res.y;
306 const float* values =
reinterpret_cast<const float*
>(result_buffer->get_values(0));
307 for (
size_t i = 0; i < nb_pixels; ++i) {
309 mi::math::Color_struct col = {s,s,s,1.f};
316 const mi::Uint32* masks = result_buffer->get_value_masks();
317 const mi::math::Color_struct mcol[2] = {
318 {1.f, 0.f, 0.f, 1.f},
321 for (
size_t i = 0; i < nb_pixels; ++i) {
322 helper.
colors[i] = mcol[masks[i] & 0x1];
328 const Vec3f* values2 =
reinterpret_cast<const Vec3f*
>(result_buffer->get_values(1));
329 for (
size_t i = 0; i < nb_pixels; ++i) {
330 Vec3f v = values2[i];
331 mi::math::Color_struct col = {v.x, v.y, v.z, 1.f};
338 if (result_buffer->get_nb_values() > 2) {
339 const mi::Uint32* values3 =
reinterpret_cast<const mi::Uint32*
>(result_buffer->get_values(2));
340 for (
size_t i = 0; i < nb_pixels; ++i) {
341 mi::Uint32 v =
reverse(values3[i] * 0x18273645u);
342 mi::math::Color_struct col = {
343 ((v >> 24) & 0xff) / 255.f,
344 ((v >> 16) & 0xff) / 255.f,
345 ((v >> 8) & 0xff) / 255.f,
353 if (result_buffer->get_nb_values() > 3) {
354 const mi::Uint32* values4 =
reinterpret_cast<const mi::Uint32*
>(result_buffer->get_values(3));
355 for (
size_t i = 0; i < nb_pixels; ++i) {
356 float s = values4[i] * 0.1f;
357 mi::math::Color_struct col = {s,s,s,1.f};
371 Nvindex_access& nvindex_accessor,
373 const Handle<const nv::index::ICompute_results>& cpt_results,
374 App_rendering_context& arc,
378 Handle<IDice_transaction> transaction(arc.m_global_scope->create_transaction<IDice_transaction>());
380 std::string plane_img_basename = get_output_file_name(opt_map[
"outfname"], frame_idx);
382 std::stringstream ref_img_opt;
383 ref_img_opt <<
"verify_plane_fname_" << frame_idx;
384 std::string verify_fname = opt_map[ref_img_opt.str()];
387 print_compute_info(nvindex_accessor, launch_info, cpt_results.get(), transaction.get(), plane_img_basename, verify_fname);
389 transaction->commit();
398Handle<const nv::index::ICompute_results>
400 Nvindex_access& nvindex_accessor,
402 App_rendering_context& arc,
405 const bool use_compute_plane = nv::index::app::get_sint32(opt_map[
"compute_plane"]) != 0;
408 Handle<IDice_transaction> transaction(arc.m_global_scope->create_transaction<IDice_transaction>());
418 arc.m_iindex_session->update(arc.m_session_tag, transaction.get());
421 Handle<nv::index::IIndex_compute> index_compute(nvindex_accessor.get_interface()->get_api_component<nv::index::IIndex_compute>());
425 Handle<nv::index::ICompute_launch_request> launch_request(index_compute->create_launch_request());
429 if (use_compute_plane) {
431 launch_request->set_launch(
437 launch_request->set_launch(
444 launch_request->set_region_of_interest(launch_info.
compute_roi);
449 Handle<const nv::index::ICompute_results> cpt_results;
451 if (launch_request->is_valid()) {
452 cpt_results = index_compute->perform_compute(
453 launch_request.get(),
454 arc.m_iindex_rendering.get(),
459 ERROR_LOG <<
"Invalid compute launch request.";
462 transaction->commit();
469 Nvindex_access& nvindex_accessor,
471 App_rendering_context& arc,
475 Handle<const nv::index::ICompute_results> cpt_results =
478 return print_compute_info(nvindex_accessor, launch_info, cpt_results, arc, opt_map, frame_idx);
485 Nvindex_access& nvindex_accessor,
486 mi::Sint32 frame_idx,
487 App_rendering_context& arc,
490 const std::string out_fname = get_output_file_name(opt_map[
"outfname"], frame_idx);
492 INFO_LOG <<
"Rendering frame " << (frame_idx + 1) <<
" \n";
493 Handle<const nv::index::IFrame_results> frame_results(
render_frame(arc, out_fname));
494 Handle<const nv::index::IError_set> err_set(frame_results->get_error_set());
495 if (err_set && err_set->any_errors()) {
496 ERROR_LOG <<
"IIndex_rendering rendering call failed with the following error(s): \n"
504 std::stringstream ref_img_opt;
505 ref_img_opt <<
"verify_image_fname_" << frame_idx;
507 std::string verify_fname = opt_map[ref_img_opt.str()];
508 if (!verify_fname.empty()) {
509 if (!(verify_canvas_result(nvindex_accessor.get_application_layer_interface(),
510 arc.m_image_canvas.get(), verify_fname, opt_map.
get_map()))) {
520 Nvindex_access& nvindex_accessor,
522 App_rendering_context& arc,
526 Handle<IDice_transaction> transaction(arc.m_global_scope->create_transaction<IDice_transaction>());
536 arc.m_iindex_session->update(arc.m_session_tag, transaction.get());
538 scene_setup->
unload_scene(arc.m_session_tag, opt_map, transaction.get());
539 transaction->commit();
545 Handle<IDice_transaction> transaction(arc.m_global_scope->create_transaction<IDice_transaction>());
555 arc.m_iindex_session->update(arc.m_session_tag, transaction.get());
557 ok = scene_setup->
reload_scene(nvindex_accessor, arc.m_session_tag, opt_map, transaction.get());
558 transaction->commit();
571 Nvindex_access& nvindex_accessor,
574 mi::Sint32 exit_code = 0;
576 const char* sep_line =
"----------------------------------------------------------------------------";
578 App_rendering_context arc;
584 INFO_LOG <<
"\n" << sep_line <<
"\n XAC Compute Example - Scene " << scene_setup->
name() <<
"\n" << sep_line;
588 setup_scene(nvindex_accessor, scene_setup, launch_info, arc, opt_map);
592 const mi::Uint32 compute_mode = nv::index::app::get_uint32(opt_map[
"run_compute"]);
596 if (compute_mode >= 2) {
597 if (!
run_compute(nvindex_accessor, launch_info, arc, opt_map, frame_idx)) {
605 INFO_LOG << sep_line;
614 if (compute_mode == 1 || compute_mode == 3) {
615 if (!
run_compute(nvindex_accessor, launch_info, arc, opt_map, frame_idx)) {
622 INFO_LOG << sep_line;
630 if (nv::index::app::get_bool(opt_map[
"export_scene"])) {
636 if (!
reload_scene(nvindex_accessor, scene_setup, arc, opt_map)) {
640 INFO_LOG << sep_line;
654int main(
int argc,
char* argv[])
662 const std::string comp_dso_prefix =
"libnvindex_application_layer_";
663 const std::string plug_dso_prefix =
"libnvindex_plugin_";
664 Nvindex_access nvindex_accessor;
666 check_success(nvindex_accessor.load_application_layer_library());
667 check_success(nvindex_accessor.load_application_layer_component((comp_dso_prefix +
"canvas_infrastructure").c_str()));
668 check_success(nvindex_accessor.load_application_layer_component((comp_dso_prefix +
"image").c_str()));
669 check_success(nvindex_accessor.load_application_layer_component((comp_dso_prefix +
"io").c_str()));
670 check_success(nvindex_accessor.load_application_layer_component((comp_dso_prefix +
"data_analysis_and_processing").c_str()));
671 check_success(nvindex_accessor.load_application_layer_plugin( (plug_dso_prefix +
"base_importer"). c_str()));
672 check_success(nvindex_accessor.load_application_layer_plugin( (plug_dso_prefix +
"legacy_importer").c_str()));
675 if (!nvindex_accessor.is_initialized()) {
676 info_cout(
"Fatal error! Initialization of the IndeX library failed.", opt_map.
get_map());
680 mi::Sint32 exit_code =
run_test_sequence(scene_setup, nvindex_accessor, opt_map);
682 nvindex_accessor.shutdown();
virtual ~Create_xac_compute_index_connect()
Create_xac_compute_index_connect()
virtual bool initialize_networking(mi::neuraylib::INetwork_configuration *network_configuration, nv::index::app::String_dict &options) CPP11_OVERRIDE
virtual const char * name() const =0
virtual bool can_reload() const
virtual void unload_scene(mi::neuraylib::Tag session_tag, const Option_map &opt_map, mi::neuraylib::IDice_transaction *transaction) const
virtual bool reload_scene(Nvindex_access &nvindex_accessor, mi::neuraylib::Tag session_tag, const Option_map &opt_map, mi::neuraylib::IDice_transaction *transaction) const
bool has_key(const std::string &key) const
XAC compute example scenes.
void setup_app_context(App_rendering_context &arc, Nvindex_access &nvindex_accessor)
void start_nvindex_service(Nvindex_access &nvindex_accessor, const Option_map &opt_map, const xac_compute::IXac_compute_scene_setup *scene_setup)
bool render_frame_and_save_or_verify(Nvindex_access &nvindex_accessor, mi::Sint32 frame_idx, App_rendering_context &arc, const Option_map &opt_map)
bool export_scene_data(const xac_compute::IXac_compute_scene_setup *scene_setup, App_rendering_context &arc, const Option_map &opt_map)
void get_default_options(Option_map &opt_map)
mi::Uint32 reverse(mi::Uint32 x)
Handle< const nv::index::ICompute_results > perform_compute(Nvindex_access &nvindex_accessor, const Compute_launch_info &launch_info, App_rendering_context &arc, const Option_map &opt_map)
const IXac_compute_scene_setup * handle_arguments(Option_map &opt_map, int argc, char *argv[])
void setup_scene(Nvindex_access &nvindex_accessor, const xac_compute::IXac_compute_scene_setup *scene_setup, Compute_launch_info &info, App_rendering_context &arc, const Option_map &opt_map)
std::string get_usage(const Option_map &opt_map)
bool print_compute_info(Nvindex_access &nvindex_accessor, const Compute_launch_info &launch_info, const nv::index::ICompute_results *cpt_results, IDice_transaction *transaction, const std::string &plane_img_basename, const std::string &verify_img_basename)
nv::index::IFrame_results * render_frame(App_rendering_context &arc, const std::string &output_fname)
mi::Sint32 run_test_sequence(const IXac_compute_scene_setup *scene_setup, Nvindex_access &nvindex_accessor, const Option_map &opt_map)
const IXac_compute_scene_setup * get_scene_setup(int i)
void print_performance(const nv::index::IPerformance_values *performance_values, const Option_map &opt_map, const char *info)
mi::math::Vector< mi::Float32, 3 > Vec3f
std::string get_error_info(const nv::index::IError_set *err_set)
mi::math::Vector< mi::Uint32, 2 > Vec2u
bool reload_scene(Nvindex_access &nvindex_accessor, const IXac_compute_scene_setup *scene_setup, App_rendering_context &arc, const Option_map &opt_map)
bool run_compute(Nvindex_access &nvindex_accessor, const Compute_launch_info &launch_info, App_rendering_context &arc, const Option_map &opt_map, int frame_idx)
void setup_performance_monitoring(App_rendering_context &arc, const Option_map &opt_map)
std::map< std::string, std::string > Option_map
#define check_success(expr)
mi::neuraylib::Tag plane_tag
mi::neuraylib::Tag scene_element_tag
mi::neuraylib::Tag plane_compute_program_tag
mi::neuraylib::Tag compute_program_tag
std::vector< mi::math::Color_struct > colors
bool write_or_verify(const char *postfix) const
nv::index::app::IApplication_layer * app_layer_ref
Plane_img_helper(nv::index::app::IApplication_layer *app_layer, const Vec2u &res, const std::string &plane_img_basename, const std::string &verify_img_basename)
int main(int argc, char *argv[])
XAC Compute example definitions.
XAC compute example app setup.
Scene setup interface for xac compute example.