blob: e1ee36041eea835587f523e9c6414f353e604491 [file] [log] [blame]
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001/*
2 * XGL
3 *
4 * Copyright (C) 2014 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
25#ifndef PIPELINE_H
26#define PIPELINE_H
27
28#include "intel.h"
29#include "obj.h"
30#include "dev.h"
31
Chia-I Wu1f7540b2014-08-22 13:56:18 +080032#define INTEL_RMAP_SLOT_RT ((XGL_UINT) -1)
33#define INTEL_RMAP_SLOT_DYN ((XGL_UINT) -2)
34struct intel_rmap_slot {
35 /*
36 *
37 * When path_len is 0, the slot is unused.
38 * When path_len is 1, the slot uses descriptor "index".
39 * When path_len is INTEL_RMAP_SLOT_RT, the slot uses RT "index".
40 * When path_len is INTEL_RMAP_SLOT_DYN, the slot uses the dynamic view.
41 * Otherwise, the slot uses "path" to find the descriptor.
42 */
43 XGL_UINT path_len;
44
45 union {
46 XGL_UINT index;
47 XGL_UINT *path;
48 } u;
49};
50
51/**
52 * Shader resource mapping.
53 */
54struct intel_rmap {
55 /* this is not an intel_obj */
56
57 XGL_UINT rt_count;
58 XGL_UINT resource_count;
59 XGL_UINT uav_count;
60 XGL_UINT sampler_count;
61
62 /*
63 * rt_count slots +
64 * resource_count slots +
65 * uav_count slots +
66 * sampler_count slots
67 */
68 struct intel_rmap_slot *slots;
69 XGL_UINT slot_count;
70};
71
Courtney Goeltzenleuchterf21aaab2014-08-28 17:38:09 -060072/**
73 * Implementation limits
74 */
75#define INTEL_MAX_ATTRIBS 32
76#define INTEL_MAX_CLIP_PLANES 8
77#define INTEL_MAX_COLOR_BUFS 8
78#define INTEL_MAX_SHADER_INPUTS 32
79#define INTEL_MAX_SHADER_OUTPUTS 48 /* 32 GENERICs + POS, PSIZE, FOG, etc. */
80#define INTEL_MAX_SHADER_SAMPLER_VIEWS 32
81#define INTEL_MAX_SHADER_RESOURCES 32
82#define INTEL_MAX_TEXTURE_LEVELS 16
83#define INTEL_MAX_CLIP_OR_CULL_DISTANCE_COUNT 8
84#define INTEL_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 2
85
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -060086#define INTEL_MAX_DRAW_BUFFERS 8
87#define INTEL_MAX_CONST_BUFFERS (1 + 12)
88#define INTEL_MAX_SAMPLER_VIEWS 16
89#define INTEL_MAX_SAMPLERS 16
90#define INTEL_MAX_SO_BINDINGS 64
91#define INTEL_MAX_SO_BUFFERS 4
Courtney Goeltzenleuchterf21aaab2014-08-28 17:38:09 -060092#define INTEL_MAX_SO_OUTPUTS 64
93#define INTEL_MAX_VIEWPORTS 1 // TODO: Should this be 16 to match XGL_MAX_VIEWPORTS?
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -060094
95#define INTEL_MAX_VS_SURFACES (INTEL_MAX_CONST_BUFFERS + INTEL_MAX_SAMPLER_VIEWS)
96#define INTEL_VS_CONST_SURFACE(i) (i)
97#define INTEL_VS_TEXTURE_SURFACE(i) (INTEL_MAX_CONST_BUFFERS + i)
98
99#define INTEL_MAX_GS_SURFACES (INTEL_MAX_SO_BINDINGS)
100#define INTEL_GS_SO_SURFACE(i) (i)
101
102#define INTEL_MAX_WM_SURFACES (INTEL_MAX_DRAW_BUFFERS + INTEL_MAX_CONST_BUFFERS + INTEL_MAX_SAMPLER_VIEWS)
103#define INTEL_WM_DRAW_SURFACE(i) (i)
104#define INTEL_WM_CONST_SURFACE(i) (INTEL_MAX_DRAW_BUFFERS + i)
105#define INTEL_WM_TEXTURE_SURFACE(i) (INTEL_MAX_DRAW_BUFFERS + INTEL_MAX_CONST_BUFFERS + i)
106
107#define SHADER_VERTEX_FLAG (1 << XGL_SHADER_STAGE_VERTEX)
108#define SHADER_TESS_CONTROL_FLAG (1 << XGL_SHADER_STAGE_TESS_CONTROL)
109#define SHADER_TESS_EVAL_FLAG (1 << XGL_SHADER_STAGE_TESS_EVALUATION)
110#define SHADER_GEOMETRY_FLAG (1 << XGL_SHADER_STAGE_GEOMETRY)
111#define SHADER_FRAGMENT_FLAG (1 << XGL_SHADER_STAGE_FRAGMENT)
112#define SHADER_COMPUTE_FLAG (1 << XGL_SHADER_STAGE_COMPUTE)
113
Courtney Goeltzenleuchterd85c1d62014-08-27 14:04:53 -0600114struct intel_pipe_shader {
115 void *pCode;
116 uint32_t codeSize;
117};
118
Chia-I Wu1638c1c2014-08-29 14:01:16 +0800119/*
120 * On GEN6, there are
121 *
122 * - 3DSTATE_URB (3)
Chia-I Wu4f3612b2014-08-29 15:40:39 +0800123 * - 3DSTATE_VERTEX_ELEMENTS (3)
Chia-I Wu1638c1c2014-08-29 14:01:16 +0800124 *
125 * On GEN7, there are
126 *
127 * - 3DSTATE_URB_x (2*4)
128 * - 3DSTATE_PUSH_CONSTANT_ALLOC_x (2*5)
Chia-I Wu4f3612b2014-08-29 15:40:39 +0800129 * - 3DSTATE_VERTEX_ELEMENTS (3)
Chia-I Wu1638c1c2014-08-29 14:01:16 +0800130 * - 3DSTATE_HS (7)
131 * - 3DSTATE_TE (4)
132 * - 3DSTATE_DS (6)
133 */
Courtney Goeltzenleuchterdee81a62014-08-28 18:05:24 -0600134#define INTEL_PSO_CMD_ENTRIES 64
Courtney Goeltzenleuchter814cd292014-08-28 13:16:27 -0600135
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600136/**
137 * 3D pipeline.
138 */
139struct intel_pipeline {
140 struct intel_obj obj;
141
142 struct intel_dev *dev;
143
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600144 bool has_gen6_wa_pipe_control;
145
146 /* XGL IA_STATE */
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600147 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600148 int prim_type;
149 bool primitive_restart;
150 uint32_t primitive_restart_index;
151
152 /* Index of provoking vertex for each prim type */
153 int provoking_vertex_tri;
154 int provoking_vertex_trifan;
155 int provoking_vertex_line;
156
157 // TODO: This should probably be Intel HW state, not XGL state.
158 /* Depth Buffer format */
159 XGL_FORMAT db_format;
160
161 XGL_PIPELINE_CB_STATE cb_state;
162
163 // XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state;
164 bool depthClipEnable;
165 bool rasterizerDiscardEnable;
166 float pointSize;
167
168 XGL_PIPELINE_TESS_STATE_CREATE_INFO tess_state;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600169
170 uint32_t active_shaders;
171 XGL_PIPELINE_SHADER vs;
172 XGL_PIPELINE_SHADER fs;
Courtney Goeltzenleuchterd85c1d62014-08-27 14:04:53 -0600173 struct intel_pipe_shader intel_vs;
174 struct intel_rmap *vs_rmap;
175 struct intel_pipe_shader intel_fs;
Chia-I Wued833872014-08-23 17:00:35 +0800176 struct intel_rmap *fs_rmap;
Courtney Goeltzenleuchterd85c1d62014-08-27 14:04:53 -0600177 struct intel_pipe_shader gs;
178 struct intel_pipe_shader tess_control;
179 struct intel_pipe_shader tess_eval;
180 struct intel_pipe_shader compute;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600181
182 int reduced_prim;
183 int so_num_vertices, so_max_vertices;
184
185 uint32_t SF_VIEWPORT;
186 uint32_t CLIP_VIEWPORT;
187 uint32_t SF_CLIP_VIEWPORT; /* GEN7+ */
188 uint32_t CC_VIEWPORT;
189
190 uint32_t COLOR_CALC_STATE;
191 uint32_t BLEND_STATE;
192 uint32_t DEPTH_STENCIL_STATE;
193
194 uint32_t SCISSOR_RECT;
195
196 struct {
197 uint32_t BINDING_TABLE_STATE;
198 int BINDING_TABLE_STATE_size;
199 uint32_t SURFACE_STATE[INTEL_MAX_VS_SURFACES];
200 uint32_t SAMPLER_STATE;
201 uint32_t SAMPLER_BORDER_COLOR_STATE[INTEL_MAX_SAMPLERS];
202 uint32_t PUSH_CONSTANT_BUFFER;
203 int PUSH_CONSTANT_BUFFER_size;
204 } vs_state;
205
206 struct {
207 uint32_t BINDING_TABLE_STATE;
208 int BINDING_TABLE_STATE_size;
209 uint32_t SURFACE_STATE[INTEL_MAX_GS_SURFACES];
210 bool active;
211 } gs_state;
212
213 struct {
214 uint32_t BINDING_TABLE_STATE;
215 int BINDING_TABLE_STATE_size;
216 uint32_t SURFACE_STATE[INTEL_MAX_WM_SURFACES];
217 uint32_t SAMPLER_STATE;
218 uint32_t SAMPLER_BORDER_COLOR_STATE[INTEL_MAX_SAMPLERS];
219 uint32_t PUSH_CONSTANT_BUFFER;
220 int PUSH_CONSTANT_BUFFER_size;
221 } wm_state;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800222
Chia-I Wu8370b402014-08-29 12:28:37 +0800223 uint32_t wa_flags;
224
Courtney Goeltzenleuchter814cd292014-08-28 13:16:27 -0600225 uint32_t cmds[INTEL_PSO_CMD_ENTRIES];
226 XGL_UINT cmd_len;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600227};
228
229static inline struct intel_pipeline *intel_pipeline(XGL_PIPELINE pipeline)
230{
231 return (struct intel_pipeline *) pipeline;
232}
233
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600234static inline struct intel_pipeline *intel_pipeline_from_base(struct intel_base *base)
235{
236 return (struct intel_pipeline *) base;
237}
238
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600239static inline struct intel_pipeline *intel_pipeline_from_obj(struct intel_obj *obj)
240{
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600241 return intel_pipeline_from_base(&obj->base);
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600242}
243
244XGL_RESULT XGLAPI intelCreateGraphicsPipeline(
245 XGL_DEVICE device,
246 const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo,
247 XGL_PIPELINE* pPipeline);
248
249XGL_RESULT XGLAPI intelCreateComputePipeline(
250 XGL_DEVICE device,
251 const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo,
252 XGL_PIPELINE* pPipeline);
253
254XGL_RESULT XGLAPI intelStorePipeline(
255 XGL_PIPELINE pipeline,
256 XGL_SIZE* pDataSize,
257 XGL_VOID* pData);
258
259XGL_RESULT XGLAPI intelLoadPipeline(
260 XGL_DEVICE device,
261 XGL_SIZE dataSize,
262 const XGL_VOID* pData,
263 XGL_PIPELINE* pPipeline);
264
265XGL_RESULT XGLAPI intelCreatePipelineDelta(
266 XGL_DEVICE device,
267 XGL_PIPELINE p1,
268 XGL_PIPELINE p2,
269 XGL_PIPELINE_DELTA* delta);
270#endif // PIPELINE_H