blob: 7189a3a99ecbfa96dd16d9c6eb2fb7877d7c849e [file] [log] [blame]
Chia-I Wue09b5362014-08-07 09:25:14 +08001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
Chia-I Wue09b5362014-08-07 09:25:14 +08003 *
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 * Chia-I Wu <olv@lunarg.com>
Chia-I Wue09b5362014-08-07 09:25:14 +080026 */
27
Chia-I Wu3ad3c542014-08-25 11:09:17 +080028#include "genhw/genhw.h"
Chia-I Wue09b5362014-08-07 09:25:14 +080029#include "kmd/winsys.h"
Chia-I Wu34f45182014-08-19 14:02:59 +080030#include "cmd.h"
Chia-I Wue09b5362014-08-07 09:25:14 +080031#include "dev.h"
Chia-I Wuc5438c22014-08-19 14:03:06 +080032#include "fence.h"
Chia-I Wue09b5362014-08-07 09:25:14 +080033#include "queue.h"
34
Mark Lobodzinski2a253072015-10-08 10:44:07 -060035static void semaphore_destroy(struct intel_obj *obj)
36{
37 struct intel_semaphore *semaphore = intel_semaphore_from_obj(obj);
38
39 intel_semaphore_destroy(semaphore);
40}
41
42VkResult intel_semaphore_create(struct intel_dev *dev,
43 const VkSemaphoreCreateInfo *info,
44 struct intel_semaphore **semaphore_ret)
45{
46 struct intel_semaphore *semaphore;
47 semaphore = (struct intel_semaphore *) intel_base_create(&dev->base.handle,
48 sizeof(*semaphore), dev->base.dbg, VK_OBJECT_TYPE_SEMAPHORE, info, 0);
49
50 if (!semaphore)
51 return VK_ERROR_OUT_OF_HOST_MEMORY;
52
53 semaphore->references = 0;
54 *semaphore_ret = semaphore;
55 semaphore->obj.destroy = semaphore_destroy;
56
57 return VK_SUCCESS;
58}
59
60void intel_semaphore_destroy(struct intel_semaphore *semaphore)
61{
62 intel_base_destroy(&semaphore->obj.base);
63}
64
Chia-I Wu465fe212015-02-11 11:27:06 -070065static void queue_submit_hang(struct intel_queue *queue,
66 struct intel_cmd *cmd,
67 uint32_t active_lost,
68 uint32_t pending_lost)
69{
70 intel_cmd_decode(cmd, true);
71
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060072 intel_dev_log(queue->dev, VK_DBG_REPORT_ERROR_BIT,
73 VK_NULL_HANDLE, 0, 0,
74 "GPU hanged with %d/%d active/pending command buffers lost",
75 active_lost, pending_lost);
Chia-I Wu465fe212015-02-11 11:27:06 -070076}
77
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060078static VkResult queue_submit_bo(struct intel_queue *queue,
Chia-I Wu94d2fba2014-08-25 11:38:08 +080079 struct intel_bo *bo,
Tony Barbour8205d902015-04-16 15:59:00 -060080 VkDeviceSize used)
Chia-I Wu94d2fba2014-08-25 11:38:08 +080081{
82 struct intel_winsys *winsys = queue->dev->winsys;
83 int err;
84
Chia-I Wu94d2fba2014-08-25 11:38:08 +080085 if (intel_debug & INTEL_DEBUG_NOHW)
86 err = 0;
87 else
88 err = intel_winsys_submit_bo(winsys, queue->ring, bo, used, 0);
89
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -060090 return (err) ? VK_ERROR_DEVICE_LOST : VK_SUCCESS;
Chia-I Wu94d2fba2014-08-25 11:38:08 +080091}
92
Chia-I Wuec841722014-08-25 22:36:01 +080093static struct intel_bo *queue_create_bo(struct intel_queue *queue,
Tony Barbour8205d902015-04-16 15:59:00 -060094 VkDeviceSize size,
Chia-I Wuec841722014-08-25 22:36:01 +080095 const void *cmd,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060096 size_t cmd_len)
Chia-I Wu3ad3c542014-08-25 11:09:17 +080097{
Chia-I Wuec841722014-08-25 22:36:01 +080098 struct intel_bo *bo;
99 void *ptr;
100
Chia-I Wucb2dc0d2015-03-05 16:19:42 -0700101 bo = intel_winsys_alloc_bo(queue->dev->winsys,
Chia-I Wu32a22462014-08-26 14:13:46 +0800102 "queue bo", size, true);
Chia-I Wuec841722014-08-25 22:36:01 +0800103 if (!bo)
104 return NULL;
105
106 if (!cmd_len)
107 return bo;
108
109 ptr = intel_bo_map(bo, true);
110 if (!ptr) {
Chia-I Wucb2dc0d2015-03-05 16:19:42 -0700111 intel_bo_unref(bo);
Chia-I Wuec841722014-08-25 22:36:01 +0800112 return NULL;
113 }
114
115 memcpy(ptr, cmd, cmd_len);
116 intel_bo_unmap(bo);
117
118 return bo;
119}
120
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600121static VkResult queue_select_pipeline(struct intel_queue *queue,
Chia-I Wuec841722014-08-25 22:36:01 +0800122 int pipeline_select)
123{
124 uint32_t pipeline_select_cmd[] = {
Chia-I Wu426072d2014-08-26 14:31:55 +0800125 GEN6_RENDER_CMD(SINGLE_DW, PIPELINE_SELECT),
126 GEN6_MI_CMD(MI_BATCH_BUFFER_END),
Chia-I Wuec841722014-08-25 22:36:01 +0800127 };
128 struct intel_bo *bo;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600129 VkResult ret;
Chia-I Wuec841722014-08-25 22:36:01 +0800130
131 if (queue->ring != INTEL_RING_RENDER ||
132 queue->last_pipeline_select == pipeline_select)
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600133 return VK_SUCCESS;
Chia-I Wuec841722014-08-25 22:36:01 +0800134
135 switch (pipeline_select) {
136 case GEN6_PIPELINE_SELECT_DW0_SELECT_3D:
137 bo = queue->select_graphics_bo;
138 break;
139 case GEN6_PIPELINE_SELECT_DW0_SELECT_MEDIA:
140 bo = queue->select_compute_bo;
141 break;
142 default:
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600143 assert(0 && "Invalid pipeline select");
Chia-I Wuec841722014-08-25 22:36:01 +0800144 break;
145 }
146
147 if (!bo) {
148 pipeline_select_cmd[0] |= pipeline_select;
149 bo = queue_create_bo(queue, sizeof(pipeline_select_cmd),
150 pipeline_select_cmd, sizeof(pipeline_select_cmd));
151 if (!bo)
Tony Barbour8205d902015-04-16 15:59:00 -0600152 return VK_ERROR_OUT_OF_DEVICE_MEMORY;
Chia-I Wuec841722014-08-25 22:36:01 +0800153
154 switch (pipeline_select) {
155 case GEN6_PIPELINE_SELECT_DW0_SELECT_3D:
156 queue->select_graphics_bo = bo;
157 break;
158 case GEN6_PIPELINE_SELECT_DW0_SELECT_MEDIA:
159 queue->select_compute_bo = bo;
160 break;
161 default:
162 break;
163 }
164 }
165
166 ret = queue_submit_bo(queue, bo, sizeof(pipeline_select_cmd));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600167 if (ret == VK_SUCCESS)
Chia-I Wuec841722014-08-25 22:36:01 +0800168 queue->last_pipeline_select = pipeline_select;
169
170 return ret;
171}
172
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600173static VkResult queue_init_hw_and_atomic_bo(struct intel_queue *queue)
Chia-I Wuec841722014-08-25 22:36:01 +0800174{
175 const uint32_t ctx_init_cmd[] = {
Chia-I Wu63883292014-08-25 13:50:26 +0800176 /* STATE_SIP */
Chia-I Wu426072d2014-08-26 14:31:55 +0800177 GEN6_RENDER_CMD(COMMON, STATE_SIP),
Chia-I Wu63883292014-08-25 13:50:26 +0800178 0,
179 /* PIPELINE_SELECT */
Chia-I Wu426072d2014-08-26 14:31:55 +0800180 GEN6_RENDER_CMD(SINGLE_DW, PIPELINE_SELECT) |
Chia-I Wu63883292014-08-25 13:50:26 +0800181 GEN6_PIPELINE_SELECT_DW0_SELECT_3D,
182 /* 3DSTATE_VF_STATISTICS */
Chia-I Wu426072d2014-08-26 14:31:55 +0800183 GEN6_RENDER_CMD(SINGLE_DW, 3DSTATE_VF_STATISTICS),
Chia-I Wu63883292014-08-25 13:50:26 +0800184 /* end */
Chia-I Wu426072d2014-08-26 14:31:55 +0800185 GEN6_MI_CMD(MI_BATCH_BUFFER_END),
186 GEN6_MI_CMD(MI_NOOP),
Chia-I Wu63883292014-08-25 13:50:26 +0800187 };
Chia-I Wu3ad3c542014-08-25 11:09:17 +0800188 struct intel_bo *bo;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600189 VkResult ret;
Chia-I Wu3ad3c542014-08-25 11:09:17 +0800190
Chia-I Wuec841722014-08-25 22:36:01 +0800191 if (queue->ring != INTEL_RING_RENDER) {
192 queue->last_pipeline_select = -1;
193 queue->atomic_bo = queue_create_bo(queue,
194 sizeof(uint32_t) * INTEL_QUEUE_ATOMIC_COUNTER_COUNT,
195 NULL, 0);
Tony Barbour8205d902015-04-16 15:59:00 -0600196 return (queue->atomic_bo) ? VK_SUCCESS : VK_ERROR_OUT_OF_DEVICE_MEMORY;
Chia-I Wu3ad3c542014-08-25 11:09:17 +0800197 }
198
Chia-I Wuec841722014-08-25 22:36:01 +0800199 bo = queue_create_bo(queue,
200 sizeof(uint32_t) * INTEL_QUEUE_ATOMIC_COUNTER_COUNT,
201 ctx_init_cmd, sizeof(ctx_init_cmd));
202 if (!bo)
Tony Barbour8205d902015-04-16 15:59:00 -0600203 return VK_ERROR_OUT_OF_DEVICE_MEMORY;
Chia-I Wu3ad3c542014-08-25 11:09:17 +0800204
Chia-I Wuec841722014-08-25 22:36:01 +0800205 ret = queue_submit_bo(queue, bo, sizeof(ctx_init_cmd));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600206 if (ret != VK_SUCCESS) {
Chia-I Wucb2dc0d2015-03-05 16:19:42 -0700207 intel_bo_unref(bo);
Chia-I Wuec841722014-08-25 22:36:01 +0800208 return ret;
Chia-I Wu3ad3c542014-08-25 11:09:17 +0800209 }
210
Chia-I Wuec841722014-08-25 22:36:01 +0800211 queue->last_pipeline_select = GEN6_PIPELINE_SELECT_DW0_SELECT_3D;
212 /* reuse */
213 queue->atomic_bo = bo;
Chia-I Wu3ad3c542014-08-25 11:09:17 +0800214
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600215 return VK_SUCCESS;
Chia-I Wu3ad3c542014-08-25 11:09:17 +0800216}
217
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600218static VkResult queue_submit_cmd_prepare(struct intel_queue *queue,
Chia-I Wude6f9a72015-02-17 14:11:29 -0700219 struct intel_cmd *cmd)
220{
Chia-I Wu513ae5b2015-07-01 19:04:59 +0800221 if (unlikely(cmd->result != VK_SUCCESS || !cmd->primary)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600222 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
223 &cmd->obj.base, 0, 0,
224 "invalid command buffer submitted");
Chia-I Wude6f9a72015-02-17 14:11:29 -0700225 }
226
227 return queue_select_pipeline(queue, cmd->pipeline_select);
228}
229
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600230static VkResult queue_submit_cmd_debug(struct intel_queue *queue,
Chia-I Wude6f9a72015-02-17 14:11:29 -0700231 struct intel_cmd *cmd)
232{
233 uint32_t active[2], pending[2];
234 struct intel_bo *bo;
Tony Barbour8205d902015-04-16 15:59:00 -0600235 VkDeviceSize used;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600236 VkResult ret;
Chia-I Wude6f9a72015-02-17 14:11:29 -0700237
238 ret = queue_submit_cmd_prepare(queue, cmd);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600239 if (ret != VK_SUCCESS)
Chia-I Wude6f9a72015-02-17 14:11:29 -0700240 return ret;
241
242 if (intel_debug & INTEL_DEBUG_HANG) {
Chia-I Wucb2dc0d2015-03-05 16:19:42 -0700243 intel_winsys_get_reset_stats(queue->dev->winsys,
Chia-I Wude6f9a72015-02-17 14:11:29 -0700244 &active[0], &pending[0]);
245 }
246
247 bo = intel_cmd_get_batch(cmd, &used);
248 ret = queue_submit_bo(queue, bo, used);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600249 if (ret != VK_SUCCESS)
Chia-I Wude6f9a72015-02-17 14:11:29 -0700250 return ret;
251
252 if (intel_debug & INTEL_DEBUG_HANG) {
253 intel_bo_wait(bo, -1);
Chia-I Wucb2dc0d2015-03-05 16:19:42 -0700254 intel_winsys_get_reset_stats(queue->dev->winsys,
Chia-I Wude6f9a72015-02-17 14:11:29 -0700255 &active[1], &pending[1]);
256
257 if (active[0] != active[1] || pending[0] != pending[1]) {
258 queue_submit_hang(queue, cmd, active[1] - active[0],
259 pending[1] - pending[0]);
260 }
261 }
262
263 if (intel_debug & INTEL_DEBUG_BATCH)
264 intel_cmd_decode(cmd, false);
265
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600266 return VK_SUCCESS;
Chia-I Wude6f9a72015-02-17 14:11:29 -0700267}
268
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600269static VkResult queue_submit_cmd(struct intel_queue *queue,
Chia-I Wude6f9a72015-02-17 14:11:29 -0700270 struct intel_cmd *cmd)
271{
272 struct intel_bo *bo;
Tony Barbour8205d902015-04-16 15:59:00 -0600273 VkDeviceSize used;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600274 VkResult ret;
Chia-I Wude6f9a72015-02-17 14:11:29 -0700275
276 ret = queue_submit_cmd_prepare(queue, cmd);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600277 if (ret == VK_SUCCESS) {
Chia-I Wude6f9a72015-02-17 14:11:29 -0700278 bo = intel_cmd_get_batch(cmd, &used);
279 ret = queue_submit_bo(queue, bo, used);
280 }
281
282 return ret;
283}
284
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600285VkResult intel_queue_create(struct intel_dev *dev,
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600286 enum intel_gpu_engine_type engine,
287 struct intel_queue **queue_ret)
Chia-I Wue09b5362014-08-07 09:25:14 +0800288{
289 struct intel_queue *queue;
Chia-I Wuc5438c22014-08-19 14:03:06 +0800290 enum intel_ring_type ring;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600291 VkFenceCreateInfo fence_info;
292 VkResult ret;
Chia-I Wuc5438c22014-08-19 14:03:06 +0800293
Chia-I Wucdcff732014-08-19 14:44:15 +0800294 switch (engine) {
295 case INTEL_GPU_ENGINE_3D:
Chia-I Wuc5438c22014-08-19 14:03:06 +0800296 ring = INTEL_RING_RENDER;
297 break;
Chia-I Wuc5438c22014-08-19 14:03:06 +0800298 default:
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600299 intel_dev_log(dev, VK_DBG_REPORT_ERROR_BIT,
300 &dev->base, 0, 0,
301 "invalid engine type");
302 return VK_ERROR_VALIDATION_FAILED;
Chia-I Wuc5438c22014-08-19 14:03:06 +0800303 break;
304 }
Chia-I Wue09b5362014-08-07 09:25:14 +0800305
Chia-I Wu545c2e12015-02-22 13:19:54 +0800306 queue = (struct intel_queue *) intel_base_create(&dev->base.handle,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600307 sizeof(*queue), dev->base.dbg, VK_OBJECT_TYPE_QUEUE, NULL, 0);
Chia-I Wue09b5362014-08-07 09:25:14 +0800308 if (!queue)
Tony Barbour8205d902015-04-16 15:59:00 -0600309 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wue09b5362014-08-07 09:25:14 +0800310
Chia-I Wue09b5362014-08-07 09:25:14 +0800311 queue->dev = dev;
Chia-I Wuc5438c22014-08-19 14:03:06 +0800312 queue->ring = ring;
Chia-I Wue09b5362014-08-07 09:25:14 +0800313
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600314 if (queue_init_hw_and_atomic_bo(queue) != VK_SUCCESS) {
Chia-I Wu3ad3c542014-08-25 11:09:17 +0800315 intel_queue_destroy(queue);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600316 return VK_ERROR_INITIALIZATION_FAILED;
Chia-I Wu3ad3c542014-08-25 11:09:17 +0800317 }
318
Chia-I Wub56f5df2015-04-04 20:21:10 +0800319 memset(&fence_info, 0, sizeof(fence_info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600320 fence_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
Chia-I Wub56f5df2015-04-04 20:21:10 +0800321 ret = intel_fence_create(dev, &fence_info, &queue->fence);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600322 if (ret != VK_SUCCESS) {
Chia-I Wub56f5df2015-04-04 20:21:10 +0800323 intel_queue_destroy(queue);
324 return ret;
325 }
326
Chia-I Wu9ae59c12014-08-07 10:08:49 +0800327 *queue_ret = queue;
328
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600329 return VK_SUCCESS;
Chia-I Wue09b5362014-08-07 09:25:14 +0800330}
331
332void intel_queue_destroy(struct intel_queue *queue)
333{
Chia-I Wub56f5df2015-04-04 20:21:10 +0800334 if (queue->fence)
335 intel_fence_destroy(queue->fence);
336
Chia-I Wucb2dc0d2015-03-05 16:19:42 -0700337 intel_bo_unref(queue->atomic_bo);
338 intel_bo_unref(queue->select_graphics_bo);
339 intel_bo_unref(queue->select_compute_bo);
Chia-I Wu046a7a92015-02-17 14:29:01 -0700340
Chia-I Wubbf2c932014-08-07 12:20:08 +0800341 intel_base_destroy(&queue->base);
Chia-I Wue09b5362014-08-07 09:25:14 +0800342}
343
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600344VkResult intel_queue_wait(struct intel_queue *queue, int64_t timeout)
Chia-I Wue09b5362014-08-07 09:25:14 +0800345{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600346 /* return VK_SUCCESS instead of VK_ERROR_UNAVAILABLE */
Chia-I Wub56f5df2015-04-04 20:21:10 +0800347 if (!queue->fence->seqno_bo)
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600348 return VK_SUCCESS;
Chia-I Wue09b5362014-08-07 09:25:14 +0800349
Chia-I Wub56f5df2015-04-04 20:21:10 +0800350 return intel_fence_wait(queue->fence, timeout);
Chia-I Wue09b5362014-08-07 09:25:14 +0800351}
352
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600353static void intel_wait_queue_semaphore(struct intel_queue *queue, struct intel_semaphore *semaphore)
354{
355 intel_queue_wait(queue, -1);
356 semaphore->references--;
357}
358
359static void intel_signal_queue_semaphore(struct intel_queue *queue, struct intel_semaphore *semaphore)
360{
361 semaphore->references++;
362}
363
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600364ICD_EXPORT VkResult VKAPI vkQueueWaitIdle(
365 VkQueue queue_)
Chia-I Wue09b5362014-08-07 09:25:14 +0800366{
367 struct intel_queue *queue = intel_queue(queue_);
368
369 return intel_queue_wait(queue, -1);
370}
Chia-I Wu251e7d92014-08-19 13:35:42 +0800371
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600372ICD_EXPORT VkResult VKAPI vkQueueSubmit(
373 VkQueue queue_,
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600374 uint32_t submitCount,
375 const VkSubmitInfo* pSubmitInfo,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600376 VkFence fence_)
Chia-I Wu251e7d92014-08-19 13:35:42 +0800377{
Chia-I Wuc5438c22014-08-19 14:03:06 +0800378 struct intel_queue *queue = intel_queue(queue_);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600379 VkResult ret = VK_SUCCESS;
Chia-I Wude6f9a72015-02-17 14:11:29 -0700380 struct intel_cmd *last_cmd;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600381 uint32_t i;
Chia-I Wuc5438c22014-08-19 14:03:06 +0800382
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600383 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
384
385 const VkSubmitInfo *submit = &pSubmitInfo[submit_idx];
386
387 for (i = 0; i < submit->waitSemCount; i++) {
388 struct intel_semaphore *pSemaphore = intel_semaphore(submit->pWaitSemaphores[i]);
389 intel_wait_queue_semaphore(queue, pSemaphore);
Chia-I Wude6f9a72015-02-17 14:11:29 -0700390 }
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600391
392 if (unlikely(intel_debug)) {
393 for (i = 0; i < submit->cmdBufferCount; i++) {
394 struct intel_cmd *cmd = intel_cmd(submit->pCommandBuffers[i]);
395 ret = queue_submit_cmd_debug(queue, cmd);
396 if (ret != VK_SUCCESS)
397 break;
398 }
399 } else {
400 for (i = 0; i < submit->cmdBufferCount; i++) {
401 struct intel_cmd *cmd = intel_cmd(submit->pCommandBuffers[i]);
402 ret = queue_submit_cmd(queue, cmd);
403 if (ret != VK_SUCCESS)
404 break;
405 }
Chia-I Wude6f9a72015-02-17 14:11:29 -0700406 }
Chia-I Wude6f9a72015-02-17 14:11:29 -0700407
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600408 /* no cmd submitted */
409 if (i == 0)
410 return ret;
Chia-I Wude6f9a72015-02-17 14:11:29 -0700411
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600412 last_cmd = intel_cmd(submit->pCommandBuffers[i - 1]);
Chia-I Wude6f9a72015-02-17 14:11:29 -0700413
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600414 if (ret == VK_SUCCESS) {
415 intel_fence_set_seqno(queue->fence,
416 intel_cmd_get_batch(last_cmd, NULL));
Chia-I Wude6f9a72015-02-17 14:11:29 -0700417
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600418 if (fence_.handle != VK_NULL_HANDLE) {
419 struct intel_fence *fence = intel_fence(fence_);
420 intel_fence_copy(fence, queue->fence);
421 }
422 } else {
423 struct intel_bo *last_bo;
424
425 /* unbusy submitted BOs */
426 last_bo = intel_cmd_get_batch(last_cmd, NULL);
427 intel_bo_wait(last_bo, -1);
Chia-I Wude6f9a72015-02-17 14:11:29 -0700428 }
Chia-I Wude6f9a72015-02-17 14:11:29 -0700429
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600430 for (i = 0; i < submit->signalSemCount; i++) {
431 struct intel_semaphore *pSemaphore = intel_semaphore(submit->pSignalSemaphores[i]);
432 intel_signal_queue_semaphore(queue, pSemaphore);
433 }
Chia-I Wude6f9a72015-02-17 14:11:29 -0700434 }
Chia-I Wuc5438c22014-08-19 14:03:06 +0800435
436 return ret;
Chia-I Wu251e7d92014-08-19 13:35:42 +0800437}
438
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600439ICD_EXPORT VkResult VKAPI vkCreateSemaphore(
Mark Lobodzinski2a253072015-10-08 10:44:07 -0600440 VkDevice device,
441 const VkSemaphoreCreateInfo *pCreateInfo,
442 VkSemaphore *pSemaphore)
Chia-I Wu251e7d92014-08-19 13:35:42 +0800443{
444 /*
445 * We want to find an unused semaphore register and initialize it. Signal
446 * will increment the register. Wait will atomically decrement it and
447 * block if the value is zero, or a large constant N if we do not want to
448 * go negative.
449 *
450 * XXX However, MI_SEMAPHORE_MBOX does not seem to have the flexibility.
451 */
Mark Lobodzinski2a253072015-10-08 10:44:07 -0600452
453 // TODO: fully support semaphores (mean time, simulate it):
454 struct intel_dev *dev = intel_dev(device);
455
456 return intel_semaphore_create(dev, pCreateInfo,
457 (struct intel_semaphore **) pSemaphore);
Chia-I Wu251e7d92014-08-19 13:35:42 +0800458}
459
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600460ICD_EXPORT void VKAPI vkDestroySemaphore(
Tony Barbourde4124d2015-07-03 10:33:54 -0600461 VkDevice device,
462 VkSemaphore semaphore)
Mark Lobodzinski2a253072015-10-08 10:44:07 -0600463{
464 struct intel_obj *obj = intel_obj(semaphore.handle);
465 obj->destroy(obj);
466}
Tony Barbourde4124d2015-07-03 10:33:54 -0600467
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600468ICD_EXPORT VkResult VKAPI vkQueueSignalSemaphore(
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600469 VkQueue queue_,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600470 VkSemaphore semaphore)
Chia-I Wu251e7d92014-08-19 13:35:42 +0800471{
Mark Lobodzinski2a253072015-10-08 10:44:07 -0600472 struct intel_semaphore *pSemaphore = intel_semaphore(semaphore);
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600473 struct intel_queue *queue = intel_queue(queue_);
474 intel_signal_queue_semaphore(queue, pSemaphore);
Ian Elliott4f299362015-07-06 14:45:11 -0600475 return VK_SUCCESS;
Chia-I Wu251e7d92014-08-19 13:35:42 +0800476}
477
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600478ICD_EXPORT VkResult VKAPI vkQueueWaitSemaphore(
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600479 VkQueue queue_,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600480 VkSemaphore semaphore)
Chia-I Wu251e7d92014-08-19 13:35:42 +0800481{
Mark Lobodzinski2a253072015-10-08 10:44:07 -0600482 struct intel_semaphore *pSemaphore = intel_semaphore(semaphore);
Courtney Goeltzenleuchter3ec31622015-10-20 18:04:07 -0600483 struct intel_queue *queue = intel_queue(queue_);
484 intel_wait_queue_semaphore(queue, pSemaphore);
Cody Northrop1d6a6822015-07-23 13:00:01 -0600485
Ian Elliott4f299362015-07-06 14:45:11 -0600486 return VK_SUCCESS;
Chia-I Wu251e7d92014-08-19 13:35:42 +0800487}