13
13
14
14
#include " VulkanRuntime.h"
15
15
16
- #include " llvm/Support/Format.h"
17
16
#include < chrono>
17
+ #include < cstring>
18
+ // TODO(antiagainst): It's generally bad to access stdout/stderr in a library.
19
+ // Figure out a better way for error reporting.
20
+ #include < iomanip>
21
+ #include < iostream>
22
+
23
+ inline void emitVulkanError (const char *api, VkResult error) {
24
+ std::cerr << " failed with error code " << error << " when executing " << api;
25
+ }
26
+
27
+ #define RETURN_ON_VULKAN_ERROR (result, api ) \
28
+ if ((result) != VK_SUCCESS) { \
29
+ emitVulkanError (api, (result)); \
30
+ return failure (); \
31
+ }
18
32
19
33
using namespace mlir ;
20
34
@@ -32,7 +46,7 @@ void VulkanRuntime::setResourceData(
32
46
const VulkanHostMemoryBuffer &hostMemBuffer) {
33
47
resourceData[desIndex][bindIndex] = hostMemBuffer;
34
48
resourceStorageClassData[desIndex][bindIndex] =
35
- spirv::StorageClass ::StorageBuffer;
49
+ SPIRVStorageClass ::StorageBuffer;
36
50
}
37
51
38
52
void VulkanRuntime::setEntryPoint (const char *entryPointName) {
@@ -49,33 +63,27 @@ void VulkanRuntime::setShaderModule(uint8_t *shader, uint32_t size) {
49
63
}
50
64
51
65
LogicalResult VulkanRuntime::mapStorageClassToDescriptorType (
52
- spirv::StorageClass storageClass, VkDescriptorType &descriptorType) {
66
+ SPIRVStorageClass storageClass, VkDescriptorType &descriptorType) {
53
67
switch (storageClass) {
54
- case spirv::StorageClass ::StorageBuffer:
68
+ case SPIRVStorageClass ::StorageBuffer:
55
69
descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
56
70
break ;
57
- case spirv::StorageClass ::Uniform:
71
+ case SPIRVStorageClass ::Uniform:
58
72
descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
59
73
break ;
60
- default :
61
- llvm::errs () << " unsupported storage class" ;
62
- return failure ();
63
74
}
64
75
return success ();
65
76
}
66
77
67
78
LogicalResult VulkanRuntime::mapStorageClassToBufferUsageFlag (
68
- spirv::StorageClass storageClass, VkBufferUsageFlagBits &bufferUsage) {
79
+ SPIRVStorageClass storageClass, VkBufferUsageFlagBits &bufferUsage) {
69
80
switch (storageClass) {
70
- case spirv::StorageClass ::StorageBuffer:
81
+ case SPIRVStorageClass ::StorageBuffer:
71
82
bufferUsage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
72
83
break ;
73
- case spirv::StorageClass ::Uniform:
84
+ case SPIRVStorageClass ::Uniform:
74
85
bufferUsage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
75
86
break ;
76
- default :
77
- llvm::errs () << " unsupported storage class" ;
78
- return failure ();
79
87
}
80
88
return success ();
81
89
}
@@ -87,8 +95,7 @@ LogicalResult VulkanRuntime::countDeviceMemorySize() {
87
95
if (resourceDataBindingPair.second .size ) {
88
96
memorySize += resourceDataBindingPair.second .size ;
89
97
} else {
90
- llvm::errs ()
91
- << " expected buffer size greater than zero for resource data" ;
98
+ std::cerr << " expected buffer size greater than zero for resource data" ;
92
99
return failure ();
93
100
}
94
101
}
@@ -98,11 +105,11 @@ LogicalResult VulkanRuntime::countDeviceMemorySize() {
98
105
99
106
LogicalResult VulkanRuntime::initRuntime () {
100
107
if (!resourceData.size ()) {
101
- llvm::errs () << " Vulkan runtime needs at least one resource" ;
108
+ std::cerr << " Vulkan runtime needs at least one resource" ;
102
109
return failure ();
103
110
}
104
111
if (!binarySize || !binary) {
105
- llvm::errs () << " binary shader size must be greater than zero" ;
112
+ std::cerr << " binary shader size must be greater than zero" ;
106
113
return failure ();
107
114
}
108
115
if (failed (countDeviceMemorySize ())) {
@@ -130,7 +137,7 @@ LogicalResult VulkanRuntime::destroy() {
130
137
vkDestroyDescriptorPool (device, descriptorPool, nullptr );
131
138
vkDestroyPipeline (device, pipeline, nullptr );
132
139
vkDestroyPipelineLayout (device, pipelineLayout, nullptr );
133
- for (auto &descriptorSetLayout: descriptorSetLayouts) {
140
+ for (auto &descriptorSetLayout : descriptorSetLayouts) {
134
141
vkDestroyDescriptorSetLayout (device, descriptorSetLayout, nullptr );
135
142
}
136
143
vkDestroyShaderModule (device, shaderModule, nullptr );
@@ -199,12 +206,12 @@ LogicalResult VulkanRuntime::run() {
199
206
VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT),
200
207
" vkGetQueryPoolResults" );
201
208
float microsec = (timestamps[1 ] - timestamps[0 ]) * timestampPeriod / 1000 ;
202
- llvm::outs () << " Compute shader execution time: "
203
- << llvm::format ( " %0.3fus \n " , microsec) ;
209
+ std::cout << " Compute shader execution time: " << std::setprecision ( 3 )
210
+ << microsec << " us \n " ;
204
211
}
205
212
206
- llvm::outs () << " Command buffer submit time: " << submitDuration.count ()
207
- << " us\n Wait idle time: " << execDuration.count () << " us\n " ;
213
+ std::cout << " Command buffer submit time: " << submitDuration.count ()
214
+ << " us\n Wait idle time: " << execDuration.count () << " us\n " ;
208
215
209
216
return success ();
210
217
}
@@ -240,7 +247,7 @@ LogicalResult VulkanRuntime::createDevice() {
240
247
vkEnumeratePhysicalDevices (instance, &physicalDeviceCount, 0 ),
241
248
" vkEnumeratePhysicalDevices" );
242
249
243
- llvm::SmallVector <VkPhysicalDevice, 1 > physicalDevices (physicalDeviceCount);
250
+ std::vector <VkPhysicalDevice> physicalDevices (physicalDeviceCount);
244
251
RETURN_ON_VULKAN_ERROR (vkEnumeratePhysicalDevices (instance,
245
252
&physicalDeviceCount,
246
253
physicalDevices.data ()),
@@ -313,7 +320,7 @@ LogicalResult VulkanRuntime::getBestComputeQueue() {
313
320
vkGetPhysicalDeviceQueueFamilyProperties (physicalDevice,
314
321
&queueFamilyPropertiesCount, 0 );
315
322
316
- SmallVector <VkQueueFamilyProperties, 1 > familyProperties (
323
+ std::vector <VkQueueFamilyProperties> familyProperties (
317
324
queueFamilyPropertiesCount);
318
325
vkGetPhysicalDeviceQueueFamilyProperties (
319
326
physicalDevice, &queueFamilyPropertiesCount, familyProperties.data ());
@@ -339,14 +346,14 @@ LogicalResult VulkanRuntime::getBestComputeQueue() {
339
346
}
340
347
}
341
348
342
- llvm::errs () << " cannot find valid queue" ;
349
+ std::cerr << " cannot find valid queue" ;
343
350
return failure ();
344
351
}
345
352
346
353
LogicalResult VulkanRuntime::createMemoryBuffers () {
347
354
// For each descriptor set.
348
355
for (const auto &resourceDataMapPair : resourceData) {
349
- llvm::SmallVector <VulkanDeviceMemoryBuffer, 1 > deviceMemoryBuffers;
356
+ std::vector <VulkanDeviceMemoryBuffer> deviceMemoryBuffers;
350
357
const auto descriptorSetIndex = resourceDataMapPair.first ;
351
358
const auto &resourceDataMap = resourceDataMapPair.second ;
352
359
@@ -362,7 +369,7 @@ LogicalResult VulkanRuntime::createMemoryBuffers() {
362
369
const auto resourceStorageClassMapIt =
363
370
resourceStorageClassData.find (descriptorSetIndex);
364
371
if (resourceStorageClassMapIt == resourceStorageClassData.end ()) {
365
- llvm::errs ()
372
+ std::cerr
366
373
<< " cannot find storage class for resource in descriptor set: "
367
374
<< descriptorSetIndex;
368
375
return failure ();
@@ -373,7 +380,7 @@ LogicalResult VulkanRuntime::createMemoryBuffers() {
373
380
const auto resourceStorageClassIt =
374
381
resourceStorageClassMap.find (resourceDataBindingPair.first );
375
382
if (resourceStorageClassIt == resourceStorageClassMap.end ()) {
376
- llvm::errs ()
383
+ std::cerr
377
384
<< " cannot find storage class for resource with descriptor index: "
378
385
<< resourceDataBindingPair.first ;
379
386
return failure ();
@@ -384,10 +391,10 @@ LogicalResult VulkanRuntime::createMemoryBuffers() {
384
391
descriptorType)) ||
385
392
failed (mapStorageClassToBufferUsageFlag (resourceStorageClassBinding,
386
393
bufferUsage))) {
387
- llvm::errs () << " storage class for resource with descriptor binding: "
388
- << resourceDataBindingPair.first
389
- << " in the descriptor set: " << descriptorSetIndex
390
- << " is not supported " ;
394
+ std::cerr << " storage class for resource with descriptor binding: "
395
+ << resourceDataBindingPair.first
396
+ << " in the descriptor set: " << descriptorSetIndex
397
+ << " is not supported " ;
391
398
return failure ();
392
399
}
393
400
@@ -464,7 +471,7 @@ LogicalResult VulkanRuntime::createShaderModule() {
464
471
465
472
void VulkanRuntime::initDescriptorSetLayoutBindingMap () {
466
473
for (const auto &deviceMemoryBufferMapPair : deviceMemoryBufferMap) {
467
- SmallVector <VkDescriptorSetLayoutBinding, 1 > descriptorSetLayoutBindings;
474
+ std::vector <VkDescriptorSetLayoutBinding> descriptorSetLayoutBindings;
468
475
const auto &deviceMemoryBuffers = deviceMemoryBufferMapPair.second ;
469
476
const auto descriptorSetIndex = deviceMemoryBufferMapPair.first ;
470
477
@@ -495,8 +502,8 @@ LogicalResult VulkanRuntime::createDescriptorSetLayout() {
495
502
descriptorSetLayoutBindingMap.find (descriptorSetIndex);
496
503
497
504
if (descriptorSetLayoutBindingIt == descriptorSetLayoutBindingMap.end ()) {
498
- llvm::errs () << " cannot find layout bindings for the set with number: "
499
- << descriptorSetIndex;
505
+ std::cerr << " cannot find layout bindings for the set with number: "
506
+ << descriptorSetIndex;
500
507
return failure ();
501
508
}
502
509
@@ -573,7 +580,7 @@ LogicalResult VulkanRuntime::createComputePipeline() {
573
580
}
574
581
575
582
LogicalResult VulkanRuntime::createDescriptorPool () {
576
- llvm::SmallVector <VkDescriptorPoolSize, 1 > descriptorPoolSizes;
583
+ std::vector <VkDescriptorPoolSize> descriptorPoolSizes;
577
584
for (const auto &descriptorSetInfo : descriptorSetInfoPool) {
578
585
// For each descriptor set populate descriptor pool size.
579
586
VkDescriptorPoolSize descriptorPoolSize = {};
@@ -616,7 +623,7 @@ LogicalResult VulkanRuntime::allocateDescriptorSets() {
616
623
617
624
LogicalResult VulkanRuntime::setWriteDescriptors () {
618
625
if (descriptorSets.size () != descriptorSetInfoPool.size ()) {
619
- llvm::errs () << " Each descriptor set must have descriptor set information" ;
626
+ std::cerr << " Each descriptor set must have descriptor set information" ;
620
627
return failure ();
621
628
}
622
629
// For each descriptor set.
0 commit comments