xref: /aosp_15_r20/external/mesa3d/src/panfrost/lib/pan_blend.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright (C) 2018 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker  * Copyright (C) 2019-2021 Collabora, Ltd.
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*61046927SAndroid Build Coastguard Worker  *
12*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
13*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
14*61046927SAndroid Build Coastguard Worker  * Software.
15*61046927SAndroid Build Coastguard Worker  *
16*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*61046927SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*61046927SAndroid Build Coastguard Worker  * SOFTWARE.
23*61046927SAndroid Build Coastguard Worker  */
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker #ifndef __PAN_BLEND_H__
26*61046927SAndroid Build Coastguard Worker #define __PAN_BLEND_H__
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker #include "genxml/gen_macros.h"
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker #include "compiler/nir/nir.h"
31*61046927SAndroid Build Coastguard Worker #include "util/blend.h"
32*61046927SAndroid Build Coastguard Worker #include "util/format/u_format.h"
33*61046927SAndroid Build Coastguard Worker #include "util/u_dynarray.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #include "panfrost/util/pan_ir.h"
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker struct MALI_BLEND_EQUATION;
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker struct pan_blend_shader_cache {
40*61046927SAndroid Build Coastguard Worker    unsigned gpu_id;
41*61046927SAndroid Build Coastguard Worker    struct hash_table *shaders;
42*61046927SAndroid Build Coastguard Worker    pthread_mutex_t lock;
43*61046927SAndroid Build Coastguard Worker };
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker struct pan_blend_equation {
46*61046927SAndroid Build Coastguard Worker    unsigned blend_enable                  : 1;
47*61046927SAndroid Build Coastguard Worker    enum pipe_blend_func rgb_func          : 3;
48*61046927SAndroid Build Coastguard Worker    enum pipe_blendfactor rgb_src_factor   : 5;
49*61046927SAndroid Build Coastguard Worker    enum pipe_blendfactor rgb_dst_factor   : 5;
50*61046927SAndroid Build Coastguard Worker    enum pipe_blend_func alpha_func        : 3;
51*61046927SAndroid Build Coastguard Worker    enum pipe_blendfactor alpha_src_factor : 5;
52*61046927SAndroid Build Coastguard Worker    enum pipe_blendfactor alpha_dst_factor : 5;
53*61046927SAndroid Build Coastguard Worker    unsigned color_mask                    : 4;
54*61046927SAndroid Build Coastguard Worker    unsigned padding                       : 1;
55*61046927SAndroid Build Coastguard Worker };
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker struct pan_blend_rt_state {
58*61046927SAndroid Build Coastguard Worker    /* RT format */
59*61046927SAndroid Build Coastguard Worker    enum pipe_format format;
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker    /* Number of samples */
62*61046927SAndroid Build Coastguard Worker    unsigned nr_samples;
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    struct pan_blend_equation equation;
65*61046927SAndroid Build Coastguard Worker };
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker struct pan_blend_state {
68*61046927SAndroid Build Coastguard Worker    bool logicop_enable;
69*61046927SAndroid Build Coastguard Worker    enum pipe_logicop logicop_func;
70*61046927SAndroid Build Coastguard Worker    float constants[4];
71*61046927SAndroid Build Coastguard Worker    unsigned rt_count;
72*61046927SAndroid Build Coastguard Worker    struct pan_blend_rt_state rts[8];
73*61046927SAndroid Build Coastguard Worker };
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker struct pan_blend_shader_key {
76*61046927SAndroid Build Coastguard Worker    enum pipe_format format;
77*61046927SAndroid Build Coastguard Worker    nir_alu_type src0_type, src1_type;
78*61046927SAndroid Build Coastguard Worker    uint32_t rt             : 3;
79*61046927SAndroid Build Coastguard Worker    uint32_t has_constants  : 1;
80*61046927SAndroid Build Coastguard Worker    uint32_t logicop_enable : 1;
81*61046927SAndroid Build Coastguard Worker    uint32_t logicop_func   : 4;
82*61046927SAndroid Build Coastguard Worker    uint32_t nr_samples     : 5;
83*61046927SAndroid Build Coastguard Worker    uint32_t padding        : 18;
84*61046927SAndroid Build Coastguard Worker    struct pan_blend_equation equation;
85*61046927SAndroid Build Coastguard Worker };
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker struct pan_blend_shader_variant {
88*61046927SAndroid Build Coastguard Worker    struct list_head node;
89*61046927SAndroid Build Coastguard Worker    float constants[4];
90*61046927SAndroid Build Coastguard Worker    struct util_dynarray binary;
91*61046927SAndroid Build Coastguard Worker    unsigned first_tag;
92*61046927SAndroid Build Coastguard Worker    unsigned work_reg_count;
93*61046927SAndroid Build Coastguard Worker };
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker #define PAN_BLEND_SHADER_MAX_VARIANTS 32
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker struct pan_blend_shader {
98*61046927SAndroid Build Coastguard Worker    struct pan_blend_shader_key key;
99*61046927SAndroid Build Coastguard Worker    unsigned nvariants;
100*61046927SAndroid Build Coastguard Worker    struct list_head variants;
101*61046927SAndroid Build Coastguard Worker };
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker bool pan_blend_reads_dest(const struct pan_blend_equation eq);
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker bool pan_blend_can_fixed_function(const struct pan_blend_equation equation,
106*61046927SAndroid Build Coastguard Worker                                   bool supports_2src);
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker bool pan_blend_is_opaque(const struct pan_blend_equation eq);
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker bool pan_blend_alpha_zero_nop(const struct pan_blend_equation eq);
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker bool pan_blend_alpha_one_store(const struct pan_blend_equation eq);
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker unsigned pan_blend_constant_mask(const struct pan_blend_equation eq);
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker /* Fixed-function blending only supports a single constant, so if multiple bits
117*61046927SAndroid Build Coastguard Worker  * are set in constant_mask, the constants must match. Therefore we may pick
118*61046927SAndroid Build Coastguard Worker  * just the first constant. */
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker static inline float
pan_blend_get_constant(unsigned mask,const float * constants)121*61046927SAndroid Build Coastguard Worker pan_blend_get_constant(unsigned mask, const float *constants)
122*61046927SAndroid Build Coastguard Worker {
123*61046927SAndroid Build Coastguard Worker    return mask ? constants[ffs(mask) - 1] : 0.0;
124*61046927SAndroid Build Coastguard Worker }
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker /* v6 doesn't support blend constants in FF blend equations whatsoever, and v7
127*61046927SAndroid Build Coastguard Worker  * only uses the constant from RT 0 (TODO: what if it's the same constant? or a
128*61046927SAndroid Build Coastguard Worker  * constant is shared?) */
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker static inline bool
pan_blend_supports_constant(unsigned arch,unsigned rt)131*61046927SAndroid Build Coastguard Worker pan_blend_supports_constant(unsigned arch, unsigned rt)
132*61046927SAndroid Build Coastguard Worker {
133*61046927SAndroid Build Coastguard Worker    return !((arch == 6) || (arch == 7 && rt > 0));
134*61046927SAndroid Build Coastguard Worker }
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker /* The SOURCE_2 value is new in Bifrost */
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker static inline bool
pan_blend_supports_2src(unsigned arch)139*61046927SAndroid Build Coastguard Worker pan_blend_supports_2src(unsigned arch)
140*61046927SAndroid Build Coastguard Worker {
141*61046927SAndroid Build Coastguard Worker    return (arch >= 6);
142*61046927SAndroid Build Coastguard Worker }
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker bool pan_blend_is_homogenous_constant(unsigned mask, const float *constants);
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker void pan_blend_to_fixed_function_equation(const struct pan_blend_equation eq,
147*61046927SAndroid Build Coastguard Worker                                           struct MALI_BLEND_EQUATION *equation);
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker uint32_t pan_pack_blend(const struct pan_blend_equation equation);
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker void pan_blend_shader_cache_init(struct pan_blend_shader_cache *cache,
152*61046927SAndroid Build Coastguard Worker                                  unsigned gpu_id);
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker void pan_blend_shader_cache_cleanup(struct pan_blend_shader_cache *cache);
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker #ifdef PAN_ARCH
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker nir_shader *GENX(pan_blend_create_shader)(const struct pan_blend_state *state,
159*61046927SAndroid Build Coastguard Worker                                           nir_alu_type src0_type,
160*61046927SAndroid Build Coastguard Worker                                           nir_alu_type src1_type, unsigned rt);
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker #if PAN_ARCH >= 6
163*61046927SAndroid Build Coastguard Worker uint64_t GENX(pan_blend_get_internal_desc)(enum pipe_format fmt, unsigned rt,
164*61046927SAndroid Build Coastguard Worker                                            unsigned force_size, bool dithered);
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker bool GENX(pan_inline_rt_conversion)(nir_shader *s, enum pipe_format *formats);
167*61046927SAndroid Build Coastguard Worker #endif
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker /* Take blend_shaders.lock before calling this function and release it when
170*61046927SAndroid Build Coastguard Worker  * you're done with the shader variant object.
171*61046927SAndroid Build Coastguard Worker  */
172*61046927SAndroid Build Coastguard Worker struct pan_blend_shader_variant *GENX(pan_blend_get_shader_locked)(
173*61046927SAndroid Build Coastguard Worker    struct pan_blend_shader_cache *cache, const struct pan_blend_state *state,
174*61046927SAndroid Build Coastguard Worker    nir_alu_type src0_type, nir_alu_type src1_type, unsigned rt);
175*61046927SAndroid Build Coastguard Worker #endif
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker #endif
178