intel/blorp: Add initial support for indirect clear colors
[mesa.git] / src / intel / blorp / blorp.h
1 /*
2 * Copyright © 2012 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24 #ifndef BLORP_H
25 #define BLORP_H
26
27 #include <stdint.h>
28 #include <stdbool.h>
29
30 #include "isl/isl.h"
31
32 struct brw_stage_prog_data;
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37
38 struct blorp_batch;
39 struct blorp_params;
40
41 struct blorp_context {
42 void *driver_ctx;
43
44 const struct isl_device *isl_dev;
45
46 const struct brw_compiler *compiler;
47
48 bool (*lookup_shader)(struct blorp_context *blorp,
49 const void *key, uint32_t key_size,
50 uint32_t *kernel_out, void *prog_data_out);
51 bool (*upload_shader)(struct blorp_context *blorp,
52 const void *key, uint32_t key_size,
53 const void *kernel, uint32_t kernel_size,
54 const struct brw_stage_prog_data *prog_data,
55 uint32_t prog_data_size,
56 uint32_t *kernel_out, void *prog_data_out);
57 void (*exec)(struct blorp_batch *batch, const struct blorp_params *params);
58 };
59
60 void blorp_init(struct blorp_context *blorp, void *driver_ctx,
61 struct isl_device *isl_dev);
62 void blorp_finish(struct blorp_context *blorp);
63
64 enum blorp_batch_flags {
65 /**
66 * This flag indicates that blorp should *not* re-emit the depth and
67 * stencil buffer packets. Instead, the driver guarantees that all depth
68 * and stencil images passed in will match what is currently set in the
69 * hardware.
70 */
71 BLORP_BATCH_NO_EMIT_DEPTH_STENCIL = (1 << 0),
72
73 /* This flag indicates that the blorp call should be predicated. */
74 BLORP_BATCH_PREDICATE_ENABLE = (1 << 1),
75 };
76
77 struct blorp_batch {
78 struct blorp_context *blorp;
79 void *driver_batch;
80 enum blorp_batch_flags flags;
81 };
82
83 void blorp_batch_init(struct blorp_context *blorp, struct blorp_batch *batch,
84 void *driver_batch, enum blorp_batch_flags flags);
85 void blorp_batch_finish(struct blorp_batch *batch);
86
87 struct blorp_address {
88 void *buffer;
89 unsigned reloc_flags;
90 uint32_t offset;
91 uint32_t mocs;
92 };
93
94 struct blorp_surf
95 {
96 const struct isl_surf *surf;
97 struct blorp_address addr;
98
99 const struct isl_surf *aux_surf;
100 struct blorp_address aux_addr;
101 enum isl_aux_usage aux_usage;
102
103 union isl_color_value clear_color;
104
105 /**
106 * If set (bo != NULL), clear_color is ignored and the actual clear color
107 * is fetched from this address. On gen7-8, this is all of dword 7 of
108 * RENDER_SURFACE_STATE and is the responsibility of the caller to ensure
109 * that it contains a swizzle of RGBA and resource min LOD of 0.
110 */
111 struct blorp_address clear_color_addr;
112 };
113
114 void
115 blorp_blit(struct blorp_batch *batch,
116 const struct blorp_surf *src_surf,
117 unsigned src_level, unsigned src_layer,
118 enum isl_format src_format, struct isl_swizzle src_swizzle,
119 const struct blorp_surf *dst_surf,
120 unsigned dst_level, unsigned dst_layer,
121 enum isl_format dst_format, struct isl_swizzle dst_swizzle,
122 float src_x0, float src_y0,
123 float src_x1, float src_y1,
124 float dst_x0, float dst_y0,
125 float dst_x1, float dst_y1,
126 uint32_t filter, bool mirror_x, bool mirror_y);
127
128 void
129 blorp_copy(struct blorp_batch *batch,
130 const struct blorp_surf *src_surf,
131 unsigned src_level, unsigned src_layer,
132 const struct blorp_surf *dst_surf,
133 unsigned dst_level, unsigned dst_layer,
134 uint32_t src_x, uint32_t src_y,
135 uint32_t dst_x, uint32_t dst_y,
136 uint32_t src_width, uint32_t src_height);
137
138 void
139 blorp_buffer_copy(struct blorp_batch *batch,
140 struct blorp_address src,
141 struct blorp_address dst,
142 uint64_t size);
143
144 void
145 blorp_fast_clear(struct blorp_batch *batch,
146 const struct blorp_surf *surf, enum isl_format format,
147 uint32_t level, uint32_t start_layer, uint32_t num_layers,
148 uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1);
149
150 void
151 blorp_clear(struct blorp_batch *batch,
152 const struct blorp_surf *surf,
153 enum isl_format format, struct isl_swizzle swizzle,
154 uint32_t level, uint32_t start_layer, uint32_t num_layers,
155 uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1,
156 union isl_color_value clear_color,
157 const bool color_write_disable[4]);
158
159 void
160 blorp_clear_depth_stencil(struct blorp_batch *batch,
161 const struct blorp_surf *depth,
162 const struct blorp_surf *stencil,
163 uint32_t level, uint32_t start_layer,
164 uint32_t num_layers,
165 uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1,
166 bool clear_depth, float depth_value,
167 uint8_t stencil_mask, uint8_t stencil_value);
168 bool
169 blorp_can_hiz_clear_depth(uint8_t gen, enum isl_format format,
170 uint32_t num_samples,
171 uint32_t x0, uint32_t y0,
172 uint32_t x1, uint32_t y1);
173
174 void
175 blorp_gen8_hiz_clear_attachments(struct blorp_batch *batch,
176 uint32_t num_samples,
177 uint32_t x0, uint32_t y0,
178 uint32_t x1, uint32_t y1,
179 bool clear_depth, bool clear_stencil,
180 uint8_t stencil_value);
181 void
182 blorp_clear_attachments(struct blorp_batch *batch,
183 uint32_t binding_table_offset,
184 enum isl_format depth_format,
185 uint32_t num_samples,
186 uint32_t start_layer, uint32_t num_layers,
187 uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1,
188 bool clear_color, union isl_color_value color_value,
189 bool clear_depth, float depth_value,
190 uint8_t stencil_mask, uint8_t stencil_value);
191
192 enum blorp_fast_clear_op {
193 BLORP_FAST_CLEAR_OP_NONE = 0,
194 BLORP_FAST_CLEAR_OP_CLEAR,
195 BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL,
196 BLORP_FAST_CLEAR_OP_RESOLVE_FULL,
197 };
198
199 void
200 blorp_ccs_resolve(struct blorp_batch *batch,
201 struct blorp_surf *surf, uint32_t level, uint32_t layer,
202 enum isl_format format,
203 enum blorp_fast_clear_op resolve_op);
204
205 /* Resolves subresources of the image subresource range specified in the
206 * binding table.
207 */
208 void
209 blorp_ccs_resolve_attachment(struct blorp_batch *batch,
210 const uint32_t binding_table_offset,
211 struct blorp_surf * const surf,
212 const uint32_t level, const uint32_t num_layers,
213 const enum isl_format format,
214 const enum blorp_fast_clear_op resolve_op);
215
216 void
217 blorp_mcs_partial_resolve(struct blorp_batch *batch,
218 struct blorp_surf *surf,
219 enum isl_format format,
220 uint32_t start_layer, uint32_t num_layers);
221
222 /**
223 * For an overview of the HiZ operations, see the following sections of the
224 * Sandy Bridge PRM, Volume 1, Part2:
225 * - 7.5.3.1 Depth Buffer Clear
226 * - 7.5.3.2 Depth Buffer Resolve
227 * - 7.5.3.3 Hierarchical Depth Buffer Resolve
228 *
229 * Of these, two get entered in the resolve map as needing to be done to the
230 * buffer: depth resolve and hiz resolve.
231 */
232 enum blorp_hiz_op {
233 BLORP_HIZ_OP_NONE,
234 BLORP_HIZ_OP_DEPTH_CLEAR,
235 BLORP_HIZ_OP_DEPTH_RESOLVE,
236 BLORP_HIZ_OP_HIZ_RESOLVE,
237 };
238
239 void
240 blorp_hiz_op(struct blorp_batch *batch, struct blorp_surf *surf,
241 uint32_t level, uint32_t start_layer, uint32_t num_layers,
242 enum blorp_hiz_op op);
243
244 #ifdef __cplusplus
245 } /* end extern "C" */
246 #endif /* __cplusplus */
247
248 #endif /* BLORP_H */