blob: a7a8916a5141f9ec74872a052026adc73b68e897 [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 Goeltzenleuchter05a60542014-08-15 14:54:34 -060072#define INTEL_MAX_DRAW_BUFFERS 8
73#define INTEL_MAX_CONST_BUFFERS (1 + 12)
74#define INTEL_MAX_SAMPLER_VIEWS 16
75#define INTEL_MAX_SAMPLERS 16
76#define INTEL_MAX_SO_BINDINGS 64
77#define INTEL_MAX_SO_BUFFERS 4
78#define INTEL_MAX_VIEWPORTS 1
79
80#define INTEL_MAX_VS_SURFACES (INTEL_MAX_CONST_BUFFERS + INTEL_MAX_SAMPLER_VIEWS)
81#define INTEL_VS_CONST_SURFACE(i) (i)
82#define INTEL_VS_TEXTURE_SURFACE(i) (INTEL_MAX_CONST_BUFFERS + i)
83
84#define INTEL_MAX_GS_SURFACES (INTEL_MAX_SO_BINDINGS)
85#define INTEL_GS_SO_SURFACE(i) (i)
86
87#define INTEL_MAX_WM_SURFACES (INTEL_MAX_DRAW_BUFFERS + INTEL_MAX_CONST_BUFFERS + INTEL_MAX_SAMPLER_VIEWS)
88#define INTEL_WM_DRAW_SURFACE(i) (i)
89#define INTEL_WM_CONST_SURFACE(i) (INTEL_MAX_DRAW_BUFFERS + i)
90#define INTEL_WM_TEXTURE_SURFACE(i) (INTEL_MAX_DRAW_BUFFERS + INTEL_MAX_CONST_BUFFERS + i)
91
92#define SHADER_VERTEX_FLAG (1 << XGL_SHADER_STAGE_VERTEX)
93#define SHADER_TESS_CONTROL_FLAG (1 << XGL_SHADER_STAGE_TESS_CONTROL)
94#define SHADER_TESS_EVAL_FLAG (1 << XGL_SHADER_STAGE_TESS_EVALUATION)
95#define SHADER_GEOMETRY_FLAG (1 << XGL_SHADER_STAGE_GEOMETRY)
96#define SHADER_FRAGMENT_FLAG (1 << XGL_SHADER_STAGE_FRAGMENT)
97#define SHADER_COMPUTE_FLAG (1 << XGL_SHADER_STAGE_COMPUTE)
98
99/**
100 * 3D pipeline.
101 */
102struct intel_pipeline {
103 struct intel_obj obj;
104
105 struct intel_dev *dev;
106
107 struct intel_bo *workaround_bo;
108
109 uint32_t packed_sample_position_1x;
110 uint32_t packed_sample_position_4x;
111 uint32_t packed_sample_position_8x[2];
112
113 bool has_gen6_wa_pipe_control;
114
115 /* XGL IA_STATE */
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600116 XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600117 int prim_type;
118 bool primitive_restart;
119 uint32_t primitive_restart_index;
120
121 /* Index of provoking vertex for each prim type */
122 int provoking_vertex_tri;
123 int provoking_vertex_trifan;
124 int provoking_vertex_line;
125
126 // TODO: This should probably be Intel HW state, not XGL state.
127 /* Depth Buffer format */
128 XGL_FORMAT db_format;
129
130 XGL_PIPELINE_CB_STATE cb_state;
131
132 // XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state;
133 bool depthClipEnable;
134 bool rasterizerDiscardEnable;
135 float pointSize;
136
137 XGL_PIPELINE_TESS_STATE_CREATE_INFO tess_state;
138 XGL_PIPELINE_SHADER_STAGE_CREATE_INFO shader_state;
139
140 uint32_t active_shaders;
141 XGL_PIPELINE_SHADER vs;
142 XGL_PIPELINE_SHADER fs;
143 XGL_PIPELINE_SHADER gs;
144 XGL_PIPELINE_SHADER tess_control;
145 XGL_PIPELINE_SHADER tess_eval;
146 XGL_PIPELINE_SHADER compute;
147
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600148 XGL_SIZE total_size; // FB memory app needs to allocate for this pipeline
149
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600150 int reduced_prim;
151 int so_num_vertices, so_max_vertices;
152
153 uint32_t SF_VIEWPORT;
154 uint32_t CLIP_VIEWPORT;
155 uint32_t SF_CLIP_VIEWPORT; /* GEN7+ */
156 uint32_t CC_VIEWPORT;
157
158 uint32_t COLOR_CALC_STATE;
159 uint32_t BLEND_STATE;
160 uint32_t DEPTH_STENCIL_STATE;
161
162 uint32_t SCISSOR_RECT;
163
164 struct {
165 uint32_t BINDING_TABLE_STATE;
166 int BINDING_TABLE_STATE_size;
167 uint32_t SURFACE_STATE[INTEL_MAX_VS_SURFACES];
168 uint32_t SAMPLER_STATE;
169 uint32_t SAMPLER_BORDER_COLOR_STATE[INTEL_MAX_SAMPLERS];
170 uint32_t PUSH_CONSTANT_BUFFER;
171 int PUSH_CONSTANT_BUFFER_size;
172 } vs_state;
173
174 struct {
175 uint32_t BINDING_TABLE_STATE;
176 int BINDING_TABLE_STATE_size;
177 uint32_t SURFACE_STATE[INTEL_MAX_GS_SURFACES];
178 bool active;
179 } gs_state;
180
181 struct {
182 uint32_t BINDING_TABLE_STATE;
183 int BINDING_TABLE_STATE_size;
184 uint32_t SURFACE_STATE[INTEL_MAX_WM_SURFACES];
185 uint32_t SAMPLER_STATE;
186 uint32_t SAMPLER_BORDER_COLOR_STATE[INTEL_MAX_SAMPLERS];
187 uint32_t PUSH_CONSTANT_BUFFER;
188 int PUSH_CONSTANT_BUFFER_size;
189 } wm_state;
190};
191
192static inline struct intel_pipeline *intel_pipeline(XGL_PIPELINE pipeline)
193{
194 return (struct intel_pipeline *) pipeline;
195}
196
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600197static inline struct intel_pipeline *intel_pipeline_from_base(struct intel_base *base)
198{
199 return (struct intel_pipeline *) base;
200}
201
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600202static inline struct intel_pipeline *intel_pipeline_from_obj(struct intel_obj *obj)
203{
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600204 return intel_pipeline_from_base(&obj->base);
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600205}
206
207XGL_RESULT XGLAPI intelCreateGraphicsPipeline(
208 XGL_DEVICE device,
209 const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo,
210 XGL_PIPELINE* pPipeline);
211
212XGL_RESULT XGLAPI intelCreateComputePipeline(
213 XGL_DEVICE device,
214 const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo,
215 XGL_PIPELINE* pPipeline);
216
217XGL_RESULT XGLAPI intelStorePipeline(
218 XGL_PIPELINE pipeline,
219 XGL_SIZE* pDataSize,
220 XGL_VOID* pData);
221
222XGL_RESULT XGLAPI intelLoadPipeline(
223 XGL_DEVICE device,
224 XGL_SIZE dataSize,
225 const XGL_VOID* pData,
226 XGL_PIPELINE* pPipeline);
227
228XGL_RESULT XGLAPI intelCreatePipelineDelta(
229 XGL_DEVICE device,
230 XGL_PIPELINE p1,
231 XGL_PIPELINE p2,
232 XGL_PIPELINE_DELTA* delta);
233#endif // PIPELINE_H