| /* |
| * soft_worker.h - soft worker class |
| * |
| * Copyright (c) 2017 Intel Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * Author: Wind Yuan <[email protected]> |
| */ |
| |
| #ifndef XCAM_SOFT_WORKER_H |
| #define XCAM_SOFT_WORKER_H |
| |
| #include <xcam_std.h> |
| #include <worker.h> |
| |
| #define SOFT_MAX_DIM 3 |
| |
| namespace XCam { |
| |
| class ThreadPool; |
| |
| struct WorkRange { |
| uint32_t pos[SOFT_MAX_DIM]; |
| uint32_t pos_len[SOFT_MAX_DIM]; |
| |
| WorkRange () { |
| xcam_mem_clear (pos); |
| xcam_mem_clear (pos_len); |
| } |
| }; |
| |
| struct WorkSize { |
| uint32_t value[SOFT_MAX_DIM]; |
| WorkSize (uint32_t x = 1, uint32_t y = 1, uint32_t z = 1) { |
| value[0] = x; |
| value[1] = y; |
| value[2] = z; |
| } |
| }; |
| |
| //multi-thread worker |
| class SoftWorker |
| : public Worker |
| { |
| friend class WorkItem; |
| |
| public: |
| explicit SoftWorker (const char *name, const SmartPtr<Callback> &cb = NULL); |
| virtual ~SoftWorker (); |
| |
| bool set_work_uint (uint32_t x, uint32_t y, uint32_t z = 1); |
| const WorkSize &get_work_uint () const { |
| return _work_unit; |
| } |
| |
| bool set_threads (const SmartPtr<ThreadPool> &threads); |
| bool set_global_size (const WorkSize &size); |
| const WorkSize &get_global_size () const { |
| return _global; |
| } |
| bool set_local_size (const WorkSize &size); |
| const WorkSize &get_local_size () const { |
| return _local; |
| } |
| |
| // derived from Worker |
| virtual XCamReturn work (const SmartPtr<Arguments> &args); |
| virtual XCamReturn stop (); |
| |
| private: |
| //new virtual functions |
| virtual XCamReturn work_range (const SmartPtr<Arguments> &args, const WorkRange &range); |
| virtual WorkRange get_range (const WorkSize &item); |
| virtual XCamReturn work_unit (const SmartPtr<Arguments> &args, const WorkSize &unit); |
| |
| XCamReturn work_impl (const SmartPtr<Arguments> &args, const WorkSize &item); |
| void all_items_done (const SmartPtr<Arguments> &args, XCamReturn error); |
| |
| XCAM_DEAD_COPY (SoftWorker); |
| |
| private: |
| SmartPtr<ThreadPool> _threads; |
| WorkSize _global; |
| WorkSize _local; |
| WorkSize _work_unit; |
| }; |
| |
| } |
| #endif //XCAM_SOFT_WORKER_H |