2 #ifndef __NV50_BLIT_H__
3 #define __NV50_BLIT_H__
5 #include "util/u_inlines.h"
6 #include "util/u_format.h"
9 nv50_blitter_make_fp(struct pipe_context
*,
11 enum pipe_texture_target
);
14 nv50_blit_select_mode(const struct pipe_blit_info
*);
16 /* Converted to a pipe->blit. */
18 nv50_resource_resolve(struct pipe_context
*, const struct pipe_resolve_info
*);
20 #define NV50_BLIT_MODE_PASS 0 /* pass through TEX $t0/$s0 output */
21 #define NV50_BLIT_MODE_Z24S8 1 /* encode ZS values for RGBA unorm8 */
22 #define NV50_BLIT_MODE_S8Z24 2
23 #define NV50_BLIT_MODE_X24S8 3
24 #define NV50_BLIT_MODE_S8X24 4
25 #define NV50_BLIT_MODE_Z24X8 5
26 #define NV50_BLIT_MODE_X8Z24 6
27 #define NV50_BLIT_MODE_ZS 7 /* put $t0/$s0 into R, $t1/$s1 into G */
28 #define NV50_BLIT_MODE_XS 8 /* put $t1/$s1 into G */
29 #define NV50_BLIT_MODES 9
31 /* CUBE and RECT textures are reinterpreted as 2D(_ARRAY) */
32 #define NV50_BLIT_TEXTURE_BUFFER 0
33 #define NV50_BLIT_TEXTURE_1D 1
34 #define NV50_BLIT_TEXTURE_2D 2
35 #define NV50_BLIT_TEXTURE_3D 3
36 #define NV50_BLIT_TEXTURE_1D_ARRAY 4
37 #define NV50_BLIT_TEXTURE_2D_ARRAY 5
38 #define NV50_BLIT_MAX_TEXTURE_TYPES 6
40 static inline unsigned
41 nv50_blit_texture_type(enum pipe_texture_target target
)
44 case PIPE_TEXTURE_1D
: return NV50_BLIT_TEXTURE_1D
;
45 case PIPE_TEXTURE_2D
: return NV50_BLIT_TEXTURE_2D
;
46 case PIPE_TEXTURE_3D
: return NV50_BLIT_TEXTURE_3D
;
47 case PIPE_TEXTURE_1D_ARRAY
: return NV50_BLIT_TEXTURE_1D_ARRAY
;
48 case PIPE_TEXTURE_2D_ARRAY
: return NV50_BLIT_TEXTURE_2D_ARRAY
;
50 assert(target
== PIPE_BUFFER
);
51 return NV50_BLIT_TEXTURE_BUFFER
;
55 static inline unsigned
56 nv50_blit_get_tgsi_texture_target(enum pipe_texture_target target
)
59 case PIPE_TEXTURE_1D
: return TGSI_TEXTURE_1D
;
60 case PIPE_TEXTURE_2D
: return TGSI_TEXTURE_2D
;
61 case PIPE_TEXTURE_3D
: return TGSI_TEXTURE_3D
;
62 case PIPE_TEXTURE_1D_ARRAY
: return TGSI_TEXTURE_1D_ARRAY
;
63 case PIPE_TEXTURE_2D_ARRAY
: return TGSI_TEXTURE_2D_ARRAY
;
65 assert(target
== PIPE_BUFFER
);
66 return TGSI_TEXTURE_BUFFER
;
70 static inline enum pipe_texture_target
71 nv50_blit_reinterpret_pipe_texture_target(enum pipe_texture_target target
)
74 case PIPE_TEXTURE_CUBE
:
75 case PIPE_TEXTURE_CUBE_ARRAY
:
76 return PIPE_TEXTURE_2D_ARRAY
;
77 case PIPE_TEXTURE_RECT
:
78 return PIPE_TEXTURE_2D
;
84 static inline unsigned
85 nv50_blit_get_filter(const struct pipe_blit_info
*info
)
87 if (info
->dst
.resource
->nr_samples
< info
->src
.resource
->nr_samples
)
88 return util_format_is_depth_or_stencil(info
->src
.format
) ? 0 : 1;
90 if (info
->filter
!= PIPE_TEX_FILTER_LINEAR
)
93 if ((info
->dst
.box
.width
== info
->src
.box
.width
||
94 info
->dst
.box
.width
== -info
->src
.box
.width
) &&
95 (info
->dst
.box
.height
== info
->src
.box
.height
||
96 info
->dst
.box
.height
== -info
->src
.box
.height
))
102 /* Since shaders cannot export stencil, we cannot copy stencil values when
103 * rendering to ZETA, so we attach the ZS surface to a colour render target.
105 static inline enum pipe_format
106 nv50_blit_zeta_to_colour_format(enum pipe_format format
)
109 case PIPE_FORMAT_Z16_UNORM
:
110 return PIPE_FORMAT_R16_UNORM
;
111 case PIPE_FORMAT_Z24_UNORM_S8_UINT
:
112 case PIPE_FORMAT_S8_UINT_Z24_UNORM
:
113 case PIPE_FORMAT_Z24X8_UNORM
:
114 case PIPE_FORMAT_X8Z24_UNORM
:
115 case PIPE_FORMAT_X24S8_UINT
:
116 case PIPE_FORMAT_S8X24_UINT
:
117 return PIPE_FORMAT_R8G8B8A8_UNORM
;
118 case PIPE_FORMAT_Z32_FLOAT
:
119 return PIPE_FORMAT_R32_FLOAT
;
120 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT
:
121 case PIPE_FORMAT_X32_S8X24_UINT
:
122 return PIPE_FORMAT_R32G32_FLOAT
;
125 return PIPE_FORMAT_NONE
;
130 static inline uint16_t
131 nv50_blit_derive_color_mask(const struct pipe_blit_info
*info
)
133 const unsigned mask
= info
->mask
;
135 uint16_t color_mask
= 0;
137 switch (info
->dst
.format
) {
138 case PIPE_FORMAT_Z24X8_UNORM
:
139 case PIPE_FORMAT_X24S8_UINT
:
140 case PIPE_FORMAT_Z24_UNORM_S8_UINT
:
141 if (mask
& PIPE_MASK_S
)
142 color_mask
|= 0x1000;
143 if (mask
& PIPE_MASK_Z
)
144 color_mask
|= 0x0111;
146 case PIPE_FORMAT_X8Z24_UNORM
:
147 case PIPE_FORMAT_S8X24_UINT
:
148 case PIPE_FORMAT_S8_UINT_Z24_UNORM
:
149 if (mask
& PIPE_MASK_S
)
150 color_mask
|= 0x0001;
151 if (mask
& PIPE_MASK_Z
)
152 color_mask
|= 0x1110;
155 if (mask
& (PIPE_MASK_R
| PIPE_MASK_Z
)) color_mask
|= 0x0001;
156 if (mask
& (PIPE_MASK_G
| PIPE_MASK_S
)) color_mask
|= 0x0010;
157 if (mask
& PIPE_MASK_B
) color_mask
|= 0x0100;
158 if (mask
& PIPE_MASK_A
) color_mask
|= 0x1000;
165 static inline uint32_t
166 nv50_blit_eng2d_get_mask(const struct pipe_blit_info
*info
)
170 switch (info
->dst
.format
) {
171 case PIPE_FORMAT_Z24X8_UNORM
:
172 case PIPE_FORMAT_X24S8_UINT
:
173 case PIPE_FORMAT_Z24_UNORM_S8_UINT
:
174 if (info
->mask
& PIPE_MASK_Z
) mask
|= 0x00ffffff;
175 if (info
->mask
& PIPE_MASK_S
) mask
|= 0xff000000;
177 case PIPE_FORMAT_X8Z24_UNORM
:
178 case PIPE_FORMAT_S8X24_UINT
:
179 case PIPE_FORMAT_S8_UINT_Z24_UNORM
:
180 if (info
->mask
& PIPE_MASK_Z
) mask
|= 0xffffff00;
181 if (info
->mask
& PIPE_MASK_S
) mask
|= 0x000000ff;
190 #if NOUVEAU_DRIVER == 0xc0
191 # define nv50_format_table nvc0_format_table
194 /* return true for formats that can be converted among each other by NVC0_2D */
196 nv50_2d_dst_format_faithful(enum pipe_format format
)
198 const uint64_t mask
=
199 NV50_ENG2D_SUPPORTED_FORMATS
&
200 ~NV50_ENG2D_NOCONVERT_FORMATS
;
201 uint8_t id
= nv50_format_table
[format
].rt
;
202 return (id
>= 0xc0) && (mask
& (1ULL << (id
- 0xc0)));
205 nv50_2d_src_format_faithful(enum pipe_format format
)
207 const uint64_t mask
=
208 NV50_ENG2D_SUPPORTED_FORMATS
&
209 ~(NV50_ENG2D_LUMINANCE_FORMATS
| NV50_ENG2D_INTENSITY_FORMATS
);
210 uint8_t id
= nv50_format_table
[format
].rt
;
211 return (id
>= 0xc0) && (mask
& (1ULL << (id
- 0xc0)));
215 nv50_2d_format_supported(enum pipe_format format
)
217 uint8_t id
= nv50_format_table
[format
].rt
;
218 return (id
>= 0xc0) &&
219 (NV50_ENG2D_SUPPORTED_FORMATS
& (1ULL << (id
- 0xc0)));
223 nv50_2d_dst_format_ops_supported(enum pipe_format format
)
225 uint8_t id
= nv50_format_table
[format
].rt
;
226 return (id
>= 0xc0) &&
227 (NV50_ENG2D_OPERATION_FORMATS
& (1ULL << (id
- 0xc0)));
230 #endif /* __NV50_BLIT_H__ */