blob: 5d44ff211b5609628dfb472d84be19a1065bff2c [file] [log] [blame]
Chia-I Wue54854a2014-08-05 10:23:50 +08001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
Chia-I Wue54854a2014-08-05 10:23:50 +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 Wue54854a2014-08-05 10:23:50 +080026 */
27
Chia-I Wu82d3d8b2014-08-09 13:07:44 +080028#include <stdarg.h>
Chia-I Wue54854a2014-08-05 10:23:50 +080029#include "kmd/winsys.h"
Chia-I Wuf8385062015-01-04 16:27:24 +080030#include "desc.h"
Chia-I Wue54854a2014-08-05 10:23:50 +080031#include "gpu.h"
Chia-I Wu9fe3ec42014-10-17 09:49:16 +080032#include "pipeline.h"
Chia-I Wue09b5362014-08-07 09:25:14 +080033#include "queue.h"
Chia-I Wue54854a2014-08-05 10:23:50 +080034#include "dev.h"
35
Chia-I Wu9fe3ec42014-10-17 09:49:16 +080036static void dev_destroy_meta_shaders(struct intel_dev *dev)
37{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060038 uint32_t i;
Chia-I Wu9fe3ec42014-10-17 09:49:16 +080039
40 for (i = 0; i < ARRAY_SIZE(dev->cmd_meta_shaders); i++) {
41 if (!dev->cmd_meta_shaders[i])
42 break;
43
Chia-I Wuf13ed3c2015-02-22 14:09:00 +080044 intel_pipeline_shader_destroy(dev, dev->cmd_meta_shaders[i]);
Chia-I Wu9fe3ec42014-10-17 09:49:16 +080045 dev->cmd_meta_shaders[i] = NULL;
46 }
47}
48
49static bool dev_create_meta_shaders(struct intel_dev *dev)
50{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060051 uint32_t i;
Chia-I Wu9fe3ec42014-10-17 09:49:16 +080052
53 for (i = 0; i < ARRAY_SIZE(dev->cmd_meta_shaders); i++) {
54 struct intel_pipeline_shader *sh;
55
56 sh = intel_pipeline_shader_create_meta(dev, i);
57 if (!sh) {
58 dev_destroy_meta_shaders(dev);
59 return false;
60 }
61
62 dev->cmd_meta_shaders[i] = sh;
63 }
64
65 return true;
66}
67
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060068static VkResult dev_create_queues(struct intel_dev *dev,
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -060069 const VkDeviceQueueCreateInfo *queues,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060070 uint32_t count)
Chia-I Wue54854a2014-08-05 10:23:50 +080071{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060072 uint32_t i;
Chia-I Wue54854a2014-08-05 10:23:50 +080073
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -060074 /* TODOVV: make sure test is covered by validation layer */
75// if (!count)
76// return VK_ERROR_INVALID_POINTER;
Chia-I Wue54854a2014-08-05 10:23:50 +080077
78 for (i = 0; i < count; i++) {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -060079 const VkDeviceQueueCreateInfo *q = &queues[i];
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060080 VkResult ret = VK_SUCCESS;
Chia-I Wue54854a2014-08-05 10:23:50 +080081
Chris Forbesfa6d36e2015-07-11 19:11:39 +120082 if (q->queueFamilyIndex < INTEL_GPU_ENGINE_COUNT &&
83 q->queueCount == 1 && !dev->queues[q->queueFamilyIndex]) {
84 ret = intel_queue_create(dev, q->queueFamilyIndex,
85 &dev->queues[q->queueFamilyIndex]);
Chia-I Wue54854a2014-08-05 10:23:50 +080086 }
87 else {
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -060088 /* TODOVV: make sure test is covered by validation layer */
89// ret = VK_ERROR_INVALID_POINTER;
90 return VK_ERROR_UNKNOWN;
Chia-I Wue54854a2014-08-05 10:23:50 +080091 }
92
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060093 if (ret != VK_SUCCESS) {
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060094 uint32_t j;
Chia-I Wue54854a2014-08-05 10:23:50 +080095 for (j = 0; j < i; j++)
Chia-I Wue09b5362014-08-07 09:25:14 +080096 intel_queue_destroy(dev->queues[j]);
Chia-I Wue54854a2014-08-05 10:23:50 +080097
98 return ret;
99 }
100 }
101
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600102 return VK_SUCCESS;
Chia-I Wue54854a2014-08-05 10:23:50 +0800103}
104
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600105VkResult intel_dev_create(struct intel_gpu *gpu,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600106 const VkDeviceCreateInfo *info,
107 struct intel_dev **dev_ret)
Chia-I Wue54854a2014-08-05 10:23:50 +0800108{
Chia-I Wue54854a2014-08-05 10:23:50 +0800109 struct intel_dev *dev;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600110 uint32_t i;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600111 VkResult ret;
Chia-I Wue54854a2014-08-05 10:23:50 +0800112
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600113 /* TODOVV: Make sure test is covered by validation layer */
114// if (gpu->winsys)
115// return VK_ERROR_DEVICE_ALREADY_CREATED;
Chia-I Wue54854a2014-08-05 10:23:50 +0800116
Chia-I Wu545c2e12015-02-22 13:19:54 +0800117 dev = (struct intel_dev *) intel_base_create(&gpu->handle,
Cody Northrop74a63852015-08-04 13:45:07 -0600118 sizeof(*dev), false,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600119 VK_OBJECT_TYPE_DEVICE, info, sizeof(struct intel_dev_dbg));
Chia-I Wue54854a2014-08-05 10:23:50 +0800120 if (!dev)
Tony Barbour8205d902015-04-16 15:59:00 -0600121 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wue54854a2014-08-05 10:23:50 +0800122
Chia-I Wu1db76e02014-09-15 14:21:14 +0800123 for (i = 0; i < info->extensionCount; i++) {
Courtney Goeltzenleuchter95b73722015-06-08 18:08:35 -0600124 const enum intel_phy_dev_ext_type ext = intel_gpu_lookup_phy_dev_extension(gpu,
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -0600125 info->ppEnabledExtensionNames[i]);
Chia-I Wu1db76e02014-09-15 14:21:14 +0800126
Courtney Goeltzenleuchter95b73722015-06-08 18:08:35 -0600127 if (ext != INTEL_PHY_DEV_EXT_INVALID)
128 dev->phy_dev_exts[ext] = true;
Chia-I Wu1db76e02014-09-15 14:21:14 +0800129 }
130
Chia-I Wue54854a2014-08-05 10:23:50 +0800131 dev->gpu = gpu;
132
Chia-I Wu41858c82015-04-04 16:39:25 +0800133 ret = intel_gpu_init_winsys(gpu);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600134 if (ret != VK_SUCCESS) {
Chia-I Wue54854a2014-08-05 10:23:50 +0800135 intel_dev_destroy(dev);
136 return ret;
137 }
138
Chia-I Wud8965932014-10-13 13:32:37 +0800139 dev->winsys = gpu->winsys;
Chia-I Wue54854a2014-08-05 10:23:50 +0800140
Chia-I Wucb2dc0d2015-03-05 16:19:42 -0700141 dev->cmd_scratch_bo = intel_winsys_alloc_bo(dev->winsys,
Chia-I Wu32a22462014-08-26 14:13:46 +0800142 "command buffer scratch", 4096, false);
Chia-I Wu0b784442014-08-25 22:54:16 +0800143 if (!dev->cmd_scratch_bo) {
144 intel_dev_destroy(dev);
Tony Barbour8205d902015-04-16 15:59:00 -0600145 return VK_ERROR_OUT_OF_DEVICE_MEMORY;
Chia-I Wu0b784442014-08-25 22:54:16 +0800146 }
147
Chia-I Wu9fe3ec42014-10-17 09:49:16 +0800148 if (!dev_create_meta_shaders(dev)) {
149 intel_dev_destroy(dev);
Tony Barbour8205d902015-04-16 15:59:00 -0600150 return VK_ERROR_OUT_OF_HOST_MEMORY;
Chia-I Wu9fe3ec42014-10-17 09:49:16 +0800151 }
152
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800153 ret = intel_desc_region_create(dev, &dev->desc_region);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600154 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800155 intel_dev_destroy(dev);
156 return ret;
157 }
158
Chia-I Wu38d1ddf2015-03-02 10:51:39 -0700159 intel_pipeline_init_default_sample_patterns(dev,
160 (uint8_t *) &dev->sample_pattern_1x,
161 (uint8_t *) &dev->sample_pattern_2x,
162 (uint8_t *) &dev->sample_pattern_4x,
163 (uint8_t *) dev->sample_pattern_8x,
164 (uint8_t *) dev->sample_pattern_16x);
165
Chia-I Wue54854a2014-08-05 10:23:50 +0800166 ret = dev_create_queues(dev, info->pRequestedQueues,
167 info->queueRecordCount);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600168 if (ret != VK_SUCCESS) {
Chia-I Wue54854a2014-08-05 10:23:50 +0800169 intel_dev_destroy(dev);
170 return ret;
171 }
172
Chia-I Wue54854a2014-08-05 10:23:50 +0800173 *dev_ret = dev;
174
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600175 return VK_SUCCESS;
Chia-I Wue54854a2014-08-05 10:23:50 +0800176}
177
178void intel_dev_destroy(struct intel_dev *dev)
179{
Chia-I Wud8965932014-10-13 13:32:37 +0800180 struct intel_gpu *gpu = dev->gpu;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600181 uint32_t i;
Chia-I Wue54854a2014-08-05 10:23:50 +0800182
Chia-I Wue54854a2014-08-05 10:23:50 +0800183 for (i = 0; i < ARRAY_SIZE(dev->queues); i++) {
184 if (dev->queues[i])
Chia-I Wue09b5362014-08-07 09:25:14 +0800185 intel_queue_destroy(dev->queues[i]);
Chia-I Wue54854a2014-08-05 10:23:50 +0800186 }
187
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800188 if (dev->desc_region)
189 intel_desc_region_destroy(dev, dev->desc_region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800190
Chia-I Wu9fe3ec42014-10-17 09:49:16 +0800191 dev_destroy_meta_shaders(dev);
192
Chia-I Wucb2dc0d2015-03-05 16:19:42 -0700193 intel_bo_unref(dev->cmd_scratch_bo);
Chia-I Wu0b784442014-08-25 22:54:16 +0800194
Chia-I Wubbf2c932014-08-07 12:20:08 +0800195 intel_base_destroy(&dev->base);
Chia-I Wud8965932014-10-13 13:32:37 +0800196
197 if (gpu->winsys)
Chia-I Wu41858c82015-04-04 16:39:25 +0800198 intel_gpu_cleanup_winsys(gpu);
Chia-I Wue54854a2014-08-05 10:23:50 +0800199}
200
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800201void intel_dev_log(struct intel_dev *dev,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600202 VkFlags msg_flags,
Chia-I Wuaabb3602014-08-19 14:18:23 +0800203 struct intel_base *src_object,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600204 size_t location,
205 int32_t msg_code,
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800206 const char *format, ...)
207{
208 va_list ap;
209
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800210 va_start(ap, format);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600211 intel_logv(dev, msg_flags,
Tony Barbourde4124d2015-07-03 10:33:54 -0600212 (src_object->dbg ? src_object->dbg->type : 0),
213 (uint64_t) src_object,
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600214 location, msg_code,
215 format, ap);
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800216 va_end(ap);
217}
218
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600219ICD_EXPORT VkResult VKAPI vkCreateDevice(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600220 VkPhysicalDevice gpu_,
221 const VkDeviceCreateInfo* pCreateInfo,
222 VkDevice* pDevice)
Chia-I Wua207aba2014-08-05 15:13:37 +0800223{
224 struct intel_gpu *gpu = intel_gpu(gpu_);
225
226 return intel_dev_create(gpu, pCreateInfo, (struct intel_dev **) pDevice);
227}
228
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600229ICD_EXPORT void VKAPI vkDestroyDevice(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600230 VkDevice device)
Chia-I Wua207aba2014-08-05 15:13:37 +0800231{
232 struct intel_dev *dev = intel_dev(device);
233
234 intel_dev_destroy(dev);
Chia-I Wua207aba2014-08-05 15:13:37 +0800235}
236
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600237ICD_EXPORT VkResult VKAPI vkGetDeviceQueue(
238 VkDevice device,
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600239 uint32_t queueNodeIndex,
240 uint32_t queueIndex,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600241 VkQueue* pQueue)
Chia-I Wu49dbee82014-08-06 12:48:47 +0800242{
243 struct intel_dev *dev = intel_dev(device);
244
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600245 /* TODOVV: Move to validation layer */
246// if (queueNodeIndex >= INTEL_GPU_ENGINE_COUNT) {
247// return VK_ERROR_UNAVAILABLE;
248// }
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700249
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600250 /* TODOVV: Move to validation layer */
251// if (queueIndex > 0)
252// return VK_ERROR_UNAVAILABLE;
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700253
Mike Stroyan230e6252015-04-17 12:36:38 -0600254 *pQueue = (VkQueue) dev->queues[queueNodeIndex];
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600255 return VK_SUCCESS;
Chia-I Wu49dbee82014-08-06 12:48:47 +0800256}
257
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600258ICD_EXPORT VkResult VKAPI vkDeviceWaitIdle(
259 VkDevice device)
Chia-I Wu49dbee82014-08-06 12:48:47 +0800260{
261 struct intel_dev *dev = intel_dev(device);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600262 VkResult ret = VK_SUCCESS;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600263 uint32_t i;
Chia-I Wu49dbee82014-08-06 12:48:47 +0800264
265 for (i = 0; i < ARRAY_SIZE(dev->queues); i++) {
266 if (dev->queues[i]) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600267 const VkResult r = intel_queue_wait(dev->queues[i], -1);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600268 if (r != VK_SUCCESS)
Chia-I Wu49dbee82014-08-06 12:48:47 +0800269 ret = r;
270 }
271 }
272
273 return ret;
274}