| /* |
| * Copyright (C) Texas Instruments - http://www.ti.com/ |
| * |
| * 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. |
| */ |
| #ifndef __RGZ_2D__ |
| #define __RGZ_2D__ |
| |
| #include <linux/bltsville.h> |
| |
| /* |
| * Maximum number of layers used to generate subregion rectangles in a |
| * horizontal region. |
| */ |
| #define RGZ_MAXLAYERS 13 |
| |
| /* |
| * Maximum number of layers the regionizer will accept as input. Account for an |
| * additional 'background layer' to generate empty subregion rectangles and |
| * a damage region as well. |
| */ |
| #define RGZ_INPUT_MAXLAYERS (RGZ_MAXLAYERS - 2) |
| |
| /* Number of framebuffers to track */ |
| #define RGZ_NUM_FB 2 |
| |
| /* |
| * Regionizer data |
| * |
| * This is an oqaque structure passed in by the client |
| */ |
| struct rgz; |
| typedef struct rgz rgz_t; |
| |
| /* |
| * With an open framebuffer file descriptor get the geometry of |
| * the device |
| */ |
| int rgz_get_screengeometry(int fd, struct bvsurfgeom *geom, int fmt); |
| |
| /* |
| * Regionizer input parameters |
| */ |
| struct rgz_in_hwc { |
| int flags; |
| int layerno; |
| hwc_layer_1_t *layers; |
| hwc_layer_extended_t *extlayers; |
| struct bvsurfgeom *dstgeom; |
| }; |
| |
| typedef struct rgz_in_params { |
| int op; /* See RGZ_IN_* */ |
| union { |
| struct rgz_in_hwc hwc; |
| } data; |
| } rgz_in_params_t; |
| |
| typedef struct rgz_ext_layer_list { |
| hwc_layer_extended_t layers[RGZ_INPUT_MAXLAYERS]; |
| } rgz_ext_layer_list_t; |
| |
| /* |
| * Validate whether the HWC layers can be rendered |
| * |
| * Arguments (rgz_in_params_t): |
| * op RGZ_IN_HWCCHK |
| * data.hwc.layers HWC layer array |
| * data.hwc.layerno HWC layer array size |
| * |
| * Returns: |
| * rv = RGZ_ALL, -1 failure |
| */ |
| #define RGZ_IN_HWCCHK 1 |
| |
| /* |
| * Regionize the HWC layers |
| * |
| * This generates region data which can be used with regionizer |
| * output function. This call will validate whether all or some of the |
| * layers can be rendered. |
| * |
| * The caller must use rgz_release when done with the region data |
| * |
| * Arguments (rgz_in_params_t): |
| * op RGZ_IN_HWC |
| * data.hwc.layers HWC layer array |
| * data.hwc.layerno HWC layer array size |
| * |
| * Returns: |
| * rv = RGZ_ALL, -1 failure |
| */ |
| #define RGZ_IN_HWC 2 |
| |
| int rgz_in(rgz_in_params_t *param, rgz_t *rgz); |
| |
| /* This means all layers can be blitted */ |
| #define RGZ_ALL 1 |
| |
| /* |
| * Free regionizer resources |
| */ |
| void rgz_release(rgz_t *rgz); |
| |
| /* |
| * Regionizer output operations |
| */ |
| struct rgz_out_bvcmd { |
| void *cmdp; |
| int cmdlen; |
| struct bvsurfgeom *dstgeom; |
| int noblend; |
| buffer_handle_t out_hndls[RGZ_INPUT_MAXLAYERS]; /* OUTPUT */ |
| int out_nhndls; /* OUTPUT */ |
| int out_blits; /* OUTPUT */ |
| }; |
| |
| struct rgz_out_svg { |
| int dispw; |
| int disph; |
| int htmlw; |
| int htmlh; |
| }; |
| |
| struct rgz_out_bvdirect { |
| struct bvbuffdesc *dstdesc; |
| struct bvsurfgeom *dstgeom; |
| int noblend; |
| }; |
| |
| typedef struct rgz_out_params { |
| int op; /* See RGZ_OUT_* */ |
| union { |
| struct rgz_out_bvcmd bvc; |
| struct rgz_out_bvdirect bv; |
| struct rgz_out_svg svg; |
| } data; |
| } rgz_out_params_t; |
| |
| /* |
| * Regionizer output commands |
| */ |
| |
| /* |
| * Output SVG from regionizer |
| * |
| * rgz_out_params_t: |
| * |
| * op RGZ_OUT_SVG |
| * data.svg.dispw |
| * data.svg.disph Display width and height these values will be the |
| * viewport dimensions i.e. the logical coordinate space |
| * rather than the physical size |
| * data.svg.htmlw |
| * data.svg.htmlh HTML output dimensions |
| */ |
| #define RGZ_OUT_SVG 0 |
| |
| /* |
| * This commands generates bltsville command data structures for HWC which will |
| * paint layer by layer |
| * |
| * rgz_out_params_t: |
| * |
| * op RGZ_OUT_BVCMD_PAINT |
| * data.bvc.cmdp Pointer to buffer with cmd data |
| * data.bvc.cmdlen length of cmdp |
| * data.bvc.dstgeom bltsville struct describing the destination geometry |
| * data.bvc.noblend Test option to disable blending |
| * data.bvc.out_hndls Array of buffer handles (OUTPUT) |
| * data.bvc.out_nhndls Number of buffer handles (OUTPUT) |
| * data.bvc.out_blits Number of blits (OUTPUT) |
| */ |
| #define RGZ_OUT_BVCMD_PAINT 1 |
| |
| /* |
| * This commands generates bltsville command data structures for HWC which will |
| * render via regions. This will involve a complete redraw of the screen. |
| * |
| * See RGZ_OUT_BVCMD_PAINT |
| */ |
| #define RGZ_OUT_BVCMD_REGION 2 |
| |
| /* |
| * Perform actual blits painting each layer from back to front - this is a test |
| * command |
| * |
| * rgz_out_params_t: |
| * |
| * op RGZ_OUT_BVDIRECT_PAINT |
| * data.bv.dstdesc bltsville struct describing the destination buffer |
| * data.bv.dstgeom bltsville struct describing the destination geometry |
| * data.bv.list List of HWC layers to blit, only HWC_OVERLAY layers |
| * will be rendered |
| * data.bv.noblend Test option to disable blending |
| */ |
| #define RGZ_OUT_BVDIRECT_PAINT 3 |
| /* |
| * Perform actual blits where each blit is a subregion - this is a test mode |
| */ |
| #define RGZ_OUT_BVDIRECT_REGION 5 |
| |
| int rgz_out(rgz_t *rgz, rgz_out_params_t* params); |
| |
| /* |
| * Produce instrumented logging of layer data |
| */ |
| void rgz_profile_hwc(hwc_display_contents_1_t* list, int dispw, int disph); |
| |
| /* |
| * ---------------------------------- |
| * IMPLEMENTATION DETAILS FOLLOW HERE |
| * ---------------------------------- |
| */ |
| |
| /* |
| * Regionizer blit data structures |
| */ |
| typedef struct blit_rect { |
| int left, top, right, bottom; |
| } blit_rect_t; |
| |
| /* |
| * A hregion is a horizontal area generated from the intersection of layers |
| * for a given composition. |
| * |
| * ---------------------------------------- |
| * | layer 0 | |
| * | xxxxxxxxxxxxxxxxxx | |
| * | x layer 1 x | |
| * | x x | |
| * | x xxxxxxxxxxxxxxxxxxx |
| * | x x layer 2 x |
| * | x x x |
| * | xxxxxxxxxx x |
| * | x x |
| * | x x |
| * ---------------------xxxxxxxxxxxxxxxxxxx |
| * |
| * This can be broken up into a number of horizontal regions: |
| * |
| * ---------------------------------------- |
| * | H1 l0 | |
| * |-----------xxxxxxxxxxxxxxxxxx---------| |
| * | H2 x x | |
| * | l0 x l01 x l0 | |
| * |-----------x--------xxxxxxxxxxxxxxxxxxx |
| * | H3 x x x x |
| * | l0 x l01 x l012 x l02 x |
| * |-----------xxxxxxxxxxxxxxxxxx---------x |
| * | H4 x x |
| * | l0 x l02 x |
| * ---------------------xxxxxxxxxxxxxxxxxxx |
| * |
| * Each hregion is just an array of rectangles. By accounting for the layers |
| * at different z-order, and hregion becomes a multi-dimensional array e.g. in |
| * the diagram above H4 has 2 sub-regions, layer 0 intersects with the first |
| * region and layers 0 and 2 intersect with the second region. |
| */ |
| #define RGZ_SUBREGIONMAX ((RGZ_MAXLAYERS << 1) - 1) |
| #define RGZ_MAX_BLITS (RGZ_SUBREGIONMAX * RGZ_SUBREGIONMAX) |
| |
| typedef struct rgz_layer { |
| hwc_layer_1_t hwc_layer; |
| uint32_t identity; |
| int buffidx; |
| int dirty_count; |
| } rgz_layer_t; |
| |
| typedef struct rgz_fb_state { |
| int rgz_layerno; |
| rgz_layer_t rgz_layers[RGZ_MAXLAYERS]; |
| } rgz_fb_state_t; |
| |
| typedef struct blit_hregion { |
| blit_rect_t rect; |
| rgz_layer_t *rgz_layers[RGZ_MAXLAYERS]; |
| int nlayers; |
| int nsubregions; |
| blit_rect_t blitrects[RGZ_MAXLAYERS][RGZ_SUBREGIONMAX]; /* z-order | rectangle */ |
| } blit_hregion_t; |
| |
| enum { RGZ_STATE_INIT = 1, RGZ_REGION_DATA = 2} ; |
| |
| struct rgz { |
| /* All fields here are opaque to the caller */ |
| blit_hregion_t *hregions; |
| int nhregions; |
| int state; |
| rgz_fb_state_t cur_fb_state; |
| int fb_state_idx; /* Target framebuffer index. Points to the fb where the blits will be applied to */ |
| rgz_fb_state_t fb_states[RGZ_NUM_FB]; /* Storage for previous framebuffer geometry states */ |
| blit_rect_t damaged_area; /* Area of the screen which will be redrawn unconditionally */ |
| }; |
| |
| #endif /* __RGZ_2D__ */ |