blob: 44eaea2f99c66ad711dc0177892f14032f5a57a2 [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 Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060068static VK_RESULT 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
74 if (!count)
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060075 return VK_ERROR_INVALID_POINTER;
Chia-I Wue54854a2014-08-05 10:23:50 +080076
77 for (i = 0; i < count; i++) {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -060078 const VkDeviceQueueCreateInfo *q = &queues[i];
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060079 VK_RESULT ret = VK_SUCCESS;
Chia-I Wue54854a2014-08-05 10:23:50 +080080
Chia-I Wu9ae59c12014-08-07 10:08:49 +080081 if (q->queueNodeIndex < INTEL_GPU_ENGINE_COUNT &&
82 q->queueCount == 1 && !dev->queues[q->queueNodeIndex]) {
83 ret = intel_queue_create(dev, q->queueNodeIndex,
84 &dev->queues[q->queueNodeIndex]);
Chia-I Wue54854a2014-08-05 10:23:50 +080085 }
86 else {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060087 ret = VK_ERROR_INVALID_POINTER;
Chia-I Wue54854a2014-08-05 10:23:50 +080088 }
89
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060090 if (ret != VK_SUCCESS) {
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060091 uint32_t j;
Chia-I Wue54854a2014-08-05 10:23:50 +080092 for (j = 0; j < i; j++)
Chia-I Wue09b5362014-08-07 09:25:14 +080093 intel_queue_destroy(dev->queues[j]);
Chia-I Wue54854a2014-08-05 10:23:50 +080094
95 return ret;
96 }
97 }
98
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060099 return VK_SUCCESS;
Chia-I Wue54854a2014-08-05 10:23:50 +0800100}
101
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600102VK_RESULT intel_dev_create(struct intel_gpu *gpu,
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600103 const VkDeviceCreateInfo *info,
Chia-I Wue54854a2014-08-05 10:23:50 +0800104 struct intel_dev **dev_ret)
105{
Chia-I Wue54854a2014-08-05 10:23:50 +0800106 struct intel_dev *dev;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600107 uint32_t i;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600108 VK_RESULT ret;
Chia-I Wue54854a2014-08-05 10:23:50 +0800109
Chia-I Wud8965932014-10-13 13:32:37 +0800110 if (gpu->winsys)
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600111 return VK_ERROR_DEVICE_ALREADY_CREATED;
Chia-I Wue54854a2014-08-05 10:23:50 +0800112
Chia-I Wu545c2e12015-02-22 13:19:54 +0800113 dev = (struct intel_dev *) intel_base_create(&gpu->handle,
Jon Ashburn29669a42015-04-04 14:52:07 -0600114 sizeof(*dev), info->flags,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600115 VK_DBG_OBJECT_DEVICE, info, sizeof(struct intel_dev_dbg));
Chia-I Wue54854a2014-08-05 10:23:50 +0800116 if (!dev)
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600117 return VK_ERROR_OUT_OF_MEMORY;
Chia-I Wue54854a2014-08-05 10:23:50 +0800118
Chia-I Wu1db76e02014-09-15 14:21:14 +0800119 for (i = 0; i < info->extensionCount; i++) {
120 const enum intel_ext_type ext = intel_gpu_lookup_extension(gpu,
Chia-I Wu7461fcf2014-12-27 15:16:07 +0800121 info->ppEnabledExtensionNames[i]);
Chia-I Wu1db76e02014-09-15 14:21:14 +0800122
Jon Ashburn20b59dc2015-04-02 13:54:02 -0600123 if (ext != INTEL_EXT_INVALID)
124 dev->exts[ext] = true;
Chia-I Wu1db76e02014-09-15 14:21:14 +0800125 }
126
Chia-I Wue54854a2014-08-05 10:23:50 +0800127 dev->gpu = gpu;
128
Chia-I Wu41858c82015-04-04 16:39:25 +0800129 ret = intel_gpu_init_winsys(gpu);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600130 if (ret != VK_SUCCESS) {
Chia-I Wue54854a2014-08-05 10:23:50 +0800131 intel_dev_destroy(dev);
132 return ret;
133 }
134
Chia-I Wud8965932014-10-13 13:32:37 +0800135 dev->winsys = gpu->winsys;
Chia-I Wue54854a2014-08-05 10:23:50 +0800136
Chia-I Wucb2dc0d2015-03-05 16:19:42 -0700137 dev->cmd_scratch_bo = intel_winsys_alloc_bo(dev->winsys,
Chia-I Wu32a22462014-08-26 14:13:46 +0800138 "command buffer scratch", 4096, false);
Chia-I Wu0b784442014-08-25 22:54:16 +0800139 if (!dev->cmd_scratch_bo) {
140 intel_dev_destroy(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600141 return VK_ERROR_OUT_OF_GPU_MEMORY;
Chia-I Wu0b784442014-08-25 22:54:16 +0800142 }
143
Chia-I Wu9fe3ec42014-10-17 09:49:16 +0800144 if (!dev_create_meta_shaders(dev)) {
145 intel_dev_destroy(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600146 return VK_ERROR_OUT_OF_MEMORY;
Chia-I Wu9fe3ec42014-10-17 09:49:16 +0800147 }
148
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800149 ret = intel_desc_region_create(dev, &dev->desc_region);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600150 if (ret != VK_SUCCESS) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800151 intel_dev_destroy(dev);
152 return ret;
153 }
154
Chia-I Wu38d1ddf2015-03-02 10:51:39 -0700155 intel_pipeline_init_default_sample_patterns(dev,
156 (uint8_t *) &dev->sample_pattern_1x,
157 (uint8_t *) &dev->sample_pattern_2x,
158 (uint8_t *) &dev->sample_pattern_4x,
159 (uint8_t *) dev->sample_pattern_8x,
160 (uint8_t *) dev->sample_pattern_16x);
161
Chia-I Wue54854a2014-08-05 10:23:50 +0800162 ret = dev_create_queues(dev, info->pRequestedQueues,
163 info->queueRecordCount);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600164 if (ret != VK_SUCCESS) {
Chia-I Wue54854a2014-08-05 10:23:50 +0800165 intel_dev_destroy(dev);
166 return ret;
167 }
168
Chia-I Wue54854a2014-08-05 10:23:50 +0800169 *dev_ret = dev;
170
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600171 return VK_SUCCESS;
Chia-I Wue54854a2014-08-05 10:23:50 +0800172}
173
Chia-I Wubbf2c932014-08-07 12:20:08 +0800174static void dev_clear_msg_filters(struct intel_dev *dev)
175{
176 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
177 struct intel_dev_dbg_msg_filter *filter;
178
179 filter = dbg->filters;
180 while (filter) {
181 struct intel_dev_dbg_msg_filter *next = filter->next;
Chia-I Wuf9c81ef2015-02-22 13:49:15 +0800182 intel_free(dev, filter);
Chia-I Wubbf2c932014-08-07 12:20:08 +0800183 filter = next;
184 }
185
186 dbg->filters = NULL;
187}
188
Chia-I Wue54854a2014-08-05 10:23:50 +0800189void intel_dev_destroy(struct intel_dev *dev)
190{
Chia-I Wud8965932014-10-13 13:32:37 +0800191 struct intel_gpu *gpu = dev->gpu;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600192 uint32_t i;
Chia-I Wue54854a2014-08-05 10:23:50 +0800193
194 if (dev->base.dbg)
Chia-I Wubbf2c932014-08-07 12:20:08 +0800195 dev_clear_msg_filters(dev);
Chia-I Wue54854a2014-08-05 10:23:50 +0800196
197 for (i = 0; i < ARRAY_SIZE(dev->queues); i++) {
198 if (dev->queues[i])
Chia-I Wue09b5362014-08-07 09:25:14 +0800199 intel_queue_destroy(dev->queues[i]);
Chia-I Wue54854a2014-08-05 10:23:50 +0800200 }
201
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800202 if (dev->desc_region)
203 intel_desc_region_destroy(dev, dev->desc_region);
Chia-I Wuf8385062015-01-04 16:27:24 +0800204
Chia-I Wu9fe3ec42014-10-17 09:49:16 +0800205 dev_destroy_meta_shaders(dev);
206
Chia-I Wucb2dc0d2015-03-05 16:19:42 -0700207 intel_bo_unref(dev->cmd_scratch_bo);
Chia-I Wu0b784442014-08-25 22:54:16 +0800208
Chia-I Wubbf2c932014-08-07 12:20:08 +0800209 intel_base_destroy(&dev->base);
Chia-I Wud8965932014-10-13 13:32:37 +0800210
211 if (gpu->winsys)
Chia-I Wu41858c82015-04-04 16:39:25 +0800212 intel_gpu_cleanup_winsys(gpu);
Chia-I Wue54854a2014-08-05 10:23:50 +0800213}
214
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600215VK_RESULT intel_dev_add_msg_filter(struct intel_dev *dev,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600216 int32_t msg_code,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600217 VK_DBG_MSG_FILTER filter)
Chia-I Wue54854a2014-08-05 10:23:50 +0800218{
219 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
220 struct intel_dev_dbg_msg_filter *f = dbg->filters;
221
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600222 assert(filter != VK_DBG_MSG_FILTER_NONE);
Chia-I Wue54854a2014-08-05 10:23:50 +0800223
224 while (f) {
225 if (f->msg_code == msg_code)
226 break;
227 f = f->next;
228 }
229
230 if (f) {
231 if (f->filter != filter) {
232 f->filter = filter;
233 f->triggered = false;
234 }
235 } else {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600236 f = intel_alloc(dev, sizeof(*f), 0, VK_SYSTEM_ALLOC_DEBUG);
Chia-I Wue54854a2014-08-05 10:23:50 +0800237 if (!f)
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600238 return VK_ERROR_OUT_OF_MEMORY;
Chia-I Wue54854a2014-08-05 10:23:50 +0800239
240 f->msg_code = msg_code;
241 f->filter = filter;
242 f->triggered = false;
243
244 f->next = dbg->filters;
245 dbg->filters = f;
246 }
247
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600248 return VK_SUCCESS;
Chia-I Wue54854a2014-08-05 10:23:50 +0800249}
250
251void intel_dev_remove_msg_filter(struct intel_dev *dev,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600252 int32_t msg_code)
Chia-I Wue54854a2014-08-05 10:23:50 +0800253{
254 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
255 struct intel_dev_dbg_msg_filter *f = dbg->filters, *prev = NULL;
256
257 while (f) {
258 if (f->msg_code == msg_code) {
259 if (prev)
260 prev->next = f->next;
261 else
262 dbg->filters = f->next;
263
Chia-I Wuf9c81ef2015-02-22 13:49:15 +0800264 intel_free(dev, f);
Chia-I Wue54854a2014-08-05 10:23:50 +0800265 break;
266 }
267
268 prev = f;
269 f = f->next;
270 }
271}
Chia-I Wua207aba2014-08-05 15:13:37 +0800272
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800273static bool dev_filter_msg(struct intel_dev *dev,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600274 int32_t msg_code)
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800275{
276 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
277 struct intel_dev_dbg_msg_filter *filter;
278
279 if (!dbg)
280 return false;
281
282 filter = dbg->filters;
283 while (filter) {
284 if (filter->msg_code != msg_code) {
285 filter = filter->next;
286 continue;
287 }
288
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600289 if (filter->filter == VK_DBG_MSG_FILTER_ALL)
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800290 return true;
291
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600292 if (filter->filter == VK_DBG_MSG_FILTER_REPEATED &&
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800293 filter->triggered)
294 return true;
295
296 filter->triggered = true;
297 break;
298 }
299
300 return false;
301}
302
303void intel_dev_log(struct intel_dev *dev,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600304 VK_DBG_MSG_TYPE msg_type,
305 VK_VALIDATION_LEVEL validation_level,
Chia-I Wuaabb3602014-08-19 14:18:23 +0800306 struct intel_base *src_object,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600307 size_t location,
308 int32_t msg_code,
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800309 const char *format, ...)
310{
311 va_list ap;
312
313 if (dev_filter_msg(dev, msg_code))
314 return;
315
316 va_start(ap, format);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600317 intel_logv(dev, msg_type, validation_level, (VK_BASE_OBJECT) src_object,
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800318 location, msg_code, format, ap);
319 va_end(ap);
320}
321
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600322ICD_EXPORT VK_RESULT VKAPI vkCreateDevice(
323 VK_PHYSICAL_GPU gpu_,
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600324 const VkDeviceCreateInfo* pCreateInfo,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600325 VK_DEVICE* pDevice)
Chia-I Wua207aba2014-08-05 15:13:37 +0800326{
327 struct intel_gpu *gpu = intel_gpu(gpu_);
328
329 return intel_dev_create(gpu, pCreateInfo, (struct intel_dev **) pDevice);
330}
331
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600332ICD_EXPORT VK_RESULT VKAPI vkDestroyDevice(
333 VK_DEVICE device)
Chia-I Wua207aba2014-08-05 15:13:37 +0800334{
335 struct intel_dev *dev = intel_dev(device);
336
337 intel_dev_destroy(dev);
338
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600339 return VK_SUCCESS;
Chia-I Wua207aba2014-08-05 15:13:37 +0800340}
341
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600342ICD_EXPORT VK_RESULT VKAPI vkGetDeviceQueue(
343 VK_DEVICE device,
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700344 uint32_t queueNodeIndex,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600345 uint32_t queueIndex,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600346 VK_QUEUE* pQueue)
Chia-I Wu49dbee82014-08-06 12:48:47 +0800347{
348 struct intel_dev *dev = intel_dev(device);
349
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700350 if (queueNodeIndex >= INTEL_GPU_ENGINE_COUNT) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600351 return VK_ERROR_UNAVAILABLE;
Chia-I Wu49dbee82014-08-06 12:48:47 +0800352 }
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700353
354 if (queueIndex > 0)
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600355 return VK_ERROR_UNAVAILABLE;
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700356
357 *pQueue = dev->queues[queueNodeIndex];
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600358 return VK_SUCCESS;
Chia-I Wu49dbee82014-08-06 12:48:47 +0800359}
360
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600361ICD_EXPORT VK_RESULT VKAPI vkDeviceWaitIdle(
362 VK_DEVICE device)
Chia-I Wu49dbee82014-08-06 12:48:47 +0800363{
364 struct intel_dev *dev = intel_dev(device);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600365 VK_RESULT ret = VK_SUCCESS;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600366 uint32_t i;
Chia-I Wu49dbee82014-08-06 12:48:47 +0800367
368 for (i = 0; i < ARRAY_SIZE(dev->queues); i++) {
369 if (dev->queues[i]) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600370 const VK_RESULT r = intel_queue_wait(dev->queues[i], -1);
371 if (r != VK_SUCCESS)
Chia-I Wu49dbee82014-08-06 12:48:47 +0800372 ret = r;
373 }
374 }
375
376 return ret;
377}
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800378
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600379ICD_EXPORT VK_RESULT VKAPI vkDbgSetValidationLevel(
380 VK_DEVICE device,
381 VK_VALIDATION_LEVEL validationLevel)
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800382{
383 struct intel_dev *dev = intel_dev(device);
Chia-I Wu069f30f2014-08-21 13:45:20 +0800384 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800385
Chia-I Wu069f30f2014-08-21 13:45:20 +0800386 if (dbg)
387 dbg->validation_level = validationLevel;
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800388
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600389 return VK_SUCCESS;
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800390}
391
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600392ICD_EXPORT VK_RESULT VKAPI vkDbgSetMessageFilter(
393 VK_DEVICE device,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600394 int32_t msgCode,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600395 VK_DBG_MSG_FILTER filter)
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800396{
397 struct intel_dev *dev = intel_dev(device);
398
399 if (!dev->base.dbg)
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600400 return VK_SUCCESS;
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800401
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600402 if (filter == VK_DBG_MSG_FILTER_NONE) {
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800403 intel_dev_remove_msg_filter(dev, msgCode);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600404 return VK_SUCCESS;
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800405 }
406
407 return intel_dev_add_msg_filter(dev, msgCode, filter);
408}
409
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600410ICD_EXPORT VK_RESULT VKAPI vkDbgSetDeviceOption(
411 VK_DEVICE device,
412 VK_DBG_DEVICE_OPTION dbgOption,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600413 size_t dataSize,
414 const void* pData)
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800415{
416 struct intel_dev *dev = intel_dev(device);
Chia-I Wu069f30f2014-08-21 13:45:20 +0800417 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600418 VK_RESULT ret = VK_SUCCESS;
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800419
420 if (dataSize == 0)
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600421 return VK_ERROR_INVALID_VALUE;
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800422
423 switch (dbgOption) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600424 case VK_DBG_OPTION_DISABLE_PIPELINE_LOADS:
Chia-I Wu069f30f2014-08-21 13:45:20 +0800425 if (dbg)
426 dbg->disable_pipeline_loads = *((const bool *) pData);
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800427 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600428 case VK_DBG_OPTION_FORCE_OBJECT_MEMORY_REQS:
Chia-I Wu069f30f2014-08-21 13:45:20 +0800429 if (dbg)
430 dbg->force_object_memory_reqs = *((const bool *) pData);
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800431 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600432 case VK_DBG_OPTION_FORCE_LARGE_IMAGE_ALIGNMENT:
Chia-I Wu069f30f2014-08-21 13:45:20 +0800433 if (dbg)
434 dbg->force_large_image_alignment = *((const bool *) pData);
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800435 break;
436 default:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600437 ret = VK_ERROR_INVALID_VALUE;
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800438 break;
439 }
440
441 return ret;
442}