1 
2 //
3 // This source file is part of appleseed.
4 // Visit https://appleseedhq.net/ for additional information and resources.
5 //
6 // This software is released under the MIT license.
7 //
8 // Copyright (c) 2010-2013 Francois Beaune, Jupiter Jazz Limited
9 // Copyright (c) 2014-2018 Francois Beaune, The appleseedhq Organization
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining a copy
12 // of this software and associated documentation files (the "Software"), to deal
13 // in the Software without restriction, including without limitation the rights
14 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 // copies of the Software, and to permit persons to whom the Software is
16 // furnished to do so, subject to the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be included in
19 // all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 // THE SOFTWARE.
28 //
29 
30 #pragma once
31 
32 // appleseed.renderer headers.
33 #include "renderer/global/globaltypes.h"
34 
35 // appleseed.foundation headers.
36 #include "foundation/platform/types.h"
37 #include "foundation/utility/job.h"
38 
39 // Standard headers.
40 #include <cstddef>
41 
42 // Forward declarations.
43 namespace renderer  { class ISampleGenerator; }
44 namespace renderer  { class SampleAccumulationBuffer; }
45 namespace renderer  { class SampleCounter; }
46 
47 namespace renderer
48 {
49 
50 class SampleGeneratorJob
51   : public foundation::IJob
52 {
53   public:
54     // Number of samples per job as a function of the number of samples already rendered.
55     static foundation::uint64 samples_to_samples_per_job(
56         const foundation::uint64    samples);
57 
58     // Constructor.
59     SampleGeneratorJob(
60         SampleAccumulationBuffer&   buffer,
61         ISampleGenerator*           sample_generator,
62         SampleCounter&              sample_counter,
63         const Spectrum::Mode        spectrum_mode,
64         foundation::JobQueue&       job_queue,
65         const size_t                job_index,
66         foundation::IAbortSwitch&   abort_switch);
67 
68     // Execute the job.
69     void execute(const size_t thread_index) override;
70 
71   private:
72     SampleAccumulationBuffer&       m_buffer;
73     ISampleGenerator*               m_sample_generator;
74     SampleCounter&                  m_sample_counter;
75     const Spectrum::Mode            m_spectrum_mode;
76     foundation::JobQueue&           m_job_queue;
77     const size_t                    m_job_index;
78     foundation::IAbortSwitch&       m_abort_switch;
79 };
80 
81 }   // namespace renderer
82