Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1bd7f90

Browse files
committed
Fix wrong calling convention for debug callback
1 parent ae598c8 commit 1bd7f90

27 files changed

Lines changed: 171 additions & 61 deletions

03_Drawing_a_triangle/00_Setup/02_Validation_layers.md

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ VkResult vkCreateInstance(
2828
const VkInstanceCreateInfo* pCreateInfo,
2929
const VkAllocationCallbacks* pAllocator,
3030
VkInstance* instance) {
31-
31+
3232
if (pCreateInfo == nullptr || instance == nullptr) {
3333
log("Null pointer passed to required parameter!");
3434
return VK_ERROR_INITIALIZATION_FAILED;
@@ -147,7 +147,7 @@ void createInstance() {
147147
Now run the program in debug mode and ensure that the error does not occur. If
148148
it does, then make sure you have properly installed the Vulkan SDK. If none or
149149
very few layers are being reported, then you may be dealing with
150-
[this issue](https://vulkan.lunarg.com/app/issues/578e8c8d5698c020d71580fc)
150+
[this issue](https://vulkan.lunarg.com/app/issues/578e8c8d5698c020d71580fc)
151151
(requires a LunarG account to view). See that page for help with fixing it.
152152

153153
Finally, modify the `VkInstanceCreateInfo` struct instantiation to include the
@@ -191,7 +191,7 @@ std::vector<const char*> getRequiredExtensions() {
191191
if (enableValidationLayers) {
192192
extensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
193193
}
194-
194+
195195
return extensions;
196196
}
197197
```
@@ -216,10 +216,16 @@ the validation layers.
216216

217217
Now let's see what a callback function looks like. Add a new static member
218218
function called `debugCallback` with the `PFN_vkDebugReportCallbackEXT`
219-
prototype:
219+
prototype. It is required to have the `stdcall` calling convention on Windows.
220+
The calling convention does not have to be specified on Linux, because there is
221+
only one calling convention on that platform.
220222

221223
```c++
222-
static VkBool32 debugCallback(
224+
#ifndef WIN32
225+
#define __stdcall
226+
#endif
227+
228+
static VkBool32 __stdcall debugCallback(
223229
VkDebugReportFlagsEXT flags,
224230
VkDebugReportObjectTypeEXT objType,
225231
uint64_t obj,
@@ -230,7 +236,7 @@ static VkBool32 debugCallback(
230236
void* userData) {
231237

232238
std::cerr << "validation layer: " << msg << std::endl;
233-
239+
234240
return VK_FALSE;
235241
}
236242
```
@@ -282,7 +288,7 @@ We'll need to fill in a structure with details about the callback:
282288
VkDebugReportCallbackCreateInfoEXT createInfo = {};
283289
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
284290
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
285-
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugCallback;
291+
createInfo.pfnCallback = debugCallback;
286292
```
287293

288294
The `flags` field allows you to filter which types of messages you would like to
@@ -293,7 +299,7 @@ to pass a pointer to the `HelloTriangleApplication` class, for example.
293299

294300
This struct should be passed to the `vkCreateDebugReportCallbackEXT` function to
295301
create the `VkDebugReportCallbackEXT` object. Unfortunately, because this
296-
function is an extension function it is not automatically loaded. We have to
302+
function is an extension function, it is not automatically loaded. We have to
297303
look up its address ourselves using `vkGetInstanceProcAddr`. We're going to
298304
create our own proxy function that handles this in the background. I've added it
299305
right above the `VDeleter` definition.
@@ -368,4 +374,4 @@ you how helpful the validation layers are with catching them and to teach you
368374
how important it is to know exactly what you're doing with Vulkan. Now it's time
369375
to look at [Vulkan devices in the system](!Drawing_a_triangle/Setup/Physical_devices_and_queue_families).
370376

371-
[Full code listing](/code/validation_layers.cpp)
377+
[Full code listing](/code/validation_layers.cpp)

code/command_buffers.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ class HelloTriangleApplication {
204204
VkDebugReportCallbackCreateInfoEXT createInfo = {};
205205
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
206206
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
207-
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugCallback;
207+
createInfo.pfnCallback = debugCallback;
208208

209209
if (CreateDebugReportCallbackEXT(instance, &createInfo, nullptr, &callback) != VK_SUCCESS) {
210210
throw std::runtime_error("failed to set up debug callback!");
@@ -780,7 +780,11 @@ class HelloTriangleApplication {
780780
return buffer;
781781
}
782782

783-
static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
783+
#ifndef WIN32
784+
#define __stdcall
785+
#endif
786+
787+
static VkBool32 __stdcall debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
784788
std::cerr << "validation layer: " << msg << std::endl;
785789

786790
return VK_FALSE;

code/depth_buffering.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ class HelloTriangleApplication {
337337
VkDebugReportCallbackCreateInfoEXT createInfo = {};
338338
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
339339
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
340-
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugCallback;
340+
createInfo.pfnCallback = debugCallback;
341341

342342
if (CreateDebugReportCallbackEXT(instance, &createInfo, nullptr, &callback) != VK_SUCCESS) {
343343
throw std::runtime_error("failed to set up debug callback!");
@@ -1467,7 +1467,11 @@ class HelloTriangleApplication {
14671467
return buffer;
14681468
}
14691469

1470-
static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
1470+
#ifndef WIN32
1471+
#define __stdcall
1472+
#endif
1473+
1474+
static VkBool32 __stdcall debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
14711475
std::cerr << "validation layer: " << msg << std::endl;
14721476

14731477
return VK_FALSE;

code/descriptor_layout.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ class HelloTriangleApplication {
302302
VkDebugReportCallbackCreateInfoEXT createInfo = {};
303303
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
304304
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
305-
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugCallback;
305+
createInfo.pfnCallback = debugCallback;
306306

307307
if (CreateDebugReportCallbackEXT(instance, &createInfo, nullptr, &callback) != VK_SUCCESS) {
308308
throw std::runtime_error("failed to set up debug callback!");
@@ -1123,7 +1123,11 @@ class HelloTriangleApplication {
11231123
return buffer;
11241124
}
11251125

1126-
static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
1126+
#ifndef WIN32
1127+
#define __stdcall
1128+
#endif
1129+
1130+
static VkBool32 __stdcall debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
11271131
std::cerr << "validation layer: " << msg << std::endl;
11281132

11291133
return VK_FALSE;

code/descriptor_set.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ class HelloTriangleApplication {
307307
VkDebugReportCallbackCreateInfoEXT createInfo = {};
308308
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
309309
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
310-
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugCallback;
310+
createInfo.pfnCallback = debugCallback;
311311

312312
if (CreateDebugReportCallbackEXT(instance, &createInfo, nullptr, &callback) != VK_SUCCESS) {
313313
throw std::runtime_error("failed to set up debug callback!");
@@ -1175,7 +1175,11 @@ class HelloTriangleApplication {
11751175
return buffer;
11761176
}
11771177

1178-
static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
1178+
#ifndef WIN32
1179+
#define __stdcall
1180+
#endif
1181+
1182+
static VkBool32 __stdcall debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
11791183
std::cerr << "validation layer: " << msg << std::endl;
11801184

11811185
return VK_FALSE;

code/fixed_functions.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ class HelloTriangleApplication {
196196
VkDebugReportCallbackCreateInfoEXT createInfo = {};
197197
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
198198
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
199-
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugCallback;
199+
createInfo.pfnCallback = debugCallback;
200200

201201
if (CreateDebugReportCallbackEXT(instance, &createInfo, nullptr, &callback) != VK_SUCCESS) {
202202
throw std::runtime_error("failed to set up debug callback!");
@@ -641,7 +641,11 @@ class HelloTriangleApplication {
641641
return buffer;
642642
}
643643

644-
static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
644+
#ifndef WIN32
645+
#define __stdcall
646+
#endif
647+
648+
static VkBool32 __stdcall debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
645649
std::cerr << "validation layer: " << msg << std::endl;
646650

647651
return VK_FALSE;

code/framebuffers.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ class HelloTriangleApplication {
199199
VkDebugReportCallbackCreateInfoEXT createInfo = {};
200200
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
201201
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
202-
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugCallback;
202+
createInfo.pfnCallback = debugCallback;
203203

204204
if (CreateDebugReportCallbackEXT(instance, &createInfo, nullptr, &callback) != VK_SUCCESS) {
205205
throw std::runtime_error("failed to set up debug callback!");
@@ -718,7 +718,11 @@ class HelloTriangleApplication {
718718
return buffer;
719719
}
720720

721-
static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
721+
#ifndef WIN32
722+
#define __stdcall
723+
#endif
724+
725+
static VkBool32 __stdcall debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
722726
std::cerr << "validation layer: " << msg << std::endl;
723727

724728
return VK_FALSE;

code/graphics_pipeline.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ class HelloTriangleApplication {
192192
VkDebugReportCallbackCreateInfoEXT createInfo = {};
193193
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
194194
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
195-
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugCallback;
195+
createInfo.pfnCallback = debugCallback;
196196

197197
if (CreateDebugReportCallbackEXT(instance, &createInfo, nullptr, &callback) != VK_SUCCESS) {
198198
throw std::runtime_error("failed to set up debug callback!");
@@ -520,7 +520,11 @@ class HelloTriangleApplication {
520520
return true;
521521
}
522522

523-
static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
523+
#ifndef WIN32
524+
#define __stdcall
525+
#endif
526+
527+
static VkBool32 __stdcall debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
524528
std::cerr << "validation layer: " << msg << std::endl;
525529

526530
return VK_FALSE;

code/graphics_pipeline_complete.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ class HelloTriangleApplication {
198198
VkDebugReportCallbackCreateInfoEXT createInfo = {};
199199
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
200200
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
201-
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugCallback;
201+
createInfo.pfnCallback = debugCallback;
202202

203203
if (CreateDebugReportCallbackEXT(instance, &createInfo, nullptr, &callback) != VK_SUCCESS) {
204204
throw std::runtime_error("failed to set up debug callback!");
@@ -694,7 +694,11 @@ class HelloTriangleApplication {
694694
return buffer;
695695
}
696696

697-
static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
697+
#ifndef WIN32
698+
#define __stdcall
699+
#endif
700+
701+
static VkBool32 __stdcall debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
698702
std::cerr << "validation layer: " << msg << std::endl;
699703

700704
return VK_FALSE;

code/hello_triangle.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ class HelloTriangleApplication {
211211
VkDebugReportCallbackCreateInfoEXT createInfo = {};
212212
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
213213
createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
214-
createInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugCallback;
214+
createInfo.pfnCallback = debugCallback;
215215

216216
if (CreateDebugReportCallbackEXT(instance, &createInfo, nullptr, &callback) != VK_SUCCESS) {
217217
throw std::runtime_error("failed to set up debug callback!");
@@ -847,7 +847,11 @@ class HelloTriangleApplication {
847847
return buffer;
848848
}
849849

850-
static VkBool32 debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
850+
#ifndef WIN32
851+
#define __stdcall
852+
#endif
853+
854+
static VkBool32 __stdcall debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char* layerPrefix, const char* msg, void* userData) {
851855
std::cerr << "validation layer: " << msg << std::endl;
852856

853857
return VK_FALSE;

0 commit comments

Comments
 (0)