Home | History | Annotate | Download | only in ocl
      1 /*
      2  * cl_blender.h - CL blender
      3  *
      4  *  Copyright (c) 2016 Intel Corporation
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  *
     18  * Author: Wind Yuan <feng.yuan (at) intel.com>
     19  */
     20 
     21 #ifndef XCAM_CL_BLENDER_H
     22 #define XCAM_CL_BLENDER_H
     23 
     24 #include <xcam_std.h>
     25 #include <interface/data_types.h>
     26 #include <interface/blender.h>
     27 #include <ocl/cl_image_handler.h>
     28 
     29 #define XCAM_CL_BLENDER_ALIGNMENT_X 8
     30 #define XCAM_CL_BLENDER_ALIGNMENT_Y 1
     31 
     32 namespace XCam {
     33 
     34 enum CLBlenderScaleMode {
     35     CLBlenderScaleLocal = 0,
     36     CLBlenderScaleGlobal,
     37     CLBlenderScaleMax
     38 };
     39 
     40 enum {
     41     CLBlenderPlaneY = 0,
     42     CLBlenderPlaneUV,
     43     CLBlenderPlaneMax,
     44 };
     45 
     46 class CLBlenderScaleKernel
     47     : public CLImageKernel
     48 {
     49 public:
     50     explicit CLBlenderScaleKernel (const SmartPtr<CLContext> &context, bool is_uv);
     51 
     52 protected:
     53     virtual XCamReturn prepare_arguments (
     54         CLArgList &args, CLWorkSize &work_size);
     55 
     56     virtual SmartPtr<CLImage> get_input_image () = 0;
     57     virtual SmartPtr<CLImage> get_output_image () = 0;
     58 
     59     virtual bool get_output_info (uint32_t &out_width, uint32_t &out_height, int &out_offset_x) = 0;
     60 
     61 private:
     62     XCAM_DEAD_COPY (CLBlenderScaleKernel);
     63 
     64 protected:
     65     bool                               _is_uv;
     66 };
     67 
     68 class CLBlender
     69     : public CLImageHandler, public Blender
     70 {
     71 public:
     72     explicit CLBlender (
     73         const SmartPtr<CLContext> &context, const char *name,
     74         bool need_uv, CLBlenderScaleMode scale_mode);
     75 
     76     //derived from Blender
     77     virtual bool set_input_merge_area (const Rect &area, uint32_t index);
     78 
     79     bool need_uv () const {
     80         return _need_uv;
     81     }
     82 
     83     CLBlenderScaleMode get_scale_mode () const {
     84         return _scale_mode;
     85     }
     86 
     87     void swap_input_idx (bool flag) {
     88         _swap_input_index = flag;
     89     }
     90 
     91 protected:
     92     virtual XCamReturn prepare_parameters (SmartPtr<VideoBuffer> &input, SmartPtr<VideoBuffer> &output);
     93     virtual XCamReturn prepare_buffer_pool_video_info (
     94         const VideoBufferInfo &input,
     95         VideoBufferInfo &output);
     96 
     97     //abstract virtual functions
     98     virtual XCamReturn allocate_cl_buffers (
     99         SmartPtr<CLContext> context, SmartPtr<VideoBuffer> &input0,
    100         SmartPtr<VideoBuffer> &input1, SmartPtr<VideoBuffer> &output) = 0;
    101 
    102 private:
    103     XCAM_DEAD_COPY (CLBlender);
    104 
    105 private:
    106     bool                             _need_uv;
    107     bool                             _swap_input_index;
    108     CLBlenderScaleMode               _scale_mode;
    109 };
    110 
    111 SmartPtr<CLImageHandler>
    112 create_linear_blender (const SmartPtr<CLContext> &context, bool need_uv = true);
    113 
    114 SmartPtr<CLImageHandler>
    115 create_pyramid_blender (
    116     const SmartPtr<CLContext> &context, int layer = 1, bool need_uv = true,
    117     bool need_seam = true, CLBlenderScaleMode scale_mode = CLBlenderScaleLocal);
    118 
    119 };
    120 
    121 #endif //XCAM_CL_BLENDER_H
    122