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

Skip to content

Commit 9cd756f

Browse files
committed
Fix alignment of shader bytecode array
1 parent b857111 commit 9cd756f

20 files changed

Lines changed: 103 additions & 21 deletions

03_Drawing_a_triangle/02_Graphics_pipeline_basics/01_Shader_modules.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,13 +362,19 @@ easier to wrap it in a deleter variable when calling `createShaderModule`.
362362
363363
Creating a shader module is simple, we only need to specify a pointer to the
364364
buffer with the bytecode and the length of it. This information is specified in
365-
a `VkShaderModuleCreateInfo` structure.
365+
a `VkShaderModuleCreateInfo` structure. The one catch is that the size of the
366+
bytecode is specified in bytes, but the bytecode pointer is a `uint32_t` pointer
367+
rather than a `char` pointer. Therefore we need to temporarily copy the bytecode
368+
to a container that has the right alignment for `uint32_t`:
366369
367370
```c++
368371
VkShaderModuleCreateInfo createInfo = {};
369372
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
370373
createInfo.codeSize = code.size();
371-
createInfo.pCode = (uint32_t*) code.data();
374+
375+
std::vector<uint32_t> codeAligned(code.size() / sizeof(uint32_t) + 1);
376+
memcpy(codeAligned.data(), code.data(), code.size());
377+
createInfo.pCode = codeAligned.data();
372378
```
373379

374380
The `VkShaderModule` can then be created with a call to `vkCreateShaderModule`:

code/command_buffers.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,11 @@ class HelloTriangleApplication {
609609
VkShaderModuleCreateInfo createInfo = {};
610610
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
611611
createInfo.codeSize = code.size();
612-
createInfo.pCode = (uint32_t*) code.data();
612+
613+
std::vector<uint32_t> codeAligned(code.size() / 4 + 1);
614+
memcpy(codeAligned.data(), code.data(), code.size());
615+
616+
createInfo.pCode = codeAligned.data();
613617

614618
if (vkCreateShaderModule(device, &createInfo, nullptr, shaderModule.replace()) != VK_SUCCESS) {
615619
throw std::runtime_error("failed to create shader module!");

code/depth_buffering.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1322,7 +1322,11 @@ class HelloTriangleApplication {
13221322
VkShaderModuleCreateInfo createInfo = {};
13231323
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13241324
createInfo.codeSize = code.size();
1325-
createInfo.pCode = (uint32_t*) code.data();
1325+
1326+
std::vector<uint32_t> codeAligned(code.size() / 4 + 1);
1327+
memcpy(codeAligned.data(), code.data(), code.size());
1328+
1329+
createInfo.pCode = codeAligned.data();
13261330

13271331
if (vkCreateShaderModule(device, &createInfo, nullptr, shaderModule.replace()) != VK_SUCCESS) {
13281332
throw std::runtime_error("failed to create shader module!");

code/descriptor_layout.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,11 @@ class HelloTriangleApplication {
952952
VkShaderModuleCreateInfo createInfo = {};
953953
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
954954
createInfo.codeSize = code.size();
955-
createInfo.pCode = (uint32_t*) code.data();
955+
956+
std::vector<uint32_t> codeAligned(code.size() / 4 + 1);
957+
memcpy(codeAligned.data(), code.data(), code.size());
958+
959+
createInfo.pCode = codeAligned.data();
956960

957961
if (vkCreateShaderModule(device, &createInfo, nullptr, shaderModule.replace()) != VK_SUCCESS) {
958962
throw std::runtime_error("failed to create shader module!");

code/descriptor_set.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1004,7 +1004,11 @@ class HelloTriangleApplication {
10041004
VkShaderModuleCreateInfo createInfo = {};
10051005
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
10061006
createInfo.codeSize = code.size();
1007-
createInfo.pCode = (uint32_t*) code.data();
1007+
1008+
std::vector<uint32_t> codeAligned(code.size() / 4 + 1);
1009+
memcpy(codeAligned.data(), code.data(), code.size());
1010+
1011+
createInfo.pCode = codeAligned.data();
10081012

10091013
if (vkCreateShaderModule(device, &createInfo, nullptr, shaderModule.replace()) != VK_SUCCESS) {
10101014
throw std::runtime_error("failed to create shader module!");

code/fixed_functions.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,11 @@ class HelloTriangleApplication {
470470
VkShaderModuleCreateInfo createInfo = {};
471471
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
472472
createInfo.codeSize = code.size();
473-
createInfo.pCode = (uint32_t*) code.data();
473+
474+
std::vector<uint32_t> codeAligned(code.size() / 4 + 1);
475+
memcpy(codeAligned.data(), code.data(), code.size());
476+
477+
createInfo.pCode = codeAligned.data();
474478

475479
if (vkCreateShaderModule(device, &createInfo, nullptr, shaderModule.replace()) != VK_SUCCESS) {
476480
throw std::runtime_error("failed to create shader module!");

code/framebuffers.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,11 @@ class HelloTriangleApplication {
547547
VkShaderModuleCreateInfo createInfo = {};
548548
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
549549
createInfo.codeSize = code.size();
550-
createInfo.pCode = (uint32_t*) code.data();
550+
551+
std::vector<uint32_t> codeAligned(code.size() / 4 + 1);
552+
memcpy(codeAligned.data(), code.data(), code.size());
553+
554+
createInfo.pCode = codeAligned.data();
551555

552556
if (vkCreateShaderModule(device, &createInfo, nullptr, shaderModule.replace()) != VK_SUCCESS) {
553557
throw std::runtime_error("failed to create shader module!");

code/graphics_pipeline_complete.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,11 @@ class HelloTriangleApplication {
523523
VkShaderModuleCreateInfo createInfo = {};
524524
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
525525
createInfo.codeSize = code.size();
526-
createInfo.pCode = (uint32_t*) code.data();
526+
527+
std::vector<uint32_t> codeAligned(code.size() / 4 + 1);
528+
memcpy(codeAligned.data(), code.data(), code.size());
529+
530+
createInfo.pCode = codeAligned.data();
527531

528532
if (vkCreateShaderModule(device, &createInfo, nullptr, shaderModule.replace()) != VK_SUCCESS) {
529533
throw std::runtime_error("failed to create shader module!");

code/hello_triangle.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,11 @@ class HelloTriangleApplication {
676676
VkShaderModuleCreateInfo createInfo = {};
677677
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
678678
createInfo.codeSize = code.size();
679-
createInfo.pCode = (uint32_t*) code.data();
679+
680+
std::vector<uint32_t> codeAligned(code.size() / 4 + 1);
681+
memcpy(codeAligned.data(), code.data(), code.size());
682+
683+
createInfo.pCode = codeAligned.data();
680684

681685
if (vkCreateShaderModule(device, &createInfo, nullptr, shaderModule.replace()) != VK_SUCCESS) {
682686
throw std::runtime_error("failed to create shader module!");

code/index_buffer.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -887,7 +887,11 @@ class HelloTriangleApplication {
887887
VkShaderModuleCreateInfo createInfo = {};
888888
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
889889
createInfo.codeSize = code.size();
890-
createInfo.pCode = (uint32_t*) code.data();
890+
891+
std::vector<uint32_t> codeAligned(code.size() / 4 + 1);
892+
memcpy(codeAligned.data(), code.data(), code.size());
893+
894+
createInfo.pCode = codeAligned.data();
891895

892896
if (vkCreateShaderModule(device, &createInfo, nullptr, shaderModule.replace()) != VK_SUCCESS) {
893897
throw std::runtime_error("failed to create shader module!");

0 commit comments

Comments
 (0)