blob: 04e609c4e8ae4af824d1825a7b0f22e6e9c918f7 [file] [log] [blame]
Chia-I Wue54854a2014-08-05 10:23:50 +08001/*
2 * XGL
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
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
Chia-I Wue54854a2014-08-05 10:23:50 +080068static XGL_RESULT dev_create_queues(struct intel_dev *dev,
69 const XGL_DEVICE_QUEUE_CREATE_INFO *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)
75 return XGL_ERROR_INVALID_POINTER;
76
77 for (i = 0; i < count; i++) {
78 const XGL_DEVICE_QUEUE_CREATE_INFO *q = &queues[i];
79 XGL_RESULT ret = XGL_SUCCESS;
80
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 {
Chia-I Wu9ae59c12014-08-07 10:08:49 +080087 ret = XGL_ERROR_INVALID_POINTER;
Chia-I Wue54854a2014-08-05 10:23:50 +080088 }
89
90 if (ret != XGL_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
99 return XGL_SUCCESS;
100}
101
102XGL_RESULT intel_dev_create(struct intel_gpu *gpu,
103 const XGL_DEVICE_CREATE_INFO *info,
104 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;
Chia-I Wue54854a2014-08-05 10:23:50 +0800108 XGL_RESULT ret;
109
Chia-I Wud8965932014-10-13 13:32:37 +0800110 if (gpu->winsys)
Chia-I Wue54854a2014-08-05 10:23:50 +0800111 return XGL_ERROR_DEVICE_ALREADY_CREATED;
112
Chia-I Wu545c2e12015-02-22 13:19:54 +0800113 dev = (struct intel_dev *) intel_base_create(&gpu->handle,
114 sizeof(*dev), info->flags & XGL_DEVICE_CREATE_VALIDATION_BIT,
Chia-I Wubbf2c932014-08-07 12:20:08 +0800115 XGL_DBG_OBJECT_DEVICE, info, sizeof(struct intel_dev_dbg));
Chia-I Wue54854a2014-08-05 10:23:50 +0800116 if (!dev)
117 return XGL_ERROR_OUT_OF_MEMORY;
118
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
123 if (ext == INTEL_EXT_INVALID)
124 return XGL_ERROR_INVALID_EXTENSION;
125
126 dev->exts[ext] = true;
127 }
128
Chia-I Wue54854a2014-08-05 10:23:50 +0800129 dev->gpu = gpu;
130
131 ret = intel_gpu_open(gpu);
132 if (ret != XGL_SUCCESS) {
133 intel_dev_destroy(dev);
134 return ret;
135 }
136
Chia-I Wud8965932014-10-13 13:32:37 +0800137 dev->winsys = gpu->winsys;
Chia-I Wue54854a2014-08-05 10:23:50 +0800138
Chia-I Wu0b784442014-08-25 22:54:16 +0800139 dev->cmd_scratch_bo = intel_winsys_alloc_buffer(dev->winsys,
Chia-I Wu32a22462014-08-26 14:13:46 +0800140 "command buffer scratch", 4096, false);
Chia-I Wu0b784442014-08-25 22:54:16 +0800141 if (!dev->cmd_scratch_bo) {
142 intel_dev_destroy(dev);
143 return XGL_ERROR_OUT_OF_GPU_MEMORY;
144 }
145
Chia-I Wu9fe3ec42014-10-17 09:49:16 +0800146 if (!dev_create_meta_shaders(dev)) {
147 intel_dev_destroy(dev);
148 return XGL_ERROR_OUT_OF_MEMORY;
149 }
150
Chia-I Wuf8385062015-01-04 16:27:24 +0800151 ret = intel_desc_pool_create(dev, &dev->desc_pool);
152 if (ret != XGL_SUCCESS) {
153 intel_dev_destroy(dev);
154 return ret;
155 }
156
Chia-I Wu38d1ddf2015-03-02 10:51:39 -0700157 intel_pipeline_init_default_sample_patterns(dev,
158 (uint8_t *) &dev->sample_pattern_1x,
159 (uint8_t *) &dev->sample_pattern_2x,
160 (uint8_t *) &dev->sample_pattern_4x,
161 (uint8_t *) dev->sample_pattern_8x,
162 (uint8_t *) dev->sample_pattern_16x);
163
Chia-I Wue54854a2014-08-05 10:23:50 +0800164 ret = dev_create_queues(dev, info->pRequestedQueues,
165 info->queueRecordCount);
166 if (ret != XGL_SUCCESS) {
167 intel_dev_destroy(dev);
168 return ret;
169 }
170
Chia-I Wue54854a2014-08-05 10:23:50 +0800171 *dev_ret = dev;
172
173 return XGL_SUCCESS;
174}
175
Chia-I Wubbf2c932014-08-07 12:20:08 +0800176static void dev_clear_msg_filters(struct intel_dev *dev)
177{
178 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
179 struct intel_dev_dbg_msg_filter *filter;
180
181 filter = dbg->filters;
182 while (filter) {
183 struct intel_dev_dbg_msg_filter *next = filter->next;
Chia-I Wuf9c81ef2015-02-22 13:49:15 +0800184 intel_free(dev, filter);
Chia-I Wubbf2c932014-08-07 12:20:08 +0800185 filter = next;
186 }
187
188 dbg->filters = NULL;
189}
190
Chia-I Wue54854a2014-08-05 10:23:50 +0800191void intel_dev_destroy(struct intel_dev *dev)
192{
Chia-I Wud8965932014-10-13 13:32:37 +0800193 struct intel_gpu *gpu = dev->gpu;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600194 uint32_t i;
Chia-I Wue54854a2014-08-05 10:23:50 +0800195
196 if (dev->base.dbg)
Chia-I Wubbf2c932014-08-07 12:20:08 +0800197 dev_clear_msg_filters(dev);
Chia-I Wue54854a2014-08-05 10:23:50 +0800198
199 for (i = 0; i < ARRAY_SIZE(dev->queues); i++) {
200 if (dev->queues[i])
Chia-I Wue09b5362014-08-07 09:25:14 +0800201 intel_queue_destroy(dev->queues[i]);
Chia-I Wue54854a2014-08-05 10:23:50 +0800202 }
203
Chia-I Wuf8385062015-01-04 16:27:24 +0800204 if (dev->desc_pool)
Chia-I Wuf13ed3c2015-02-22 14:09:00 +0800205 intel_desc_pool_destroy(dev, dev->desc_pool);
Chia-I Wuf8385062015-01-04 16:27:24 +0800206
Chia-I Wu9fe3ec42014-10-17 09:49:16 +0800207 dev_destroy_meta_shaders(dev);
208
Chia-I Wu0b784442014-08-25 22:54:16 +0800209 if (dev->cmd_scratch_bo)
210 intel_bo_unreference(dev->cmd_scratch_bo);
211
Chia-I Wubbf2c932014-08-07 12:20:08 +0800212 intel_base_destroy(&dev->base);
Chia-I Wud8965932014-10-13 13:32:37 +0800213
214 if (gpu->winsys)
Chia-I Wuc21ee372014-12-09 01:37:16 +0800215 intel_gpu_close(gpu);
Chia-I Wue54854a2014-08-05 10:23:50 +0800216}
217
Chia-I Wue54854a2014-08-05 10:23:50 +0800218XGL_RESULT intel_dev_add_msg_filter(struct intel_dev *dev,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600219 int32_t msg_code,
Chia-I Wue54854a2014-08-05 10:23:50 +0800220 XGL_DBG_MSG_FILTER filter)
221{
222 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
223 struct intel_dev_dbg_msg_filter *f = dbg->filters;
224
225 assert(filter != XGL_DBG_MSG_FILTER_NONE);
226
227 while (f) {
228 if (f->msg_code == msg_code)
229 break;
230 f = f->next;
231 }
232
233 if (f) {
234 if (f->filter != filter) {
235 f->filter = filter;
236 f->triggered = false;
237 }
238 } else {
Chia-I Wuf9c81ef2015-02-22 13:49:15 +0800239 f = intel_alloc(dev, sizeof(*f), 0, XGL_SYSTEM_ALLOC_DEBUG);
Chia-I Wue54854a2014-08-05 10:23:50 +0800240 if (!f)
241 return XGL_ERROR_OUT_OF_MEMORY;
242
243 f->msg_code = msg_code;
244 f->filter = filter;
245 f->triggered = false;
246
247 f->next = dbg->filters;
248 dbg->filters = f;
249 }
250
251 return XGL_SUCCESS;
252}
253
254void intel_dev_remove_msg_filter(struct intel_dev *dev,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600255 int32_t msg_code)
Chia-I Wue54854a2014-08-05 10:23:50 +0800256{
257 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
258 struct intel_dev_dbg_msg_filter *f = dbg->filters, *prev = NULL;
259
260 while (f) {
261 if (f->msg_code == msg_code) {
262 if (prev)
263 prev->next = f->next;
264 else
265 dbg->filters = f->next;
266
Chia-I Wuf9c81ef2015-02-22 13:49:15 +0800267 intel_free(dev, f);
Chia-I Wue54854a2014-08-05 10:23:50 +0800268 break;
269 }
270
271 prev = f;
272 f = f->next;
273 }
274}
Chia-I Wua207aba2014-08-05 15:13:37 +0800275
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800276static bool dev_filter_msg(struct intel_dev *dev,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600277 int32_t msg_code)
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800278{
279 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
280 struct intel_dev_dbg_msg_filter *filter;
281
282 if (!dbg)
283 return false;
284
285 filter = dbg->filters;
286 while (filter) {
287 if (filter->msg_code != msg_code) {
288 filter = filter->next;
289 continue;
290 }
291
292 if (filter->filter == XGL_DBG_MSG_FILTER_ALL)
293 return true;
294
295 if (filter->filter == XGL_DBG_MSG_FILTER_REPEATED &&
296 filter->triggered)
297 return true;
298
299 filter->triggered = true;
300 break;
301 }
302
303 return false;
304}
305
306void intel_dev_log(struct intel_dev *dev,
307 XGL_DBG_MSG_TYPE msg_type,
308 XGL_VALIDATION_LEVEL validation_level,
Chia-I Wuaabb3602014-08-19 14:18:23 +0800309 struct intel_base *src_object,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600310 size_t location,
311 int32_t msg_code,
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800312 const char *format, ...)
313{
314 va_list ap;
315
316 if (dev_filter_msg(dev, msg_code))
317 return;
318
319 va_start(ap, format);
Chia-I Wu8e270b52015-01-03 14:47:32 +0800320 icd_logv(msg_type, validation_level, (XGL_BASE_OBJECT) src_object,
Chia-I Wu82d3d8b2014-08-09 13:07:44 +0800321 location, msg_code, format, ap);
322 va_end(ap);
323}
324
Chia-I Wu96177272015-01-03 15:27:41 +0800325ICD_EXPORT XGL_RESULT XGLAPI xglCreateDevice(
Chia-I Wua207aba2014-08-05 15:13:37 +0800326 XGL_PHYSICAL_GPU gpu_,
327 const XGL_DEVICE_CREATE_INFO* pCreateInfo,
328 XGL_DEVICE* pDevice)
329{
330 struct intel_gpu *gpu = intel_gpu(gpu_);
331
332 return intel_dev_create(gpu, pCreateInfo, (struct intel_dev **) pDevice);
333}
334
Chia-I Wu96177272015-01-03 15:27:41 +0800335ICD_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(
Chia-I Wua207aba2014-08-05 15:13:37 +0800336 XGL_DEVICE device)
337{
338 struct intel_dev *dev = intel_dev(device);
339
340 intel_dev_destroy(dev);
341
342 return XGL_SUCCESS;
343}
344
Chia-I Wu96177272015-01-03 15:27:41 +0800345ICD_EXPORT XGL_RESULT XGLAPI xglGetDeviceQueue(
Chia-I Wu49dbee82014-08-06 12:48:47 +0800346 XGL_DEVICE device,
347 XGL_QUEUE_TYPE queueType,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600348 uint32_t queueIndex,
Chia-I Wu49dbee82014-08-06 12:48:47 +0800349 XGL_QUEUE* pQueue)
350{
351 struct intel_dev *dev = intel_dev(device);
352
353 switch (queueType) {
354 case XGL_QUEUE_TYPE_GRAPHICS:
355 case XGL_QUEUE_TYPE_COMPUTE:
356 if (queueIndex > 0)
357 return XGL_ERROR_UNAVAILABLE;
358 *pQueue = dev->queues[INTEL_GPU_ENGINE_3D];
359 return XGL_SUCCESS;
360 case XGL_QUEUE_TYPE_DMA:
361 default:
362 return XGL_ERROR_UNAVAILABLE;
363 }
364}
365
Chia-I Wu96177272015-01-03 15:27:41 +0800366ICD_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(
Chia-I Wu49dbee82014-08-06 12:48:47 +0800367 XGL_DEVICE device)
368{
369 struct intel_dev *dev = intel_dev(device);
370 XGL_RESULT ret = XGL_SUCCESS;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600371 uint32_t i;
Chia-I Wu49dbee82014-08-06 12:48:47 +0800372
373 for (i = 0; i < ARRAY_SIZE(dev->queues); i++) {
374 if (dev->queues[i]) {
Chia-I Wue09b5362014-08-07 09:25:14 +0800375 const XGL_RESULT r = intel_queue_wait(dev->queues[i], -1);
Chia-I Wu49dbee82014-08-06 12:48:47 +0800376 if (r != XGL_SUCCESS)
377 ret = r;
378 }
379 }
380
381 return ret;
382}
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800383
Chia-I Wu96177272015-01-03 15:27:41 +0800384ICD_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800385 XGL_DEVICE device,
386 XGL_VALIDATION_LEVEL validationLevel)
387{
388 struct intel_dev *dev = intel_dev(device);
Chia-I Wu069f30f2014-08-21 13:45:20 +0800389 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800390
Chia-I Wu069f30f2014-08-21 13:45:20 +0800391 if (dbg)
392 dbg->validation_level = validationLevel;
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800393
394 return XGL_SUCCESS;
395}
396
Chia-I Wu96177272015-01-03 15:27:41 +0800397ICD_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800398 XGL_DEVICE device,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600399 int32_t msgCode,
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800400 XGL_DBG_MSG_FILTER filter)
401{
402 struct intel_dev *dev = intel_dev(device);
403
404 if (!dev->base.dbg)
405 return XGL_SUCCESS;
406
407 if (filter == XGL_DBG_MSG_FILTER_NONE) {
408 intel_dev_remove_msg_filter(dev, msgCode);
409 return XGL_SUCCESS;
410 }
411
412 return intel_dev_add_msg_filter(dev, msgCode, filter);
413}
414
Chia-I Wu96177272015-01-03 15:27:41 +0800415ICD_EXPORT XGL_RESULT XGLAPI xglDbgSetDeviceOption(
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800416 XGL_DEVICE device,
417 XGL_DBG_DEVICE_OPTION dbgOption,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600418 size_t dataSize,
419 const void* pData)
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800420{
421 struct intel_dev *dev = intel_dev(device);
Chia-I Wu069f30f2014-08-21 13:45:20 +0800422 struct intel_dev_dbg *dbg = intel_dev_dbg(dev);
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800423 XGL_RESULT ret = XGL_SUCCESS;
424
425 if (dataSize == 0)
426 return XGL_ERROR_INVALID_VALUE;
427
428 switch (dbgOption) {
429 case XGL_DBG_OPTION_DISABLE_PIPELINE_LOADS:
Chia-I Wu069f30f2014-08-21 13:45:20 +0800430 if (dbg)
431 dbg->disable_pipeline_loads = *((const bool *) pData);
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800432 break;
433 case XGL_DBG_OPTION_FORCE_OBJECT_MEMORY_REQS:
Chia-I Wu069f30f2014-08-21 13:45:20 +0800434 if (dbg)
435 dbg->force_object_memory_reqs = *((const bool *) pData);
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800436 break;
437 case XGL_DBG_OPTION_FORCE_LARGE_IMAGE_ALIGNMENT:
Chia-I Wu069f30f2014-08-21 13:45:20 +0800438 if (dbg)
439 dbg->force_large_image_alignment = *((const bool *) pData);
Chia-I Wu7ec9f342014-08-19 10:47:53 +0800440 break;
441 default:
442 ret = XGL_ERROR_INVALID_VALUE;
443 break;
444 }
445
446 return ret;
447}