blob: 7c1e3c0d16575863d77da6dffc33cfb14e5adb36 [file] [log] [blame]
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06003 *
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.
Chia-I Wu44e42362014-09-02 08:32:09 +080023 *
24 * Authors:
25 * Courtney Goeltzenleuchter <courtney@lunarg.com>
26 * Chia-I Wu <olv@lunarg.com>
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -060027 */
28
Chia-I Wu8370b402014-08-29 12:28:37 +080029#include "genhw/genhw.h"
Chia-I Wu3f239832014-12-11 22:57:18 +080030#include "compiler/pipeline/pipeline_compiler_interface.h"
Chia-I Wu8370b402014-08-29 12:28:37 +080031#include "cmd.h"
Chia-I Wu1d125092014-10-08 08:49:38 +080032#include "format.h"
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -060033#include "shader.h"
Chia-I Wu3f239832014-12-11 22:57:18 +080034#include "pipeline.h"
Tony Barbour2094dc72015-07-09 15:26:32 -060035#include "mem.h"
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -060036
Tony Barbour8205d902015-04-16 15:59:00 -060037static int translate_blend_func(VkBlendOp func)
Tony Barbourfa6cac72015-01-16 14:27:35 -070038{
39 switch (func) {
Tony Barbour8205d902015-04-16 15:59:00 -060040 case VK_BLEND_OP_ADD: return GEN6_BLENDFUNCTION_ADD;
41 case VK_BLEND_OP_SUBTRACT: return GEN6_BLENDFUNCTION_SUBTRACT;
42 case VK_BLEND_OP_REVERSE_SUBTRACT: return GEN6_BLENDFUNCTION_REVERSE_SUBTRACT;
43 case VK_BLEND_OP_MIN: return GEN6_BLENDFUNCTION_MIN;
44 case VK_BLEND_OP_MAX: return GEN6_BLENDFUNCTION_MAX;
Tony Barbourfa6cac72015-01-16 14:27:35 -070045 default:
46 assert(!"unknown blend func");
47 return GEN6_BLENDFUNCTION_ADD;
48 };
49}
50
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060051static int translate_blend(VkBlend blend)
Tony Barbourfa6cac72015-01-16 14:27:35 -070052{
53 switch (blend) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060054 case VK_BLEND_ZERO: return GEN6_BLENDFACTOR_ZERO;
55 case VK_BLEND_ONE: return GEN6_BLENDFACTOR_ONE;
56 case VK_BLEND_SRC_COLOR: return GEN6_BLENDFACTOR_SRC_COLOR;
57 case VK_BLEND_ONE_MINUS_SRC_COLOR: return GEN6_BLENDFACTOR_INV_SRC_COLOR;
58 case VK_BLEND_DEST_COLOR: return GEN6_BLENDFACTOR_DST_COLOR;
59 case VK_BLEND_ONE_MINUS_DEST_COLOR: return GEN6_BLENDFACTOR_INV_DST_COLOR;
60 case VK_BLEND_SRC_ALPHA: return GEN6_BLENDFACTOR_SRC_ALPHA;
61 case VK_BLEND_ONE_MINUS_SRC_ALPHA: return GEN6_BLENDFACTOR_INV_SRC_ALPHA;
62 case VK_BLEND_DEST_ALPHA: return GEN6_BLENDFACTOR_DST_ALPHA;
63 case VK_BLEND_ONE_MINUS_DEST_ALPHA: return GEN6_BLENDFACTOR_INV_DST_ALPHA;
64 case VK_BLEND_CONSTANT_COLOR: return GEN6_BLENDFACTOR_CONST_COLOR;
65 case VK_BLEND_ONE_MINUS_CONSTANT_COLOR: return GEN6_BLENDFACTOR_INV_CONST_COLOR;
66 case VK_BLEND_CONSTANT_ALPHA: return GEN6_BLENDFACTOR_CONST_ALPHA;
67 case VK_BLEND_ONE_MINUS_CONSTANT_ALPHA: return GEN6_BLENDFACTOR_INV_CONST_ALPHA;
68 case VK_BLEND_SRC_ALPHA_SATURATE: return GEN6_BLENDFACTOR_SRC_ALPHA_SATURATE;
69 case VK_BLEND_SRC1_COLOR: return GEN6_BLENDFACTOR_SRC1_COLOR;
70 case VK_BLEND_ONE_MINUS_SRC1_COLOR: return GEN6_BLENDFACTOR_INV_SRC1_COLOR;
71 case VK_BLEND_SRC1_ALPHA: return GEN6_BLENDFACTOR_SRC1_ALPHA;
72 case VK_BLEND_ONE_MINUS_SRC1_ALPHA: return GEN6_BLENDFACTOR_INV_SRC1_ALPHA;
Tony Barbourfa6cac72015-01-16 14:27:35 -070073 default:
74 assert(!"unknown blend factor");
75 return GEN6_BLENDFACTOR_ONE;
76 };
77}
78
Tony Barbour8205d902015-04-16 15:59:00 -060079static int translate_compare_func(VkCompareOp func)
Tony Barbourfa6cac72015-01-16 14:27:35 -070080{
81 switch (func) {
Tony Barbour8205d902015-04-16 15:59:00 -060082 case VK_COMPARE_OP_NEVER: return GEN6_COMPAREFUNCTION_NEVER;
83 case VK_COMPARE_OP_LESS: return GEN6_COMPAREFUNCTION_LESS;
84 case VK_COMPARE_OP_EQUAL: return GEN6_COMPAREFUNCTION_EQUAL;
85 case VK_COMPARE_OP_LESS_EQUAL: return GEN6_COMPAREFUNCTION_LEQUAL;
86 case VK_COMPARE_OP_GREATER: return GEN6_COMPAREFUNCTION_GREATER;
87 case VK_COMPARE_OP_NOT_EQUAL: return GEN6_COMPAREFUNCTION_NOTEQUAL;
88 case VK_COMPARE_OP_GREATER_EQUAL: return GEN6_COMPAREFUNCTION_GEQUAL;
89 case VK_COMPARE_OP_ALWAYS: return GEN6_COMPAREFUNCTION_ALWAYS;
Tony Barbourfa6cac72015-01-16 14:27:35 -070090 default:
91 assert(!"unknown compare_func");
92 return GEN6_COMPAREFUNCTION_NEVER;
93 }
94}
95
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060096static int translate_stencil_op(VkStencilOp op)
Tony Barbourfa6cac72015-01-16 14:27:35 -070097{
98 switch (op) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060099 case VK_STENCIL_OP_KEEP: return GEN6_STENCILOP_KEEP;
100 case VK_STENCIL_OP_ZERO: return GEN6_STENCILOP_ZERO;
101 case VK_STENCIL_OP_REPLACE: return GEN6_STENCILOP_REPLACE;
102 case VK_STENCIL_OP_INC_CLAMP: return GEN6_STENCILOP_INCRSAT;
103 case VK_STENCIL_OP_DEC_CLAMP: return GEN6_STENCILOP_DECRSAT;
104 case VK_STENCIL_OP_INVERT: return GEN6_STENCILOP_INVERT;
105 case VK_STENCIL_OP_INC_WRAP: return GEN6_STENCILOP_INCR;
106 case VK_STENCIL_OP_DEC_WRAP: return GEN6_STENCILOP_DECR;
Tony Barbourfa6cac72015-01-16 14:27:35 -0700107 default:
108 assert(!"unknown stencil op");
109 return GEN6_STENCILOP_KEEP;
110 }
111}
112
Chia-I Wu3f239832014-12-11 22:57:18 +0800113struct intel_pipeline_create_info {
Tony Barboure307f582015-07-10 15:29:03 -0600114 VkGraphicsPipelineCreateInfo graphics;
115 VkPipelineVertexInputStateCreateInfo vi;
116 VkPipelineInputAssemblyStateCreateInfo ia;
117 VkPipelineDepthStencilStateCreateInfo db;
118 VkPipelineColorBlendStateCreateInfo cb;
119 VkPipelineRasterStateCreateInfo rs;
120 VkPipelineTessellationStateCreateInfo tess;
121 VkPipelineMultisampleStateCreateInfo ms;
122 VkPipelineViewportStateCreateInfo vp;
Chia-I Wu3f239832014-12-11 22:57:18 +0800123
Tony Barboure307f582015-07-10 15:29:03 -0600124 VkComputePipelineCreateInfo compute;
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -0600125
Tony Barboure307f582015-07-10 15:29:03 -0600126 VkPipelineShaderStageCreateInfo vs;
127 VkPipelineShaderStageCreateInfo tcs;
128 VkPipelineShaderStageCreateInfo tes;
129 VkPipelineShaderStageCreateInfo gs;
130 VkPipelineShaderStageCreateInfo fs;
Chia-I Wu3f239832014-12-11 22:57:18 +0800131};
Chia-I Wu38d1ddf2015-03-02 10:51:39 -0700132
133/* in S1.3 */
134struct intel_pipeline_sample_position {
135 int8_t x, y;
136};
137
138static uint8_t pack_sample_position(const struct intel_dev *dev,
139 const struct intel_pipeline_sample_position *pos)
140{
141 return (pos->x + 8) << 4 | (pos->y + 8);
142}
143
144void intel_pipeline_init_default_sample_patterns(const struct intel_dev *dev,
145 uint8_t *pat_1x, uint8_t *pat_2x,
146 uint8_t *pat_4x, uint8_t *pat_8x,
147 uint8_t *pat_16x)
148{
149 static const struct intel_pipeline_sample_position default_1x[1] = {
150 { 0, 0 },
151 };
152 static const struct intel_pipeline_sample_position default_2x[2] = {
153 { -4, -4 },
154 { 4, 4 },
155 };
156 static const struct intel_pipeline_sample_position default_4x[4] = {
157 { -2, -6 },
158 { 6, -2 },
159 { -6, 2 },
160 { 2, 6 },
161 };
162 static const struct intel_pipeline_sample_position default_8x[8] = {
163 { -1, 1 },
164 { 1, 5 },
165 { 3, -5 },
166 { 5, 3 },
167 { -7, -1 },
168 { -3, -7 },
169 { 7, -3 },
170 { -5, 7 },
171 };
172 static const struct intel_pipeline_sample_position default_16x[16] = {
173 { 0, 2 },
174 { 3, 0 },
175 { -3, -2 },
176 { -2, -4 },
177 { 4, 3 },
178 { 5, 1 },
179 { 6, -1 },
180 { 2, -6 },
181 { -4, 5 },
182 { -5, -5 },
183 { -1, -7 },
184 { 7, -3 },
185 { -7, 4 },
186 { 1, -8 },
187 { -6, 6 },
188 { -8, 7 },
189 };
190 int i;
191
192 pat_1x[0] = pack_sample_position(dev, default_1x);
193 for (i = 0; i < 2; i++)
194 pat_2x[i] = pack_sample_position(dev, &default_2x[i]);
195 for (i = 0; i < 4; i++)
196 pat_4x[i] = pack_sample_position(dev, &default_4x[i]);
197 for (i = 0; i < 8; i++)
198 pat_8x[i] = pack_sample_position(dev, &default_8x[i]);
199 for (i = 0; i < 16; i++)
200 pat_16x[i] = pack_sample_position(dev, &default_16x[i]);
201}
202
Chia-I Wu3f239832014-12-11 22:57:18 +0800203struct intel_pipeline_shader *intel_pipeline_shader_create_meta(struct intel_dev *dev,
204 enum intel_dev_meta_shader id)
205{
206 struct intel_pipeline_shader *sh;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600207 VkResult ret;
Chia-I Wu3f239832014-12-11 22:57:18 +0800208
Tony Barbour8205d902015-04-16 15:59:00 -0600209 sh = intel_alloc(dev, sizeof(*sh), 0, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
Chia-I Wu3f239832014-12-11 22:57:18 +0800210 if (!sh)
211 return NULL;
212 memset(sh, 0, sizeof(*sh));
213
214 ret = intel_pipeline_shader_compile_meta(sh, dev->gpu, id);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600215 if (ret != VK_SUCCESS) {
Chia-I Wuf9c81ef2015-02-22 13:49:15 +0800216 intel_free(dev, sh);
Chia-I Wu3f239832014-12-11 22:57:18 +0800217 return NULL;
218 }
219
220 switch (id) {
221 case INTEL_DEV_META_VS_FILL_MEM:
222 case INTEL_DEV_META_VS_COPY_MEM:
223 case INTEL_DEV_META_VS_COPY_MEM_UNALIGNED:
224 sh->max_threads = intel_gpu_get_max_threads(dev->gpu,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600225 VK_SHADER_STAGE_VERTEX);
Chia-I Wu3f239832014-12-11 22:57:18 +0800226 break;
227 default:
228 sh->max_threads = intel_gpu_get_max_threads(dev->gpu,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600229 VK_SHADER_STAGE_FRAGMENT);
Chia-I Wu3f239832014-12-11 22:57:18 +0800230 break;
231 }
232
233 return sh;
234}
235
Chia-I Wuf13ed3c2015-02-22 14:09:00 +0800236void intel_pipeline_shader_destroy(struct intel_dev *dev,
237 struct intel_pipeline_shader *sh)
Chia-I Wu3f239832014-12-11 22:57:18 +0800238{
Chia-I Wuf13ed3c2015-02-22 14:09:00 +0800239 intel_pipeline_shader_cleanup(sh, dev->gpu);
240 intel_free(dev, sh);
Chia-I Wu3f239832014-12-11 22:57:18 +0800241}
242
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600243static VkResult pipeline_build_shader(struct intel_pipeline *pipeline,
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -0600244 const VkPipelineShaderStageCreateInfo *sh_info,
Chia-I Wuf8385062015-01-04 16:27:24 +0800245 struct intel_pipeline_shader *sh)
Chia-I Wu3f239832014-12-11 22:57:18 +0800246{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600247 VkResult ret;
Chia-I Wu3f239832014-12-11 22:57:18 +0800248
Cody Northropbc12f872015-04-29 13:22:07 -0600249 const struct intel_ir* ir = intel_shader(sh_info->shader)->ir;
250
Chia-I Wuf8385062015-01-04 16:27:24 +0800251 ret = intel_pipeline_shader_compile(sh,
Cody Northropbc12f872015-04-29 13:22:07 -0600252 pipeline->dev->gpu, pipeline->pipeline_layout, sh_info, ir);
253
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600254 if (ret != VK_SUCCESS)
Chia-I Wu3f239832014-12-11 22:57:18 +0800255 return ret;
256
257 sh->max_threads =
258 intel_gpu_get_max_threads(pipeline->dev->gpu, sh_info->stage);
259
260 /* 1KB aligned */
261 sh->scratch_offset = u_align(pipeline->scratch_size, 1024);
262 pipeline->scratch_size = sh->scratch_offset +
263 sh->per_thread_scratch_size * sh->max_threads;
264
265 pipeline->active_shaders |= 1 << sh_info->stage;
266
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600267 return VK_SUCCESS;
Chia-I Wu3f239832014-12-11 22:57:18 +0800268}
269
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600270static VkResult pipeline_build_shaders(struct intel_pipeline *pipeline,
Chia-I Wu3f239832014-12-11 22:57:18 +0800271 const struct intel_pipeline_create_info *info)
272{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600273 VkResult ret = VK_SUCCESS;
Chia-I Wu3f239832014-12-11 22:57:18 +0800274
Tony Barbourde4124d2015-07-03 10:33:54 -0600275 if (ret == VK_SUCCESS && info->vs.shader.handle)
Chia-I Wudf601c42015-04-17 01:58:07 +0800276 ret = pipeline_build_shader(pipeline, &info->vs, &pipeline->vs);
Tony Barbourde4124d2015-07-03 10:33:54 -0600277 if (ret == VK_SUCCESS && info->tcs.shader.handle)
Chia-I Wudf601c42015-04-17 01:58:07 +0800278 ret = pipeline_build_shader(pipeline, &info->tcs,&pipeline->tcs);
Tony Barbourde4124d2015-07-03 10:33:54 -0600279 if (ret == VK_SUCCESS && info->tes.shader.handle)
Chia-I Wudf601c42015-04-17 01:58:07 +0800280 ret = pipeline_build_shader(pipeline, &info->tes,&pipeline->tes);
Tony Barbourde4124d2015-07-03 10:33:54 -0600281 if (ret == VK_SUCCESS && info->gs.shader.handle)
Chia-I Wudf601c42015-04-17 01:58:07 +0800282 ret = pipeline_build_shader(pipeline, &info->gs, &pipeline->gs);
Tony Barbourde4124d2015-07-03 10:33:54 -0600283 if (ret == VK_SUCCESS && info->fs.shader.handle)
Chia-I Wudf601c42015-04-17 01:58:07 +0800284 ret = pipeline_build_shader(pipeline, &info->fs, &pipeline->fs);
Chia-I Wu3f239832014-12-11 22:57:18 +0800285
Courtney Goeltzenleuchter7db1fed2015-09-02 13:07:51 -0600286 if (ret == VK_SUCCESS && info->compute.stage.shader.handle) {
Chia-I Wudf601c42015-04-17 01:58:07 +0800287 ret = pipeline_build_shader(pipeline,
Courtney Goeltzenleuchter7db1fed2015-09-02 13:07:51 -0600288 &info->compute.stage, &pipeline->cs);
Chia-I Wuf8385062015-01-04 16:27:24 +0800289 }
Chia-I Wu3f239832014-12-11 22:57:18 +0800290
291 return ret;
292}
Courtney Goeltzenleuchter814cd292014-08-28 13:16:27 -0600293static uint32_t *pipeline_cmd_ptr(struct intel_pipeline *pipeline, int cmd_len)
294{
295 uint32_t *ptr;
296
297 assert(pipeline->cmd_len + cmd_len < INTEL_PSO_CMD_ENTRIES);
298 ptr = &pipeline->cmds[pipeline->cmd_len];
299 pipeline->cmd_len += cmd_len;
300 return ptr;
301}
302
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600303static VkResult pipeline_build_ia(struct intel_pipeline *pipeline,
Chia-I Wube0a3d92014-09-02 13:20:59 +0800304 const struct intel_pipeline_create_info* info)
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600305{
Chia-I Wube0a3d92014-09-02 13:20:59 +0800306 pipeline->topology = info->ia.topology;
Courtney Goeltzenleuchter99349ec2015-07-12 15:35:40 -0600307 pipeline->disable_vs_cache = false;
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600308
Chia-I Wube0a3d92014-09-02 13:20:59 +0800309 switch (info->ia.topology) {
Tony Barbour8205d902015-04-16 15:59:00 -0600310 case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
Courtney Goeltzenleuchter8a3de592014-08-22 09:09:46 -0600311 pipeline->prim_type = GEN6_3DPRIM_POINTLIST;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600312 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600313 case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
Courtney Goeltzenleuchter8a3de592014-08-22 09:09:46 -0600314 pipeline->prim_type = GEN6_3DPRIM_LINELIST;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600315 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600316 case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
Courtney Goeltzenleuchter8a3de592014-08-22 09:09:46 -0600317 pipeline->prim_type = GEN6_3DPRIM_LINESTRIP;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600318 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600319 case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
Courtney Goeltzenleuchter8a3de592014-08-22 09:09:46 -0600320 pipeline->prim_type = GEN6_3DPRIM_TRILIST;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600321 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600322 case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
Courtney Goeltzenleuchter8a3de592014-08-22 09:09:46 -0600323 pipeline->prim_type = GEN6_3DPRIM_TRISTRIP;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600324 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600325 case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
Courtney Goeltzenleuchter528781d2015-03-03 11:38:12 -0700326 pipeline->prim_type = GEN6_3DPRIM_TRIFAN;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600327 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600328 case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_ADJ:
Courtney Goeltzenleuchter8a3de592014-08-22 09:09:46 -0600329 pipeline->prim_type = GEN6_3DPRIM_LINELIST_ADJ;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600330 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600331 case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_ADJ:
Courtney Goeltzenleuchter8a3de592014-08-22 09:09:46 -0600332 pipeline->prim_type = GEN6_3DPRIM_LINESTRIP_ADJ;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600333 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600334 case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_ADJ:
Courtney Goeltzenleuchter8a3de592014-08-22 09:09:46 -0600335 pipeline->prim_type = GEN6_3DPRIM_TRILIST_ADJ;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600336 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600337 case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_ADJ:
Courtney Goeltzenleuchter8a3de592014-08-22 09:09:46 -0600338 pipeline->prim_type = GEN6_3DPRIM_TRISTRIP_ADJ;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600339 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600340 case VK_PRIMITIVE_TOPOLOGY_PATCH:
Chia-I Wube0a3d92014-09-02 13:20:59 +0800341 if (!info->tess.patchControlPoints ||
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600342 info->tess.patchControlPoints > 32) {
343 /* TODOVV: Move test to validation layer */
344// return VK_ERROR_BAD_PIPELINE_DATA;
345 return VK_ERROR_UNKNOWN;
346 }
Chia-I Wube0a3d92014-09-02 13:20:59 +0800347 pipeline->prim_type = GEN7_3DPRIM_PATCHLIST_1 +
348 info->tess.patchControlPoints - 1;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600349 break;
350 default:
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600351 /* TODOVV: Move test to validation layer */
352// return VK_ERROR_BAD_PIPELINE_DATA;
353 return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600354 }
355
Chia-I Wube0a3d92014-09-02 13:20:59 +0800356 if (info->ia.primitiveRestartEnable) {
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600357 pipeline->primitive_restart = true;
Courtney Goeltzenleuchtera7281c22015-07-12 15:42:02 -0600358 pipeline->primitive_restart_index = 0;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600359 } else {
360 pipeline->primitive_restart = false;
361 }
362
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600363 return VK_SUCCESS;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600364}
365
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600366static VkResult pipeline_build_rs_state(struct intel_pipeline *pipeline,
Chia-I Wu6abcb0e2015-03-24 14:38:14 +0800367 const struct intel_pipeline_create_info* info)
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600368{
Tony Barboure307f582015-07-10 15:29:03 -0600369 const VkPipelineRasterStateCreateInfo *rs_state = &info->rs;
Chia-I Wu6abcb0e2015-03-24 14:38:14 +0800370 bool ccw;
371
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600372 pipeline->depthClipEnable = rs_state->depthClipEnable;
373 pipeline->rasterizerDiscardEnable = rs_state->rasterizerDiscardEnable;
Cody Northropf5bd2252015-08-17 11:10:49 -0600374 pipeline->depthBiasEnable = rs_state->depthBiasEnable;
Tony Barbourfa6cac72015-01-16 14:27:35 -0700375
Tony Barbourfa6cac72015-01-16 14:27:35 -0700376 switch (rs_state->fillMode) {
Tony Barbour8205d902015-04-16 15:59:00 -0600377 case VK_FILL_MODE_POINTS:
Tony Barbourfa6cac72015-01-16 14:27:35 -0700378 pipeline->cmd_sf_fill |= GEN7_SF_DW1_FRONTFACE_POINT |
379 GEN7_SF_DW1_BACKFACE_POINT;
380 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600381 case VK_FILL_MODE_WIREFRAME:
Tony Barbourfa6cac72015-01-16 14:27:35 -0700382 pipeline->cmd_sf_fill |= GEN7_SF_DW1_FRONTFACE_WIREFRAME |
383 GEN7_SF_DW1_BACKFACE_WIREFRAME;
384 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600385 case VK_FILL_MODE_SOLID:
Tony Barbourfa6cac72015-01-16 14:27:35 -0700386 default:
387 pipeline->cmd_sf_fill |= GEN7_SF_DW1_FRONTFACE_SOLID |
388 GEN7_SF_DW1_BACKFACE_SOLID;
389 break;
390 }
391
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600392 ccw = (rs_state->frontFace == VK_FRONT_FACE_CCW);
Chia-I Wu6abcb0e2015-03-24 14:38:14 +0800393 /* flip the winding order */
Chia-I Wu6abcb0e2015-03-24 14:38:14 +0800394
395 if (ccw) {
Tony Barbourfa6cac72015-01-16 14:27:35 -0700396 pipeline->cmd_sf_fill |= GEN7_SF_DW1_FRONTWINDING_CCW;
397 pipeline->cmd_clip_cull |= GEN7_CLIP_DW1_FRONTWINDING_CCW;
398 }
399
400 switch (rs_state->cullMode) {
Tony Barbour8205d902015-04-16 15:59:00 -0600401 case VK_CULL_MODE_NONE:
Tony Barbourfa6cac72015-01-16 14:27:35 -0700402 default:
403 pipeline->cmd_sf_cull |= GEN7_SF_DW2_CULLMODE_NONE;
404 pipeline->cmd_clip_cull |= GEN7_CLIP_DW1_CULLMODE_NONE;
405 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600406 case VK_CULL_MODE_FRONT:
Tony Barbourfa6cac72015-01-16 14:27:35 -0700407 pipeline->cmd_sf_cull |= GEN7_SF_DW2_CULLMODE_FRONT;
408 pipeline->cmd_clip_cull |= GEN7_CLIP_DW1_CULLMODE_FRONT;
409 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600410 case VK_CULL_MODE_BACK:
Tony Barbourfa6cac72015-01-16 14:27:35 -0700411 pipeline->cmd_sf_cull |= GEN7_SF_DW2_CULLMODE_BACK;
412 pipeline->cmd_clip_cull |= GEN7_CLIP_DW1_CULLMODE_BACK;
413 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600414 case VK_CULL_MODE_FRONT_AND_BACK:
Tony Barbourfa6cac72015-01-16 14:27:35 -0700415 pipeline->cmd_sf_cull |= GEN7_SF_DW2_CULLMODE_BOTH;
416 pipeline->cmd_clip_cull |= GEN7_CLIP_DW1_CULLMODE_BOTH;
417 break;
418 }
419
420 /* only GEN7+ needs cull mode in 3DSTATE_CLIP */
421 if (intel_gpu_gen(pipeline->dev->gpu) == INTEL_GEN(6))
422 pipeline->cmd_clip_cull = 0;
423
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600424 return VK_SUCCESS;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600425}
426
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600427static void pipeline_destroy(struct intel_obj *obj)
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600428{
429 struct intel_pipeline *pipeline = intel_pipeline_from_obj(obj);
430
Chia-I Wu3f239832014-12-11 22:57:18 +0800431 if (pipeline->active_shaders & SHADER_VERTEX_FLAG) {
Chia-I Wuf13ed3c2015-02-22 14:09:00 +0800432 intel_pipeline_shader_cleanup(&pipeline->vs, pipeline->dev->gpu);
Chia-I Wu3f239832014-12-11 22:57:18 +0800433 }
434
435 if (pipeline->active_shaders & SHADER_TESS_CONTROL_FLAG) {
Chia-I Wuf13ed3c2015-02-22 14:09:00 +0800436 intel_pipeline_shader_cleanup(&pipeline->tcs, pipeline->dev->gpu);
Chia-I Wu3f239832014-12-11 22:57:18 +0800437 }
438
439 if (pipeline->active_shaders & SHADER_TESS_EVAL_FLAG) {
Chia-I Wuf13ed3c2015-02-22 14:09:00 +0800440 intel_pipeline_shader_cleanup(&pipeline->tes, pipeline->dev->gpu);
Chia-I Wu3f239832014-12-11 22:57:18 +0800441 }
442
443 if (pipeline->active_shaders & SHADER_GEOMETRY_FLAG) {
Chia-I Wuf13ed3c2015-02-22 14:09:00 +0800444 intel_pipeline_shader_cleanup(&pipeline->gs, pipeline->dev->gpu);
Chia-I Wu3f239832014-12-11 22:57:18 +0800445 }
446
447 if (pipeline->active_shaders & SHADER_FRAGMENT_FLAG) {
Chia-I Wuf13ed3c2015-02-22 14:09:00 +0800448 intel_pipeline_shader_cleanup(&pipeline->fs, pipeline->dev->gpu);
Chia-I Wu3f239832014-12-11 22:57:18 +0800449 }
450
451 if (pipeline->active_shaders & SHADER_COMPUTE_FLAG) {
Chia-I Wuf13ed3c2015-02-22 14:09:00 +0800452 intel_pipeline_shader_cleanup(&pipeline->cs, pipeline->dev->gpu);
Chia-I Wu3f239832014-12-11 22:57:18 +0800453 }
Chia-I Wued833872014-08-23 17:00:35 +0800454
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600455 intel_base_destroy(&pipeline->obj.base);
456}
457
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600458static VkResult pipeline_validate(struct intel_pipeline *pipeline)
Chia-I Wu3efef432014-08-28 15:00:16 +0800459{
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600460 /*
461 * Validate required elements
462 */
463 if (!(pipeline->active_shaders & SHADER_VERTEX_FLAG)) {
464 // TODO: Log debug message: Vertex Shader required.
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600465 /* TODOVV: Add test to validation layer */
466// return VK_ERROR_BAD_PIPELINE_DATA;
467 return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600468 }
469
470 /*
471 * Tessalation control and evaluation have to both have a shader defined or
472 * neither should have a shader defined.
473 */
474 if (((pipeline->active_shaders & SHADER_TESS_CONTROL_FLAG) == 0) !=
475 ((pipeline->active_shaders & SHADER_TESS_EVAL_FLAG) == 0) ) {
476 // TODO: Log debug message: Both Tess control and Tess eval are required to use tessalation
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600477 /* TODOVV: Add test to validation layer */
478// return VK_ERROR_BAD_PIPELINE_DATA;
479 return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600480 }
481
482 if ((pipeline->active_shaders & SHADER_COMPUTE_FLAG) &&
483 (pipeline->active_shaders & (SHADER_VERTEX_FLAG | SHADER_TESS_CONTROL_FLAG |
484 SHADER_TESS_EVAL_FLAG | SHADER_GEOMETRY_FLAG |
485 SHADER_FRAGMENT_FLAG))) {
486 // TODO: Log debug message: Can only specify compute shader when doing compute
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600487 /* TODOVV: Add test to validation layer */
488// return VK_ERROR_BAD_PIPELINE_DATA;
489 return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600490 }
491
492 /*
Tony Barbour8205d902015-04-16 15:59:00 -0600493 * VK_PRIMITIVE_TOPOLOGY_PATCH primitive topology is only valid for tessellation pipelines.
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600494 * Mismatching primitive topology and tessellation fails graphics pipeline creation.
495 */
496 if (pipeline->active_shaders & (SHADER_TESS_CONTROL_FLAG | SHADER_TESS_EVAL_FLAG) &&
Tony Barbour8205d902015-04-16 15:59:00 -0600497 (pipeline->topology != VK_PRIMITIVE_TOPOLOGY_PATCH)) {
Tobin Ehlis43c973b2015-06-22 11:31:09 -0600498 // TODO: Log debug message: Invalid topology used with tessellation shader.
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600499 /* TODOVV: Add test to validation layer */
500// return VK_ERROR_BAD_PIPELINE_DATA;
501 return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600502 }
503
Tony Barbour8205d902015-04-16 15:59:00 -0600504 if ((pipeline->topology == VK_PRIMITIVE_TOPOLOGY_PATCH) &&
Tobin Ehlis43c973b2015-06-22 11:31:09 -0600505 (~pipeline->active_shaders & (SHADER_TESS_CONTROL_FLAG | SHADER_TESS_EVAL_FLAG))) {
506 // TODO: Log debug message: Cannot use TOPOLOGY_PATCH on non-tessellation shader.
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600507 /* TODOVV: Add test to validation layer */
508// return VK_ERROR_BAD_PIPELINE_DATA;
509 return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchter42509992014-08-21 17:33:46 -0600510 }
511
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600512 return VK_SUCCESS;
Chia-I Wu3efef432014-08-28 15:00:16 +0800513}
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -0600514
Chia-I Wuf90ff0c2014-09-02 09:32:46 +0800515static void pipeline_build_urb_alloc_gen6(struct intel_pipeline *pipeline,
516 const struct intel_pipeline_create_info *info)
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800517{
Chia-I Wu509b3f22014-09-02 10:24:05 +0800518 const struct intel_gpu *gpu = pipeline->dev->gpu;
519 const int urb_size = ((gpu->gt == 2) ? 64 : 32) * 1024;
Chia-I Wua4d1b392014-10-10 13:57:29 +0800520 const struct intel_pipeline_shader *vs = &pipeline->vs;
521 const struct intel_pipeline_shader *gs = &pipeline->gs;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800522 int vs_entry_size, gs_entry_size;
523 int vs_size, gs_size;
524
Chia-I Wu509b3f22014-09-02 10:24:05 +0800525 INTEL_GPU_ASSERT(gpu, 6, 6);
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800526
527 vs_entry_size = ((vs->in_count >= vs->out_count) ?
528 vs->in_count : vs->out_count);
529 gs_entry_size = (gs) ? gs->out_count : 0;
530
531 /* in bytes */
532 vs_entry_size *= sizeof(float) * 4;
533 gs_entry_size *= sizeof(float) * 4;
534
Chia-I Wua4d1b392014-10-10 13:57:29 +0800535 if (pipeline->active_shaders & SHADER_GEOMETRY_FLAG) {
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800536 vs_size = urb_size / 2;
537 gs_size = vs_size;
538 } else {
539 vs_size = urb_size;
540 gs_size = 0;
541 }
542
543 /* 3DSTATE_URB */
544 {
545 const uint8_t cmd_len = 3;
546 const uint32_t dw0 = GEN6_RENDER_CMD(3D, 3DSTATE_URB) |
547 (cmd_len - 2);
548 int vs_alloc_size, gs_alloc_size;
549 int vs_entry_count, gs_entry_count;
550 uint32_t *dw;
551
552 /* in 1024-bit rows */
553 vs_alloc_size = (vs_entry_size + 128 - 1) / 128;
554 gs_alloc_size = (gs_entry_size + 128 - 1) / 128;
555
556 /* valid range is [1, 5] */
557 if (!vs_alloc_size)
558 vs_alloc_size = 1;
559 if (!gs_alloc_size)
560 gs_alloc_size = 1;
561 assert(vs_alloc_size <= 5 && gs_alloc_size <= 5);
562
563 /* valid range is [24, 256], multiples of 4 */
564 vs_entry_count = (vs_size / 128 / vs_alloc_size) & ~3;
565 if (vs_entry_count > 256)
566 vs_entry_count = 256;
567 assert(vs_entry_count >= 24);
568
569 /* valid range is [0, 256], multiples of 4 */
570 gs_entry_count = (gs_size / 128 / gs_alloc_size) & ~3;
571 if (gs_entry_count > 256)
572 gs_entry_count = 256;
573
Courtney Goeltzenleuchter814cd292014-08-28 13:16:27 -0600574 dw = pipeline_cmd_ptr(pipeline, cmd_len);
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800575
576 dw[0] = dw0;
577 dw[1] = (vs_alloc_size - 1) << GEN6_URB_DW1_VS_ENTRY_SIZE__SHIFT |
578 vs_entry_count << GEN6_URB_DW1_VS_ENTRY_COUNT__SHIFT;
579 dw[2] = gs_entry_count << GEN6_URB_DW2_GS_ENTRY_COUNT__SHIFT |
580 (gs_alloc_size - 1) << GEN6_URB_DW2_GS_ENTRY_SIZE__SHIFT;
581 }
582}
583
Chia-I Wuf90ff0c2014-09-02 09:32:46 +0800584static void pipeline_build_urb_alloc_gen7(struct intel_pipeline *pipeline,
585 const struct intel_pipeline_create_info *info)
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800586{
Chia-I Wu509b3f22014-09-02 10:24:05 +0800587 const struct intel_gpu *gpu = pipeline->dev->gpu;
588 const int urb_size = ((gpu->gt == 3) ? 512 :
589 (gpu->gt == 2) ? 256 : 128) * 1024;
Cody Northrop306ec352014-10-06 15:11:45 -0600590 const struct intel_pipeline_shader *vs = &pipeline->vs;
591 const struct intel_pipeline_shader *gs = &pipeline->gs;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800592 /* some space is reserved for PCBs */
Chia-I Wu509b3f22014-09-02 10:24:05 +0800593 int urb_offset = ((gpu->gt == 3) ? 32 : 16) * 1024;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800594 int vs_entry_size, gs_entry_size;
595 int vs_size, gs_size;
596
Chia-I Wu509b3f22014-09-02 10:24:05 +0800597 INTEL_GPU_ASSERT(gpu, 7, 7.5);
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800598
599 vs_entry_size = ((vs->in_count >= vs->out_count) ?
600 vs->in_count : vs->out_count);
601 gs_entry_size = (gs) ? gs->out_count : 0;
602
603 /* in bytes */
604 vs_entry_size *= sizeof(float) * 4;
605 gs_entry_size *= sizeof(float) * 4;
606
Chia-I Wua4d1b392014-10-10 13:57:29 +0800607 if (pipeline->active_shaders & SHADER_GEOMETRY_FLAG) {
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800608 vs_size = (urb_size - urb_offset) / 2;
609 gs_size = vs_size;
610 } else {
611 vs_size = urb_size - urb_offset;
612 gs_size = 0;
613 }
614
615 /* 3DSTATE_URB_* */
616 {
617 const uint8_t cmd_len = 2;
618 int vs_alloc_size, gs_alloc_size;
619 int vs_entry_count, gs_entry_count;
620 uint32_t *dw;
621
622 /* in 512-bit rows */
623 vs_alloc_size = (vs_entry_size + 64 - 1) / 64;
624 gs_alloc_size = (gs_entry_size + 64 - 1) / 64;
625
626 if (!vs_alloc_size)
627 vs_alloc_size = 1;
628 if (!gs_alloc_size)
629 gs_alloc_size = 1;
630
631 /* avoid performance decrease due to banking */
632 if (vs_alloc_size == 5)
633 vs_alloc_size = 6;
634
635 /* in multiples of 8 */
636 vs_entry_count = (vs_size / 64 / vs_alloc_size) & ~7;
637 assert(vs_entry_count >= 32);
638
639 gs_entry_count = (gs_size / 64 / gs_alloc_size) & ~7;
640
Chia-I Wu509b3f22014-09-02 10:24:05 +0800641 if (intel_gpu_gen(gpu) >= INTEL_GEN(7.5)) {
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800642 const int max_vs_entry_count =
Chia-I Wu509b3f22014-09-02 10:24:05 +0800643 (gpu->gt >= 2) ? 1664 : 640;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800644 const int max_gs_entry_count =
Chia-I Wu509b3f22014-09-02 10:24:05 +0800645 (gpu->gt >= 2) ? 640 : 256;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800646 if (vs_entry_count >= max_vs_entry_count)
647 vs_entry_count = max_vs_entry_count;
648 if (gs_entry_count >= max_gs_entry_count)
649 gs_entry_count = max_gs_entry_count;
650 } else {
651 const int max_vs_entry_count =
Chia-I Wu509b3f22014-09-02 10:24:05 +0800652 (gpu->gt == 2) ? 704 : 512;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800653 const int max_gs_entry_count =
Chia-I Wu509b3f22014-09-02 10:24:05 +0800654 (gpu->gt == 2) ? 320 : 192;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800655 if (vs_entry_count >= max_vs_entry_count)
656 vs_entry_count = max_vs_entry_count;
657 if (gs_entry_count >= max_gs_entry_count)
658 gs_entry_count = max_gs_entry_count;
659 }
660
Courtney Goeltzenleuchter814cd292014-08-28 13:16:27 -0600661 dw = pipeline_cmd_ptr(pipeline, cmd_len*4);
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800662 dw[0] = GEN7_RENDER_CMD(3D, 3DSTATE_URB_VS) | (cmd_len - 2);
Chia-I Wu97aa4de2015-03-05 15:43:16 -0700663 dw[1] = (urb_offset / 8192) << GEN7_URB_DW1_OFFSET__SHIFT |
664 (vs_alloc_size - 1) << GEN7_URB_DW1_ENTRY_SIZE__SHIFT |
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800665 vs_entry_count;
666
667 dw += 2;
668 if (gs_size)
669 urb_offset += vs_size;
670 dw[0] = GEN7_RENDER_CMD(3D, 3DSTATE_URB_GS) | (cmd_len - 2);
Chia-I Wu97aa4de2015-03-05 15:43:16 -0700671 dw[1] = (urb_offset / 8192) << GEN7_URB_DW1_OFFSET__SHIFT |
672 (gs_alloc_size - 1) << GEN7_URB_DW1_ENTRY_SIZE__SHIFT |
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800673 gs_entry_count;
674
675 dw += 2;
676 dw[0] = GEN7_RENDER_CMD(3D, 3DSTATE_URB_HS) | (cmd_len - 2);
Chia-I Wu97aa4de2015-03-05 15:43:16 -0700677 dw[1] = (urb_offset / 8192) << GEN7_URB_DW1_OFFSET__SHIFT;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800678
679 dw += 2;
680 dw[0] = GEN7_RENDER_CMD(3D, 3DSTATE_URB_DS) | (cmd_len - 2);
Chia-I Wu97aa4de2015-03-05 15:43:16 -0700681 dw[1] = (urb_offset / 8192) << GEN7_URB_DW1_OFFSET__SHIFT;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +0800682 }
683}
684
Chia-I Wuf90ff0c2014-09-02 09:32:46 +0800685static void pipeline_build_vertex_elements(struct intel_pipeline *pipeline,
686 const struct intel_pipeline_create_info *info)
Chia-I Wu4d9ad912014-08-29 14:20:36 +0800687{
Cody Northrop306ec352014-10-06 15:11:45 -0600688 const struct intel_pipeline_shader *vs = &pipeline->vs;
Chia-I Wu1d125092014-10-08 08:49:38 +0800689 uint8_t cmd_len;
Chia-I Wu4d9ad912014-08-29 14:20:36 +0800690 uint32_t *dw;
Courtney Goeltzenleuchterf5cdad02015-03-31 16:36:30 -0600691 uint32_t i, j;
692 uint32_t attr_count;
693 uint32_t attrs_processed;
Chia-I Wu1d125092014-10-08 08:49:38 +0800694 int comps[4];
Chia-I Wu4d9ad912014-08-29 14:20:36 +0800695
Chia-I Wu509b3f22014-09-02 10:24:05 +0800696 INTEL_GPU_ASSERT(pipeline->dev->gpu, 6, 7.5);
Chia-I Wu4d9ad912014-08-29 14:20:36 +0800697
Courtney Goeltzenleuchterf5cdad02015-03-31 16:36:30 -0600698 attr_count = u_popcountll(vs->inputs_read);
699 cmd_len = 1 + 2 * attr_count;
Chia-I Wu1d125092014-10-08 08:49:38 +0800700 if (vs->uses & (INTEL_SHADER_USE_VID | INTEL_SHADER_USE_IID))
701 cmd_len += 2;
702
703 if (cmd_len == 1)
Chia-I Wu4d9ad912014-08-29 14:20:36 +0800704 return;
705
706 dw = pipeline_cmd_ptr(pipeline, cmd_len);
Chia-I Wu1d125092014-10-08 08:49:38 +0800707
708 dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_VERTEX_ELEMENTS) |
709 (cmd_len - 2);
Chia-I Wu4d9ad912014-08-29 14:20:36 +0800710 dw++;
711
Chia-I Wu4d9ad912014-08-29 14:20:36 +0800712 /* VERTEX_ELEMENT_STATE */
Courtney Goeltzenleuchterf5cdad02015-03-31 16:36:30 -0600713 for (i = 0, attrs_processed = 0; attrs_processed < attr_count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600714 VkVertexInputAttributeDescription *attr = NULL;
Courtney Goeltzenleuchterf5cdad02015-03-31 16:36:30 -0600715
716 /*
717 * The compiler will pack the shader references and then
718 * indicate which locations are used via the bitmask in
719 * vs->inputs_read.
720 */
721 if (!(vs->inputs_read & (1L << i))) {
GregF2dc40212014-10-31 17:31:47 -0600722 continue;
Courtney Goeltzenleuchterf5cdad02015-03-31 16:36:30 -0600723 }
724
725 /*
726 * For each bit set in the vs->inputs_read we'll need
727 * to find the corresponding attribute record and then
728 * set up the next HW vertex element based on that attribute.
729 */
730 for (j = 0; j < info->vi.attributeCount; j++) {
731 if (info->vi.pVertexAttributeDescriptions[j].location == i) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600732 attr = (VkVertexInputAttributeDescription *) &info->vi.pVertexAttributeDescriptions[j];
Courtney Goeltzenleuchterf5cdad02015-03-31 16:36:30 -0600733 attrs_processed++;
734 break;
735 }
736 }
737 assert(attr != NULL);
738
Chia-I Wu1d125092014-10-08 08:49:38 +0800739 const int format =
740 intel_format_translate_color(pipeline->dev->gpu, attr->format);
741
742 comps[0] = GEN6_VFCOMP_STORE_0;
743 comps[1] = GEN6_VFCOMP_STORE_0;
744 comps[2] = GEN6_VFCOMP_STORE_0;
745 comps[3] = icd_format_is_int(attr->format) ?
746 GEN6_VFCOMP_STORE_1_INT : GEN6_VFCOMP_STORE_1_FP;
747
748 switch (icd_format_get_channel_count(attr->format)) {
749 case 4: comps[3] = GEN6_VFCOMP_STORE_SRC; /* fall through */
750 case 3: comps[2] = GEN6_VFCOMP_STORE_SRC; /* fall through */
751 case 2: comps[1] = GEN6_VFCOMP_STORE_SRC; /* fall through */
752 case 1: comps[0] = GEN6_VFCOMP_STORE_SRC; break;
753 default:
754 break;
755 }
756
757 assert(attr->offsetInBytes <= 2047);
758
Chia-I Wu97aa4de2015-03-05 15:43:16 -0700759 dw[0] = attr->binding << GEN6_VE_DW0_VB_INDEX__SHIFT |
760 GEN6_VE_DW0_VALID |
761 format << GEN6_VE_DW0_FORMAT__SHIFT |
Chia-I Wu1d125092014-10-08 08:49:38 +0800762 attr->offsetInBytes;
763
Chia-I Wu97aa4de2015-03-05 15:43:16 -0700764 dw[1] = comps[0] << GEN6_VE_DW1_COMP0__SHIFT |
765 comps[1] << GEN6_VE_DW1_COMP1__SHIFT |
766 comps[2] << GEN6_VE_DW1_COMP2__SHIFT |
767 comps[3] << GEN6_VE_DW1_COMP3__SHIFT;
Chia-I Wu1d125092014-10-08 08:49:38 +0800768
769 dw += 2;
770 }
GregF932fcf52014-10-29 17:02:11 -0600771
772 if (vs->uses & (INTEL_SHADER_USE_VID | INTEL_SHADER_USE_IID)) {
773 comps[0] = (vs->uses & INTEL_SHADER_USE_VID) ?
774 GEN6_VFCOMP_STORE_VID : GEN6_VFCOMP_STORE_0;
775 comps[1] = (vs->uses & INTEL_SHADER_USE_IID) ?
776 GEN6_VFCOMP_STORE_IID : GEN6_VFCOMP_NOSTORE;
777 comps[2] = GEN6_VFCOMP_NOSTORE;
778 comps[3] = GEN6_VFCOMP_NOSTORE;
779
Chia-I Wu97aa4de2015-03-05 15:43:16 -0700780 dw[0] = GEN6_VE_DW0_VALID;
781 dw[1] = comps[0] << GEN6_VE_DW1_COMP0__SHIFT |
782 comps[1] << GEN6_VE_DW1_COMP1__SHIFT |
783 comps[2] << GEN6_VE_DW1_COMP2__SHIFT |
784 comps[3] << GEN6_VE_DW1_COMP3__SHIFT;
GregF932fcf52014-10-29 17:02:11 -0600785
786 dw += 2;
787 }
Chia-I Wu4d9ad912014-08-29 14:20:36 +0800788}
789
Chia-I Wu86a5e0c2015-03-24 11:01:50 +0800790static void pipeline_build_fragment_SBE(struct intel_pipeline *pipeline,
791 const struct intel_pipeline_create_info *info)
GregF8cd81832014-11-18 18:01:01 -0700792{
793 const struct intel_pipeline_shader *fs = &pipeline->fs;
GregF8cd81832014-11-18 18:01:01 -0700794 uint8_t cmd_len;
795 uint32_t *body;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600796 uint32_t attr_skip, attr_count;
797 uint32_t vue_offset, vue_len;
798 uint32_t i;
GregF8cd81832014-11-18 18:01:01 -0700799
Cody Northrop293d4502015-05-05 09:38:03 -0600800 // If GS is active, use its outputs
801 const struct intel_pipeline_shader *src =
802 (pipeline->active_shaders & SHADER_GEOMETRY_FLAG)
803 ? &pipeline->gs
804 : &pipeline->vs;
805
GregF8cd81832014-11-18 18:01:01 -0700806 INTEL_GPU_ASSERT(pipeline->dev->gpu, 6, 7.5);
807
808 cmd_len = 14;
809
Chia-I Wuf85def42015-01-29 00:34:24 +0800810 if (intel_gpu_gen(pipeline->dev->gpu) >= INTEL_GEN(7))
811 body = pipeline_cmd_ptr(pipeline, cmd_len);
812 else
813 body = pipeline->cmd_3dstate_sbe;
GregF8cd81832014-11-18 18:01:01 -0700814
Cody Northrop293d4502015-05-05 09:38:03 -0600815 assert(!fs->reads_user_clip || src->enable_user_clip);
816 attr_skip = src->outputs_offset;
817 if (src->enable_user_clip != fs->reads_user_clip) {
GregF8cd81832014-11-18 18:01:01 -0700818 attr_skip += 2;
819 }
Cody Northrop293d4502015-05-05 09:38:03 -0600820 assert(src->out_count >= attr_skip);
821 attr_count = src->out_count - attr_skip;
GregF8cd81832014-11-18 18:01:01 -0700822
823 // LUNARG TODO: We currently are only handling 16 attrs;
824 // ultimately, we need to handle 32
825 assert(fs->in_count <= 16);
826 assert(attr_count <= 16);
827
828 vue_offset = attr_skip / 2;
829 vue_len = (attr_count + 1) / 2;
830 if (!vue_len)
831 vue_len = 1;
832
833 body[0] = GEN7_RENDER_CMD(3D, 3DSTATE_SBE) |
834 (cmd_len - 2);
835
836 // LUNARG TODO: If the attrs needed by the FS are exactly
837 // what is written by the VS, we don't need to enable
838 // swizzling, improving performance. Even if we swizzle,
839 // we can improve performance by reducing vue_len to
840 // just include the values needed by the FS:
841 // vue_len = ceiling((max_vs_out + 1)/2)
842
843 body[1] = GEN7_SBE_DW1_ATTR_SWIZZLE_ENABLE |
844 fs->in_count << GEN7_SBE_DW1_ATTR_COUNT__SHIFT |
845 vue_len << GEN7_SBE_DW1_URB_READ_LEN__SHIFT |
846 vue_offset << GEN7_SBE_DW1_URB_READ_OFFSET__SHIFT;
847
Courtney Goeltzenleuchter9c057f52015-07-12 14:53:14 -0600848 /* Vulkan default is point origin upper left */
849 body[1] |= GEN7_SBE_DW1_POINT_SPRITE_TEXCOORD_UPPERLEFT;
Chia-I Wu86a5e0c2015-03-24 11:01:50 +0800850
Cody Northrop293d4502015-05-05 09:38:03 -0600851 uint16_t src_slot[fs->in_count];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600852 int32_t fs_in = 0;
Cody Northrop293d4502015-05-05 09:38:03 -0600853 int32_t src_out = - (vue_offset * 2 - src->outputs_offset);
GregF8cd81832014-11-18 18:01:01 -0700854 for (i=0; i < 64; i++) {
Cody Northrop293d4502015-05-05 09:38:03 -0600855 bool srcWrites = src->outputs_written & (1L << i);
856 bool fsReads = fs->inputs_read & (1L << i);
Cody Northropd75c13e2015-01-02 14:07:20 -0700857
858 if (fsReads) {
Cody Northrop293d4502015-05-05 09:38:03 -0600859 assert(src_out >= 0);
GregF8cd81832014-11-18 18:01:01 -0700860 assert(fs_in < fs->in_count);
Cody Northrop293d4502015-05-05 09:38:03 -0600861 src_slot[fs_in] = src_out;
Cody Northropd75c13e2015-01-02 14:07:20 -0700862
Cody Northrop293d4502015-05-05 09:38:03 -0600863 if (!srcWrites) {
Cody Northropd75c13e2015-01-02 14:07:20 -0700864 // If the vertex shader did not write this input, we cannot
865 // program the SBE to read it. Our choices are to allow it to
866 // read junk from a GRF, or get zero. We're choosing zero.
867 if (i >= fs->generic_input_start) {
Cody Northrop293d4502015-05-05 09:38:03 -0600868 src_slot[fs_in] = GEN8_SBE_SWIZ_CONST_0000 |
Chia-I Wu97aa4de2015-03-05 15:43:16 -0700869 GEN8_SBE_SWIZ_OVERRIDE_X |
870 GEN8_SBE_SWIZ_OVERRIDE_Y |
871 GEN8_SBE_SWIZ_OVERRIDE_Z |
872 GEN8_SBE_SWIZ_OVERRIDE_W;
Cody Northropd75c13e2015-01-02 14:07:20 -0700873 }
874 }
875
GregF8cd81832014-11-18 18:01:01 -0700876 fs_in += 1;
877 }
Cody Northrop293d4502015-05-05 09:38:03 -0600878 if (srcWrites) {
879 src_out += 1;
GregF8cd81832014-11-18 18:01:01 -0700880 }
881 }
882
883 for (i = 0; i < 8; i++) {
884 uint16_t hi, lo;
885
886 /* no attr swizzles */
887 if (i * 2 + 1 < fs->in_count) {
Cody Northrop293d4502015-05-05 09:38:03 -0600888 lo = src_slot[i * 2];
889 hi = src_slot[i * 2 + 1];
GregF8cd81832014-11-18 18:01:01 -0700890 } else if (i * 2 < fs->in_count) {
Cody Northrop293d4502015-05-05 09:38:03 -0600891 lo = src_slot[i * 2];
GregF8cd81832014-11-18 18:01:01 -0700892 hi = 0;
893 } else {
894 hi = 0;
895 lo = 0;
896 }
897
Chia-I Wu97aa4de2015-03-05 15:43:16 -0700898 body[2 + i] = hi << GEN8_SBE_SWIZ_HIGH__SHIFT | lo;
GregF8cd81832014-11-18 18:01:01 -0700899 }
900
Tony Barbour8205d902015-04-16 15:59:00 -0600901 if (info->ia.topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST)
Chia-I Wu7f390562015-03-25 08:47:18 +0800902 body[10] = fs->point_sprite_enables;
903 else
904 body[10] = 0;
Chia-I Wu86a5e0c2015-03-24 11:01:50 +0800905
GregF8cd81832014-11-18 18:01:01 -0700906 body[11] = 0; /* constant interpolation enables */
907 body[12] = 0; /* WrapShortest enables */
908 body[13] = 0;
909}
910
Chia-I Wuf90ff0c2014-09-02 09:32:46 +0800911static void pipeline_build_gs(struct intel_pipeline *pipeline,
912 const struct intel_pipeline_create_info *info)
Courtney Goeltzenleuchterb2867702014-08-28 17:44:05 -0600913{
Courtney Goeltzenleuchterb2867702014-08-28 17:44:05 -0600914 // gen7_emit_3DSTATE_GS done by cmd_pipeline
Courtney Goeltzenleuchterb2867702014-08-28 17:44:05 -0600915}
916
Chia-I Wuf90ff0c2014-09-02 09:32:46 +0800917static void pipeline_build_hs(struct intel_pipeline *pipeline,
918 const struct intel_pipeline_create_info *info)
Courtney Goeltzenleuchterdee81a62014-08-28 18:05:24 -0600919{
920 const uint8_t cmd_len = 7;
921 const uint32_t dw0 = GEN7_RENDER_CMD(3D, 3DSTATE_HS) | (cmd_len - 2);
922 uint32_t *dw;
923
Chia-I Wu509b3f22014-09-02 10:24:05 +0800924 INTEL_GPU_ASSERT(pipeline->dev->gpu, 7, 7.5);
Courtney Goeltzenleuchterdee81a62014-08-28 18:05:24 -0600925
Chia-I Wuf90ff0c2014-09-02 09:32:46 +0800926 dw = pipeline_cmd_ptr(pipeline, cmd_len);
Courtney Goeltzenleuchterdee81a62014-08-28 18:05:24 -0600927 dw[0] = dw0;
928 dw[1] = 0;
929 dw[2] = 0;
930 dw[3] = 0;
931 dw[4] = 0;
932 dw[5] = 0;
933 dw[6] = 0;
934}
935
Chia-I Wuf90ff0c2014-09-02 09:32:46 +0800936static void pipeline_build_te(struct intel_pipeline *pipeline,
937 const struct intel_pipeline_create_info *info)
Courtney Goeltzenleuchterdee81a62014-08-28 18:05:24 -0600938{
939 const uint8_t cmd_len = 4;
940 const uint32_t dw0 = GEN7_RENDER_CMD(3D, 3DSTATE_TE) | (cmd_len - 2);
941 uint32_t *dw;
942
Chia-I Wu509b3f22014-09-02 10:24:05 +0800943 INTEL_GPU_ASSERT(pipeline->dev->gpu, 7, 7.5);
Courtney Goeltzenleuchterdee81a62014-08-28 18:05:24 -0600944
Chia-I Wuf90ff0c2014-09-02 09:32:46 +0800945 dw = pipeline_cmd_ptr(pipeline, cmd_len);
Courtney Goeltzenleuchterdee81a62014-08-28 18:05:24 -0600946 dw[0] = dw0;
947 dw[1] = 0;
948 dw[2] = 0;
949 dw[3] = 0;
950}
951
Chia-I Wuf90ff0c2014-09-02 09:32:46 +0800952static void pipeline_build_ds(struct intel_pipeline *pipeline,
953 const struct intel_pipeline_create_info *info)
Courtney Goeltzenleuchterdee81a62014-08-28 18:05:24 -0600954{
955 const uint8_t cmd_len = 6;
956 const uint32_t dw0 = GEN7_RENDER_CMD(3D, 3DSTATE_DS) | (cmd_len - 2);
957 uint32_t *dw;
958
Chia-I Wu509b3f22014-09-02 10:24:05 +0800959 INTEL_GPU_ASSERT(pipeline->dev->gpu, 7, 7.5);
Courtney Goeltzenleuchterdee81a62014-08-28 18:05:24 -0600960
Chia-I Wuf90ff0c2014-09-02 09:32:46 +0800961 dw = pipeline_cmd_ptr(pipeline, cmd_len);
Courtney Goeltzenleuchterdee81a62014-08-28 18:05:24 -0600962 dw[0] = dw0;
963 dw[1] = 0;
964 dw[2] = 0;
965 dw[3] = 0;
966 dw[4] = 0;
967 dw[5] = 0;
968}
969
Tony Barbourfa6cac72015-01-16 14:27:35 -0700970static void pipeline_build_depth_stencil(struct intel_pipeline *pipeline,
971 const struct intel_pipeline_create_info *info)
972{
973 pipeline->cmd_depth_stencil = 0;
974
975 if (info->db.stencilTestEnable) {
976 pipeline->cmd_depth_stencil = 1 << 31 |
Tony Barbour8205d902015-04-16 15:59:00 -0600977 translate_compare_func(info->db.front.stencilCompareOp) << 28 |
Tony Barbourfa6cac72015-01-16 14:27:35 -0700978 translate_stencil_op(info->db.front.stencilFailOp) << 25 |
979 translate_stencil_op(info->db.front.stencilDepthFailOp) << 22 |
980 translate_stencil_op(info->db.front.stencilPassOp) << 19 |
981 1 << 15 |
Tony Barbour8205d902015-04-16 15:59:00 -0600982 translate_compare_func(info->db.back.stencilCompareOp) << 12 |
Tony Barbourfa6cac72015-01-16 14:27:35 -0700983 translate_stencil_op(info->db.back.stencilFailOp) << 9 |
984 translate_stencil_op(info->db.back.stencilDepthFailOp) << 6 |
985 translate_stencil_op(info->db.back.stencilPassOp) << 3;
986 }
987
988 pipeline->stencilTestEnable = info->db.stencilTestEnable;
989
990 /*
991 * From the Sandy Bridge PRM, volume 2 part 1, page 360:
992 *
993 * "Enabling the Depth Test function without defining a Depth Buffer is
994 * UNDEFINED."
995 *
996 * From the Sandy Bridge PRM, volume 2 part 1, page 375:
997 *
998 * "A Depth Buffer must be defined before enabling writes to it, or
999 * operation is UNDEFINED."
1000 *
1001 * TODO We do not check these yet.
1002 */
1003 if (info->db.depthTestEnable) {
1004 pipeline->cmd_depth_test = GEN6_ZS_DW2_DEPTH_TEST_ENABLE |
Tony Barbour8205d902015-04-16 15:59:00 -06001005 translate_compare_func(info->db.depthCompareOp) << 27;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001006 } else {
1007 pipeline->cmd_depth_test = GEN6_COMPAREFUNCTION_ALWAYS << 27;
1008 }
1009
1010 if (info->db.depthWriteEnable)
1011 pipeline->cmd_depth_test |= GEN6_ZS_DW2_DEPTH_WRITE_ENABLE;
1012}
1013
Tony Barbourfa6cac72015-01-16 14:27:35 -07001014static void pipeline_build_msaa(struct intel_pipeline *pipeline,
1015 const struct intel_pipeline_create_info *info)
1016{
1017 uint32_t cmd, cmd_len;
1018 uint32_t *dw;
1019
1020 INTEL_GPU_ASSERT(pipeline->dev->gpu, 6, 7.5);
1021
Tony Barboure094edf2015-06-26 10:18:34 -06001022 pipeline->sample_count = (info->ms.rasterSamples <= 1) ? 1 : info->ms.rasterSamples;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001023
1024 /* 3DSTATE_SAMPLE_MASK */
1025 cmd = GEN6_RENDER_CMD(3D, 3DSTATE_SAMPLE_MASK);
1026 cmd_len = 2;
1027
Chia-I Wu8ada4242015-03-02 11:19:33 -07001028 dw = pipeline_cmd_ptr(pipeline, cmd_len);
Tony Barbourfa6cac72015-01-16 14:27:35 -07001029 dw[0] = cmd | (cmd_len - 2);
Cody Northrope9825b72015-08-04 14:34:54 -06001030 if (info->ms.pSampleMask) {
1031 /* "Bit B of mask word M corresponds to sample 32*M + B."
1032 * "The array is sized to a length of ceil(rasterSamples / 32) words."
1033 * "If pSampleMask is NULL, it is treated as if the mask has all bits enabled,"
1034 * "i.e. no coverage is removed from primitives."
1035 */
1036 assert(pipeline->sample_count / 32 == 0);
1037 dw[1] = *info->ms.pSampleMask & ((1 << pipeline->sample_count) - 1);
1038 } else {
1039 dw[1] = (1 << pipeline->sample_count) - 1;
1040 }
1041
Tony Barbourfa6cac72015-01-16 14:27:35 -07001042 pipeline->cmd_sample_mask = dw[1];
1043}
1044
1045static void pipeline_build_cb(struct intel_pipeline *pipeline,
1046 const struct intel_pipeline_create_info *info)
1047{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001048 uint32_t i;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001049
1050 INTEL_GPU_ASSERT(pipeline->dev->gpu, 6, 7.5);
1051 STATIC_ASSERT(ARRAY_SIZE(pipeline->cmd_cb) >= INTEL_MAX_RENDER_TARGETS*2);
1052 assert(info->cb.attachmentCount <= INTEL_MAX_RENDER_TARGETS);
1053
1054 uint32_t *dw = pipeline->cmd_cb;
1055
1056 for (i = 0; i < info->cb.attachmentCount; i++) {
Tony Barboure307f582015-07-10 15:29:03 -06001057 const VkPipelineColorBlendAttachmentState *att = &info->cb.pAttachments[i];
Tony Barbourfa6cac72015-01-16 14:27:35 -07001058 uint32_t dw0, dw1;
1059
1060
1061 dw0 = 0;
Chia-I Wu97aa4de2015-03-05 15:43:16 -07001062 dw1 = GEN6_RT_DW1_COLORCLAMP_RTFORMAT |
1063 GEN6_RT_DW1_PRE_BLEND_CLAMP |
1064 GEN6_RT_DW1_POST_BLEND_CLAMP;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001065
1066 if (att->blendEnable) {
1067 dw0 = 1 << 31 |
Tony Barbour8205d902015-04-16 15:59:00 -06001068 translate_blend_func(att->blendOpAlpha) << 26 |
Tony Barbourfa6cac72015-01-16 14:27:35 -07001069 translate_blend(att->srcBlendAlpha) << 20 |
1070 translate_blend(att->destBlendAlpha) << 15 |
Tony Barbour8205d902015-04-16 15:59:00 -06001071 translate_blend_func(att->blendOpColor) << 11 |
Tony Barbourfa6cac72015-01-16 14:27:35 -07001072 translate_blend(att->srcBlendColor) << 5 |
1073 translate_blend(att->destBlendColor);
1074
Tony Barbour8205d902015-04-16 15:59:00 -06001075 if (att->blendOpAlpha != att->blendOpColor ||
Tony Barbourfa6cac72015-01-16 14:27:35 -07001076 att->srcBlendAlpha != att->srcBlendColor ||
1077 att->destBlendAlpha != att->destBlendColor)
1078 dw0 |= 1 << 30;
Courtney Goeltzenleuchterdf13a4d2015-02-11 14:14:45 -07001079
1080 pipeline->dual_source_blend_enable = icd_pipeline_cb_att_needs_dual_source_blending(att);
Tony Barbourfa6cac72015-01-16 14:27:35 -07001081 }
1082
Courtney Goeltzenleuchter72af13a2015-06-26 17:45:23 -06001083 if (info->cb.logicOpEnable && info->cb.logicOp != VK_LOGIC_OP_COPY) {
Tony Barbourfa6cac72015-01-16 14:27:35 -07001084 int logicop;
1085
1086 switch (info->cb.logicOp) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001087 case VK_LOGIC_OP_CLEAR: logicop = GEN6_LOGICOP_CLEAR; break;
1088 case VK_LOGIC_OP_AND: logicop = GEN6_LOGICOP_AND; break;
1089 case VK_LOGIC_OP_AND_REVERSE: logicop = GEN6_LOGICOP_AND_REVERSE; break;
1090 case VK_LOGIC_OP_AND_INVERTED: logicop = GEN6_LOGICOP_AND_INVERTED; break;
1091 case VK_LOGIC_OP_NOOP: logicop = GEN6_LOGICOP_NOOP; break;
1092 case VK_LOGIC_OP_XOR: logicop = GEN6_LOGICOP_XOR; break;
1093 case VK_LOGIC_OP_OR: logicop = GEN6_LOGICOP_OR; break;
1094 case VK_LOGIC_OP_NOR: logicop = GEN6_LOGICOP_NOR; break;
1095 case VK_LOGIC_OP_EQUIV: logicop = GEN6_LOGICOP_EQUIV; break;
1096 case VK_LOGIC_OP_INVERT: logicop = GEN6_LOGICOP_INVERT; break;
1097 case VK_LOGIC_OP_OR_REVERSE: logicop = GEN6_LOGICOP_OR_REVERSE; break;
1098 case VK_LOGIC_OP_COPY_INVERTED: logicop = GEN6_LOGICOP_COPY_INVERTED; break;
1099 case VK_LOGIC_OP_OR_INVERTED: logicop = GEN6_LOGICOP_OR_INVERTED; break;
1100 case VK_LOGIC_OP_NAND: logicop = GEN6_LOGICOP_NAND; break;
1101 case VK_LOGIC_OP_SET: logicop = GEN6_LOGICOP_SET; break;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001102 default:
1103 assert(!"unknown logic op");
1104 logicop = GEN6_LOGICOP_CLEAR;
1105 break;
1106 }
1107
Chia-I Wu97aa4de2015-03-05 15:43:16 -07001108 dw1 |= GEN6_RT_DW1_LOGICOP_ENABLE |
1109 logicop << GEN6_RT_DW1_LOGICOP_FUNC__SHIFT;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001110 }
1111
1112 if (!(att->channelWriteMask & 0x1))
Chia-I Wu97aa4de2015-03-05 15:43:16 -07001113 dw1 |= GEN6_RT_DW1_WRITE_DISABLE_R;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001114 if (!(att->channelWriteMask & 0x2))
Chia-I Wu97aa4de2015-03-05 15:43:16 -07001115 dw1 |= GEN6_RT_DW1_WRITE_DISABLE_G;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001116 if (!(att->channelWriteMask & 0x4))
Chia-I Wu97aa4de2015-03-05 15:43:16 -07001117 dw1 |= GEN6_RT_DW1_WRITE_DISABLE_B;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001118 if (!(att->channelWriteMask & 0x8))
Chia-I Wu97aa4de2015-03-05 15:43:16 -07001119 dw1 |= GEN6_RT_DW1_WRITE_DISABLE_A;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001120
1121 dw[2 * i] = dw0;
1122 dw[2 * i + 1] = dw1;
1123 }
1124
1125 for (i=info->cb.attachmentCount; i < INTEL_MAX_RENDER_TARGETS; i++)
1126 {
1127 dw[2 * i] = 0;
Chia-I Wu97aa4de2015-03-05 15:43:16 -07001128 dw[2 * i + 1] = GEN6_RT_DW1_COLORCLAMP_RTFORMAT |
1129 GEN6_RT_DW1_PRE_BLEND_CLAMP |
1130 GEN6_RT_DW1_POST_BLEND_CLAMP |
1131 GEN6_RT_DW1_WRITE_DISABLE_R |
1132 GEN6_RT_DW1_WRITE_DISABLE_G |
1133 GEN6_RT_DW1_WRITE_DISABLE_B |
1134 GEN6_RT_DW1_WRITE_DISABLE_A;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001135 }
1136
1137}
1138
1139
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001140static VkResult pipeline_build_all(struct intel_pipeline *pipeline,
Chia-I Wuf90ff0c2014-09-02 09:32:46 +08001141 const struct intel_pipeline_create_info *info)
Chia-I Wu3efef432014-08-28 15:00:16 +08001142{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001143 VkResult ret;
Chia-I Wu3efef432014-08-28 15:00:16 +08001144
Chia-I Wu98824592014-09-02 09:42:46 +08001145 ret = pipeline_build_shaders(pipeline, info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001146 if (ret != VK_SUCCESS)
Chia-I Wu98824592014-09-02 09:42:46 +08001147 return ret;
1148
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001149 /* TODOVV: Move test to validation layer */
Chia-I Wu1d125092014-10-08 08:49:38 +08001150 if (info->vi.bindingCount > ARRAY_SIZE(pipeline->vb) ||
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001151 info->vi.attributeCount > ARRAY_SIZE(pipeline->vb)) {
1152// return VK_ERROR_BAD_PIPELINE_DATA;
1153 return VK_ERROR_UNKNOWN;
1154 }
Chia-I Wu1d125092014-10-08 08:49:38 +08001155
1156 pipeline->vb_count = info->vi.bindingCount;
1157 memcpy(pipeline->vb, info->vi.pVertexBindingDescriptions,
1158 sizeof(pipeline->vb[0]) * pipeline->vb_count);
1159
Chia-I Wuf90ff0c2014-09-02 09:32:46 +08001160 pipeline_build_vertex_elements(pipeline, info);
Chia-I Wu86a5e0c2015-03-24 11:01:50 +08001161 pipeline_build_fragment_SBE(pipeline, info);
Tony Barbourfa6cac72015-01-16 14:27:35 -07001162 pipeline_build_msaa(pipeline, info);
Chia-I Wu5bdb0962015-01-24 12:49:28 +08001163 pipeline_build_depth_stencil(pipeline, info);
Chia-I Wu4d9ad912014-08-29 14:20:36 +08001164
Chia-I Wu509b3f22014-09-02 10:24:05 +08001165 if (intel_gpu_gen(pipeline->dev->gpu) >= INTEL_GEN(7)) {
Chia-I Wuf90ff0c2014-09-02 09:32:46 +08001166 pipeline_build_urb_alloc_gen7(pipeline, info);
Chia-I Wuf90ff0c2014-09-02 09:32:46 +08001167 pipeline_build_gs(pipeline, info);
1168 pipeline_build_hs(pipeline, info);
1169 pipeline_build_te(pipeline, info);
1170 pipeline_build_ds(pipeline, info);
Chia-I Wu8370b402014-08-29 12:28:37 +08001171
1172 pipeline->wa_flags = INTEL_CMD_WA_GEN6_PRE_DEPTH_STALL_WRITE |
1173 INTEL_CMD_WA_GEN6_PRE_COMMAND_SCOREBOARD_STALL |
1174 INTEL_CMD_WA_GEN7_PRE_VS_DEPTH_STALL_WRITE |
1175 INTEL_CMD_WA_GEN7_POST_COMMAND_CS_STALL |
1176 INTEL_CMD_WA_GEN7_POST_COMMAND_DEPTH_STALL;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +08001177 } else {
Chia-I Wuf90ff0c2014-09-02 09:32:46 +08001178 pipeline_build_urb_alloc_gen6(pipeline, info);
Chia-I Wu8370b402014-08-29 12:28:37 +08001179
1180 pipeline->wa_flags = INTEL_CMD_WA_GEN6_PRE_DEPTH_STALL_WRITE |
1181 INTEL_CMD_WA_GEN6_PRE_COMMAND_SCOREBOARD_STALL;
Chia-I Wubb2d8ca2014-08-28 23:15:48 +08001182 }
1183
Chia-I Wube0a3d92014-09-02 13:20:59 +08001184 ret = pipeline_build_ia(pipeline, info);
Chia-I Wu3efef432014-08-28 15:00:16 +08001185
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001186 if (ret == VK_SUCCESS)
Chia-I Wu6abcb0e2015-03-24 14:38:14 +08001187 ret = pipeline_build_rs_state(pipeline, info);
Chia-I Wu3efef432014-08-28 15:00:16 +08001188
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001189 if (ret == VK_SUCCESS) {
Tony Barbourfa6cac72015-01-16 14:27:35 -07001190 pipeline_build_cb(pipeline, info);
Chia-I Wuf90ff0c2014-09-02 09:32:46 +08001191 pipeline->cb_state = info->cb;
1192 pipeline->tess_state = info->tess;
Chia-I Wu3efef432014-08-28 15:00:16 +08001193 }
1194
1195 return ret;
1196}
1197
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001198static VkResult pipeline_create_info_init(struct intel_pipeline_create_info *info,
1199 const VkGraphicsPipelineCreateInfo *vkinfo)
Chia-I Wu3efef432014-08-28 15:00:16 +08001200{
Chia-I Wuf90ff0c2014-09-02 09:32:46 +08001201 memset(info, 0, sizeof(*info));
Chia-I Wu3efef432014-08-28 15:00:16 +08001202
Tony Barbourfa6cac72015-01-16 14:27:35 -07001203 /*
1204 * Do we need to set safe defaults in case the app doesn't provide all of
1205 * the necessary create infos?
1206 */
Tony Barboure094edf2015-06-26 10:18:34 -06001207 info->ms.rasterSamples = 1;
Cody Northrope9825b72015-08-04 14:34:54 -06001208 info->ms.pSampleMask = NULL;
Tony Barbourfa6cac72015-01-16 14:27:35 -07001209
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001210 memcpy(&info->graphics, vkinfo, sizeof (info->graphics));
Chia-I Wu3efef432014-08-28 15:00:16 +08001211
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001212 void *dst;
1213 for (uint32_t i = 0; i < vkinfo->stageCount; i++) {
1214 const VkPipelineShaderStageCreateInfo *thisStage = &vkinfo->pStages[i];
1215 switch (thisStage->stage) {
1216 case VK_SHADER_STAGE_VERTEX:
1217 dst = &info->vs;
1218 break;
1219 case VK_SHADER_STAGE_TESS_CONTROL:
1220 dst = &info->tcs;
1221 break;
1222 case VK_SHADER_STAGE_TESS_EVALUATION:
1223 dst = &info->tes;
1224 break;
1225 case VK_SHADER_STAGE_GEOMETRY:
1226 dst = &info->gs;
1227 break;
1228 case VK_SHADER_STAGE_FRAGMENT:
1229 dst = &info->fs;
1230 break;
1231 case VK_SHADER_STAGE_COMPUTE:
1232 dst = &info->compute;
1233 break;
1234 default:
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001235 /* TODOVV: Move test to validation layer */
1236// return VK_ERROR_BAD_PIPELINE_DATA;
1237 return VK_ERROR_UNKNOWN;
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001238 break;
Chia-I Wu3efef432014-08-28 15:00:16 +08001239 }
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001240 memcpy(dst, thisStage, sizeof(VkPipelineShaderStageCreateInfo));
1241 }
Chia-I Wu3efef432014-08-28 15:00:16 +08001242
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001243 if (vkinfo->pVertexInputState != NULL) {
1244 memcpy(&info->vi, vkinfo->pVertexInputState, sizeof (info->vi));
1245 }
Tony Barboure307f582015-07-10 15:29:03 -06001246 if (vkinfo->pInputAssemblyState != NULL) {
1247 memcpy(&info->ia, vkinfo->pInputAssemblyState, sizeof (info->ia));
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001248 }
Tony Barboure307f582015-07-10 15:29:03 -06001249 if (vkinfo->pDepthStencilState != NULL) {
1250 memcpy(&info->db, vkinfo->pDepthStencilState, sizeof (info->db));
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001251 }
Tony Barboure307f582015-07-10 15:29:03 -06001252 if (vkinfo->pColorBlendState != NULL) {
1253 memcpy(&info->cb, vkinfo->pColorBlendState, sizeof (info->cb));
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001254 }
Tony Barboure307f582015-07-10 15:29:03 -06001255 if (vkinfo->pRasterState != NULL) {
1256 memcpy(&info->rs, vkinfo->pRasterState, sizeof (info->rs));
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001257 }
Tony Barboure307f582015-07-10 15:29:03 -06001258 if (vkinfo->pTessellationState != NULL) {
1259 memcpy(&info->tess, vkinfo->pTessellationState, sizeof (info->tess));
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001260 }
Tony Barboure307f582015-07-10 15:29:03 -06001261 if (vkinfo->pMultisampleState != NULL) {
1262 memcpy(&info->ms, vkinfo->pMultisampleState, sizeof (info->ms));
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001263 }
Tony Barboure307f582015-07-10 15:29:03 -06001264 if (vkinfo->pViewportState != NULL) {
1265 memcpy(&info->vp, vkinfo->pViewportState, sizeof (info->vp));
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001266 }
Tony Barboure307f582015-07-10 15:29:03 -06001267 if (vkinfo->pViewportState != NULL) {
1268 memcpy(&info->vp, vkinfo->pViewportState, sizeof (info->vp));
Chia-I Wu3efef432014-08-28 15:00:16 +08001269 }
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001270
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001271 return VK_SUCCESS;
Chia-I Wu3efef432014-08-28 15:00:16 +08001272}
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001273
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001274static VkResult graphics_pipeline_create(struct intel_dev *dev,
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001275 const VkGraphicsPipelineCreateInfo *info_,
1276 struct intel_pipeline **pipeline_ret)
Chia-I Wu3efef432014-08-28 15:00:16 +08001277{
Chia-I Wuf90ff0c2014-09-02 09:32:46 +08001278 struct intel_pipeline_create_info info;
Chia-I Wu3efef432014-08-28 15:00:16 +08001279 struct intel_pipeline *pipeline;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001280 VkResult ret;
Chia-I Wu3efef432014-08-28 15:00:16 +08001281
Mark Lobodzinski0e0fb5c2015-06-23 15:11:57 -06001282 ret = pipeline_create_info_init(&info, info_);
1283
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001284 if (ret != VK_SUCCESS)
Chia-I Wu3efef432014-08-28 15:00:16 +08001285 return ret;
1286
Chia-I Wu545c2e12015-02-22 13:19:54 +08001287 pipeline = (struct intel_pipeline *) intel_base_create(&dev->base.handle,
Jon Ashburn0d60d272015-07-09 15:02:25 -06001288 sizeof (*pipeline), dev->base.dbg,
1289 VK_OBJECT_TYPE_PIPELINE, info_, 0);
Chia-I Wu3efef432014-08-28 15:00:16 +08001290 if (!pipeline)
Tony Barbour8205d902015-04-16 15:59:00 -06001291 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu3efef432014-08-28 15:00:16 +08001292
1293 pipeline->dev = dev;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001294 pipeline->pipeline_layout = intel_pipeline_layout(info.graphics.layout);
Chia-I Wudf601c42015-04-17 01:58:07 +08001295
Chia-I Wu3efef432014-08-28 15:00:16 +08001296 pipeline->obj.destroy = pipeline_destroy;
Chia-I Wu3efef432014-08-28 15:00:16 +08001297
Chia-I Wuf90ff0c2014-09-02 09:32:46 +08001298 ret = pipeline_build_all(pipeline, &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001299 if (ret == VK_SUCCESS)
Chia-I Wuf90ff0c2014-09-02 09:32:46 +08001300 ret = pipeline_validate(pipeline);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001301 if (ret != VK_SUCCESS) {
Chia-I Wu3efef432014-08-28 15:00:16 +08001302 pipeline_destroy(&pipeline->obj);
1303 return ret;
1304 }
1305
Tony Barbour2094dc72015-07-09 15:26:32 -06001306 VkMemoryAllocInfo mem_reqs;
1307 mem_reqs.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
1308 mem_reqs.allocationSize = pipeline->scratch_size;
1309 mem_reqs.pNext = NULL;
1310 mem_reqs.memoryTypeIndex = 0;
1311 intel_mem_alloc(dev, &mem_reqs, &pipeline->obj.mem);
1312
Chia-I Wu3efef432014-08-28 15:00:16 +08001313 *pipeline_ret = pipeline;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001314 return VK_SUCCESS;
Chia-I Wu3efef432014-08-28 15:00:16 +08001315}
1316
Jon Ashburn0d60d272015-07-09 15:02:25 -06001317ICD_EXPORT VkResult VKAPI vkCreatePipelineCache(
1318 VkDevice device,
1319 const VkPipelineCacheCreateInfo* pCreateInfo,
1320 VkPipelineCache* pPipelineCache)
Chia-I Wu3efef432014-08-28 15:00:16 +08001321{
Chia-I Wu3efef432014-08-28 15:00:16 +08001322
Jon Ashburn0d60d272015-07-09 15:02:25 -06001323 // non-dispatchable objects only need to be 64 bits currently
1324 *((uint64_t *)pPipelineCache) = 1;
1325 return VK_SUCCESS;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001326}
1327
Jon Ashburn0d60d272015-07-09 15:02:25 -06001328VkResult VKAPI vkDestroyPipelineCache(
1329 VkDevice device,
1330 VkPipelineCache pipelineCache)
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -06001331{
Jon Ashburn0d60d272015-07-09 15:02:25 -06001332 return VK_SUCCESS;
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -06001333}
1334
Jon Ashburn0d60d272015-07-09 15:02:25 -06001335ICD_EXPORT size_t VKAPI vkGetPipelineCacheSize(
1336 VkDevice device,
1337 VkPipelineCache pipelineCache)
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001338{
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001339 return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001340}
1341
Jon Ashburn0d60d272015-07-09 15:02:25 -06001342ICD_EXPORT VkResult VKAPI vkGetPipelineCacheData(
1343 VkDevice device,
1344 VkPipelineCache pipelineCache,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001345 void* pData)
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001346{
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001347 return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001348}
1349
Jon Ashburn0d60d272015-07-09 15:02:25 -06001350ICD_EXPORT VkResult VKAPI vkMergePipelineCaches(
1351 VkDevice device,
1352 VkPipelineCache destCache,
1353 uint32_t srcCacheCount,
1354 const VkPipelineCache* pSrcCaches)
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001355{
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001356 return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001357}
1358
Jon Ashburn0d60d272015-07-09 15:02:25 -06001359ICD_EXPORT VkResult VKAPI vkCreateGraphicsPipelines(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001360 VkDevice device,
Jon Ashburn0d60d272015-07-09 15:02:25 -06001361 VkPipelineCache pipelineCache,
1362 uint32_t count,
1363 const VkGraphicsPipelineCreateInfo* pCreateInfos,
1364 VkPipeline* pPipelines)
1365{
1366 struct intel_dev *dev = intel_dev(device);
1367 uint32_t i;
Tony Barbour9687cb12015-07-14 13:34:05 -06001368 VkResult res = VK_SUCCESS;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001369 bool one_succeeded = false;
1370
1371 for (i = 0; i < count; i++) {
1372 res = graphics_pipeline_create(dev, &(pCreateInfos[i]),
1373 (struct intel_pipeline **) &(pPipelines[i]));
1374 //return NULL handle for unsuccessful creates
1375 if (res != VK_SUCCESS)
Tony Barbourde4124d2015-07-03 10:33:54 -06001376 pPipelines[i].handle = 0;
Jon Ashburn0d60d272015-07-09 15:02:25 -06001377 else
1378 one_succeeded = true;
1379 }
1380 //return VK_SUCCESS if any of count creates succeeded
1381 if (one_succeeded)
1382 return VK_SUCCESS;
1383 else
1384 return res;
1385}
1386
1387ICD_EXPORT VkResult VKAPI vkCreateComputePipelines(
1388 VkDevice device,
1389 VkPipelineCache pipelineCache,
1390 uint32_t count,
1391 const VkComputePipelineCreateInfo* pCreateInfos,
1392 VkPipeline* pPipelines)
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001393{
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -06001394 return VK_ERROR_UNKNOWN;
Courtney Goeltzenleuchter05a60542014-08-15 14:54:34 -06001395}
Tony Barbourde4124d2015-07-03 10:33:54 -06001396
1397ICD_EXPORT VkResult VKAPI vkDestroyPipeline(
1398 VkDevice device,
1399 VkPipeline pipeline)
1400
1401 {
1402 struct intel_obj *obj = intel_obj(pipeline.handle);
1403
Tony Barbour2094dc72015-07-09 15:26:32 -06001404 intel_mem_free(obj->mem);
Tony Barbourde4124d2015-07-03 10:33:54 -06001405 obj->destroy(obj);
1406 return VK_SUCCESS;
1407 }