-
Notifications
You must be signed in to change notification settings - Fork 2
/
09_shader_modules.diff
84 lines (79 loc) · 2 KB
/
09_shader_modules.diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
diff --git a/../steps/08_graphics_pipeline/main.go b/../steps/09_shader_modules/main.go
index ae130ab..11fdb21 100644
--- a/../steps/08_graphics_pipeline/main.go
+++ b/../steps/09_shader_modules/main.go
@@ -1,6 +1,7 @@
package main
import (
+ "embed"
"github.com/pkg/errors"
"github.com/veandco/go-sdl2/sdl"
"github.com/vkngwrapper/core/v2"
@@ -15,6 +16,9 @@ import (
"log"
)
+//go:embed shaders
+var shaders embed.FS
+
var validationLayers = []string{"VK_LAYER_KHRONOS_validation"}
var deviceExtensions = []string{khr_swapchain.ExtensionName}
@@ -426,7 +430,61 @@ func (app *HelloTriangleApplication) createSwapchain() error {
return nil
}
+func bytesToBytecode(b []byte) []uint32 {
+ byteCode := make([]uint32, len(b)/4)
+ for i := 0; i < len(byteCode); i++ {
+ byteIndex := i * 4
+ byteCode[i] = 0
+ byteCode[i] |= uint32(b[byteIndex])
+ byteCode[i] |= uint32(b[byteIndex+1]) << 8
+ byteCode[i] |= uint32(b[byteIndex+2]) << 16
+ byteCode[i] |= uint32(b[byteIndex+3]) << 24
+ }
+
+ return byteCode
+}
+
func (app *HelloTriangleApplication) createGraphicsPipeline() error {
+ // Load vertex shader
+ vertShaderBytes, err := shaders.ReadFile("shaders/vert.spv")
+ if err != nil {
+ return err
+ }
+
+ vertShader, _, err := app.device.CreateShaderModule(nil, core1_0.ShaderModuleCreateInfo{
+ Code: bytesToBytecode(vertShaderBytes),
+ })
+ if err != nil {
+ return err
+ }
+ defer vertShader.Destroy(nil)
+
+ // Load fragment shader
+ fragShaderBytes, err := shaders.ReadFile("shaders/frag.spv")
+ if err != nil {
+ return err
+ }
+
+ fragShader, _, err := app.device.CreateShaderModule(nil, core1_0.ShaderModuleCreateInfo{
+ Code: bytesToBytecode(fragShaderBytes),
+ })
+ if err != nil {
+ return err
+ }
+ defer fragShader.Destroy(nil)
+
+ _ = &core1_0.PipelineShaderStageCreateInfo{
+ Stage: core1_0.StageVertex,
+ Module: vertShader,
+ Name: "main",
+ }
+
+ _ = &core1_0.PipelineShaderStageCreateInfo{
+ Stage: core1_0.StageFragment,
+ Module: fragShader,
+ Name: "main",
+ }
+
return nil
}