OSDN Git Service

132aa955d2598f828a7825d3afbfd0ff84340ad0
[android-x86/external-mesa.git] / src / gallium / drivers / ilo / ilo_3d_pipeline.h
1 /*
2  * Mesa 3-D graphics library
3  *
4  * Copyright (C) 2013 LunarG, Inc.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  *
24  * Authors:
25  *    Chia-I Wu <olv@lunarg.com>
26  */
27
28 #ifndef ILO_3D_PIPELINE_H
29 #define ILO_3D_PIPELINE_H
30
31 #include "ilo_common.h"
32 #include "ilo_context.h"
33 #include "ilo_gpe_gen6.h"
34 #include "ilo_gpe_gen7.h"
35
36 struct pipe_draw_info;
37 struct intel_bo;
38 struct ilo_cp;
39 struct ilo_context;
40
41 enum ilo_3d_pipeline_invalidate_flags {
42    ILO_3D_PIPELINE_INVALIDATE_HW         = 1 << 0,
43    ILO_3D_PIPELINE_INVALIDATE_BATCH_BO   = 1 << 1,
44    ILO_3D_PIPELINE_INVALIDATE_STATE_BO   = 1 << 2,
45    ILO_3D_PIPELINE_INVALIDATE_KERNEL_BO  = 1 << 3,
46
47    ILO_3D_PIPELINE_INVALIDATE_ALL        = 0xffffffff,
48 };
49
50 enum ilo_3d_pipeline_action {
51    ILO_3D_PIPELINE_DRAW,
52    ILO_3D_PIPELINE_FLUSH,
53    ILO_3D_PIPELINE_WRITE_TIMESTAMP,
54    ILO_3D_PIPELINE_WRITE_DEPTH_COUNT,
55 };
56
57 /**
58  * 3D pipeline.
59  */
60 struct ilo_3d_pipeline {
61    struct ilo_cp *cp;
62    const struct ilo_dev_info *dev;
63
64    uint32_t invalidate_flags;
65
66    struct intel_bo *workaround_bo;
67
68    uint32_t packed_sample_position_1x;
69    uint32_t packed_sample_position_4x;
70    uint32_t packed_sample_position_8x[2];
71
72    int (*estimate_size)(struct ilo_3d_pipeline *pipeline,
73                         enum ilo_3d_pipeline_action action,
74                         const void *arg);
75
76    void (*emit_draw)(struct ilo_3d_pipeline *pipeline,
77                      const struct ilo_context *ilo,
78                      const struct pipe_draw_info *info);
79
80    void (*emit_flush)(struct ilo_3d_pipeline *pipeline);
81
82    void (*emit_write_timestamp)(struct ilo_3d_pipeline *pipeline,
83                                 struct intel_bo *bo, int index);
84
85    void (*emit_write_depth_count)(struct ilo_3d_pipeline *pipeline,
86                                   struct intel_bo *bo, int index);
87
88    /**
89     * all GPE functions of all GENs
90     */
91 #define GEN6_EMIT(name) ilo_gpe_gen6_ ## name gen6_ ## name
92    GEN6_EMIT(STATE_BASE_ADDRESS);
93    GEN6_EMIT(STATE_SIP);
94    GEN6_EMIT(PIPELINE_SELECT);
95    GEN6_EMIT(3DSTATE_BINDING_TABLE_POINTERS);
96    GEN6_EMIT(3DSTATE_SAMPLER_STATE_POINTERS);
97    GEN6_EMIT(3DSTATE_URB);
98    GEN6_EMIT(3DSTATE_VERTEX_BUFFERS);
99    GEN6_EMIT(3DSTATE_VERTEX_ELEMENTS);
100    GEN6_EMIT(3DSTATE_INDEX_BUFFER);
101    GEN6_EMIT(3DSTATE_VF_STATISTICS);
102    GEN6_EMIT(3DSTATE_VIEWPORT_STATE_POINTERS);
103    GEN6_EMIT(3DSTATE_CC_STATE_POINTERS);
104    GEN6_EMIT(3DSTATE_SCISSOR_STATE_POINTERS);
105    GEN6_EMIT(3DSTATE_VS);
106    GEN6_EMIT(3DSTATE_GS);
107    GEN6_EMIT(3DSTATE_CLIP);
108    GEN6_EMIT(3DSTATE_SF);
109    GEN6_EMIT(3DSTATE_WM);
110    GEN6_EMIT(3DSTATE_CONSTANT_VS);
111    GEN6_EMIT(3DSTATE_CONSTANT_GS);
112    GEN6_EMIT(3DSTATE_CONSTANT_PS);
113    GEN6_EMIT(3DSTATE_SAMPLE_MASK);
114    GEN6_EMIT(3DSTATE_DRAWING_RECTANGLE);
115    GEN6_EMIT(3DSTATE_DEPTH_BUFFER);
116    GEN6_EMIT(3DSTATE_POLY_STIPPLE_OFFSET);
117    GEN6_EMIT(3DSTATE_POLY_STIPPLE_PATTERN);
118    GEN6_EMIT(3DSTATE_LINE_STIPPLE);
119    GEN6_EMIT(3DSTATE_AA_LINE_PARAMETERS);
120    GEN6_EMIT(3DSTATE_GS_SVB_INDEX);
121    GEN6_EMIT(3DSTATE_MULTISAMPLE);
122    GEN6_EMIT(3DSTATE_STENCIL_BUFFER);
123    GEN6_EMIT(3DSTATE_HIER_DEPTH_BUFFER);
124    GEN6_EMIT(3DSTATE_CLEAR_PARAMS);
125    GEN6_EMIT(PIPE_CONTROL);
126    GEN6_EMIT(3DPRIMITIVE);
127    GEN6_EMIT(INTERFACE_DESCRIPTOR_DATA);
128    GEN6_EMIT(SF_VIEWPORT);
129    GEN6_EMIT(CLIP_VIEWPORT);
130    GEN6_EMIT(CC_VIEWPORT);
131    GEN6_EMIT(COLOR_CALC_STATE);
132    GEN6_EMIT(BLEND_STATE);
133    GEN6_EMIT(DEPTH_STENCIL_STATE);
134    GEN6_EMIT(SCISSOR_RECT);
135    GEN6_EMIT(BINDING_TABLE_STATE);
136    GEN6_EMIT(SURFACE_STATE);
137    GEN6_EMIT(surf_SURFACE_STATE);
138    GEN6_EMIT(so_SURFACE_STATE);
139    GEN6_EMIT(SAMPLER_STATE);
140    GEN6_EMIT(SAMPLER_BORDER_COLOR_STATE);
141    GEN6_EMIT(push_constant_buffer);
142 #undef GEN6_EMIT
143
144 #define GEN7_EMIT(name) ilo_gpe_gen7_ ## name gen7_ ## name
145    GEN7_EMIT(3DSTATE_DEPTH_BUFFER);
146    GEN7_EMIT(3DSTATE_CC_STATE_POINTERS);
147    GEN7_EMIT(3DSTATE_GS);
148    GEN7_EMIT(3DSTATE_SF);
149    GEN7_EMIT(3DSTATE_WM);
150    GEN7_EMIT(3DSTATE_SAMPLE_MASK);
151    GEN7_EMIT(3DSTATE_CONSTANT_HS);
152    GEN7_EMIT(3DSTATE_CONSTANT_DS);
153    GEN7_EMIT(3DSTATE_HS);
154    GEN7_EMIT(3DSTATE_TE);
155    GEN7_EMIT(3DSTATE_DS);
156    GEN7_EMIT(3DSTATE_STREAMOUT);
157    GEN7_EMIT(3DSTATE_SBE);
158    GEN7_EMIT(3DSTATE_PS);
159    GEN7_EMIT(3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP);
160    GEN7_EMIT(3DSTATE_VIEWPORT_STATE_POINTERS_CC);
161    GEN7_EMIT(3DSTATE_BLEND_STATE_POINTERS);
162    GEN7_EMIT(3DSTATE_DEPTH_STENCIL_STATE_POINTERS);
163    GEN7_EMIT(3DSTATE_BINDING_TABLE_POINTERS_VS);
164    GEN7_EMIT(3DSTATE_BINDING_TABLE_POINTERS_HS);
165    GEN7_EMIT(3DSTATE_BINDING_TABLE_POINTERS_DS);
166    GEN7_EMIT(3DSTATE_BINDING_TABLE_POINTERS_GS);
167    GEN7_EMIT(3DSTATE_BINDING_TABLE_POINTERS_PS);
168    GEN7_EMIT(3DSTATE_SAMPLER_STATE_POINTERS_VS);
169    GEN7_EMIT(3DSTATE_SAMPLER_STATE_POINTERS_HS);
170    GEN7_EMIT(3DSTATE_SAMPLER_STATE_POINTERS_DS);
171    GEN7_EMIT(3DSTATE_SAMPLER_STATE_POINTERS_GS);
172    GEN7_EMIT(3DSTATE_SAMPLER_STATE_POINTERS_PS);
173    GEN7_EMIT(3DSTATE_URB_VS);
174    GEN7_EMIT(3DSTATE_URB_HS);
175    GEN7_EMIT(3DSTATE_URB_DS);
176    GEN7_EMIT(3DSTATE_URB_GS);
177    GEN7_EMIT(3DSTATE_PUSH_CONSTANT_ALLOC_VS);
178    GEN7_EMIT(3DSTATE_PUSH_CONSTANT_ALLOC_HS);
179    GEN7_EMIT(3DSTATE_PUSH_CONSTANT_ALLOC_DS);
180    GEN7_EMIT(3DSTATE_PUSH_CONSTANT_ALLOC_GS);
181    GEN7_EMIT(3DSTATE_PUSH_CONSTANT_ALLOC_PS);
182    GEN7_EMIT(3DSTATE_SO_DECL_LIST);
183    GEN7_EMIT(3DSTATE_SO_BUFFER);
184    GEN7_EMIT(SF_CLIP_VIEWPORT);
185 #undef GEN7_EMIT
186
187    /**
188     * HW states.
189     */
190    struct ilo_3d_pipeline_state {
191       bool has_gen6_wa_pipe_control;
192
193       int reduced_prim;
194       int so_num_vertices, so_max_vertices;
195
196       uint32_t SF_VIEWPORT;
197       uint32_t CLIP_VIEWPORT;
198       uint32_t SF_CLIP_VIEWPORT; /* GEN7+ */
199       uint32_t CC_VIEWPORT;
200
201       uint32_t COLOR_CALC_STATE;
202       uint32_t BLEND_STATE;
203       uint32_t DEPTH_STENCIL_STATE;
204
205       uint32_t SCISSOR_RECT;
206
207       struct {
208          uint32_t BINDING_TABLE_STATE;
209          int BINDING_TABLE_STATE_size;
210          uint32_t SURFACE_STATE[ILO_MAX_VS_SURFACES];
211          uint32_t SAMPLER_STATE;
212          uint32_t SAMPLER_BORDER_COLOR_STATE[ILO_MAX_SAMPLERS];
213          uint32_t PUSH_CONSTANT_BUFFER;
214          int PUSH_CONSTANT_BUFFER_size;
215       } vs;
216
217       struct {
218          uint32_t BINDING_TABLE_STATE;
219          int BINDING_TABLE_STATE_size;
220          uint32_t SURFACE_STATE[ILO_MAX_GS_SURFACES];
221          bool active;
222       } gs;
223
224       struct {
225          uint32_t BINDING_TABLE_STATE;
226          int BINDING_TABLE_STATE_size;
227          uint32_t SURFACE_STATE[ILO_MAX_WM_SURFACES];
228          uint32_t SAMPLER_STATE;
229          uint32_t SAMPLER_BORDER_COLOR_STATE[ILO_MAX_SAMPLERS];
230       } wm;
231    } state;
232 };
233
234 struct ilo_3d_pipeline *
235 ilo_3d_pipeline_create(struct ilo_cp *cp, const struct ilo_dev_info *dev);
236
237 void
238 ilo_3d_pipeline_destroy(struct ilo_3d_pipeline *pipeline);
239
240
241 static inline void
242 ilo_3d_pipeline_invalidate(struct ilo_3d_pipeline *p, uint32_t flags)
243 {
244    p->invalidate_flags |= flags;
245 }
246
247 /**
248  * Estimate the size of an action.
249  */
250 static inline int
251 ilo_3d_pipeline_estimate_size(struct ilo_3d_pipeline *pipeline,
252                               enum ilo_3d_pipeline_action action,
253                               const void *arg)
254 {
255    return pipeline->estimate_size(pipeline, action, arg);
256 }
257
258 bool
259 ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p,
260                           const struct ilo_context *ilo,
261                           const struct pipe_draw_info *info,
262                           int *prim_generated, int *prim_emitted);
263
264 void
265 ilo_3d_pipeline_emit_flush(struct ilo_3d_pipeline *p);
266
267 void
268 ilo_3d_pipeline_emit_write_timestamp(struct ilo_3d_pipeline *p,
269                                      struct intel_bo *bo, int index);
270
271 void
272 ilo_3d_pipeline_emit_write_depth_count(struct ilo_3d_pipeline *p,
273                                        struct intel_bo *bo, int index);
274
275 void
276 ilo_3d_pipeline_get_sample_position(struct ilo_3d_pipeline *p,
277                                     unsigned sample_count,
278                                     unsigned sample_index,
279                                     float *x, float *y);
280
281 void
282 ilo_3d_pipeline_dump(struct ilo_3d_pipeline *p);
283
284 #endif /* ILO_3D_PIPELINE_H */