GLSLとSlangを分けた

テクニカル諏訪子 <suwako@076.moe>、2026-07-21 13:02
コミット 6b7ea3fc9c6f142797782d04b241c487a5bc1e45 ・親 f7ec533 ・ファイルを見る

8個のファイル、+150 -74

@@ -100,7 +100,7 @@
100100 <ClCompile>
101101 <WarningLevel>Level3</WarningLevel>
102102 <SDLCheck>true</SDLCheck>
103- <PreprocessorDefinitions>_DEBUG;_CONSOLE;USING_SLANG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
103+ <PreprocessorDefinitions>_DEBUG;_CONSOLE;USING_GLSL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
104104 <ConformanceMode>true</ConformanceMode>
105105 <AdditionalIncludeDirectories>$(SolutionDir)dep\include;$(VULKAN_SDK)\Include;$(ProjectDir)</AdditionalIncludeDirectories>
106106 <LanguageStandard>stdcpp20</LanguageStandard>
@@ -152,6 +152,7 @@
152152 <ClInclude Include="shader\glsl.hh" />
153153 <ClInclude Include="shader\slang.hh" />
154154 <ClInclude Include="util\file.hh" />
155+ <ClInclude Include="util\root.hh" />
155156 </ItemGroup>
156157 <ItemGroup>
157158 <None Include="shader.frag" />
@@ -50,6 +50,9 @@
5050 <ClInclude Include="util\file.hh">
5151 <Filter>Header Files\util</Filter>
5252 </ClInclude>
53+ <ClInclude Include="util\root.hh">
54+ <Filter>Header Files\util</Filter>
55+ </ClInclude>
5356 </ItemGroup>
5457 <ItemGroup>
5558 <None Include="shader.frag">
@@ -2,6 +2,8 @@
22
33 #pragma region headers
44 #include <util/file.hh>
5+#include <shader/slang.hh>
6+#include <shader/glsl.hh>
57
68 #include <iostream>
79 #include <map>
@@ -11,30 +13,8 @@
1113 #include <fstream>
1214 #include <cassert>
1315
14-#if defined(_WIN64)
15-#define VK_USE_PLATFORM_WIN32_KHR
16-#elif defined(__APPLE__)
17-#define VK_USE_PLATFORM_METAL_EXT
18-#else
19-#define VK_USE_PLATFORM_XCB_KHR
20-#endif
21-#define GLFW_INCLUDE_VULKAN
22-#include <GLFW/glfw3.h>
23-
24-#if defined(_WIN64)
25-#define GLFW_EXPOSE_NATIVE_WIN32
26-#elif defined(__APPLE__)
27-#define GLFW_EXPOSE_NATIVE_COCOA
28-#else
29-#define GLFW_EXPOSE_NATIVE_X11
30-#endif
31-#include <GLFW/glfw3native.h>
32-
33-#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1
34-#include <vulkan/vulkan.hpp>
35-
16+#include <util/root.hh>
3617 VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
37-#pragma endregion
3818
3919 std::vector<vk::Image> swapChainImages;
4020 vk::CommandBuffer cmdBuf;
@@ -430,52 +410,8 @@
430410 #pragma endregion
431411
432412 #pragma region gfxPipeline
433- //auto vertShader = readFile("vert.spv");
434- //if (vertShader.empty()) return -1;
435- //auto fragShader = readFile("frag.spv");
436- //if (fragShader.empty()) return -1;
437-
438- //vk::ShaderModuleCreateInfo vertCreateInfo = {};
439- //vertCreateInfo.codeSize = vertShader.size() * sizeof(char);
440- //vertCreateInfo.pCode = reinterpret_cast<const uint32_t *>(vertShader.data());
441- //vk::ShaderModule vertShaderModule = device.createShaderModule(vertCreateInfo);
442-
443- //vk::ShaderModuleCreateInfo fragCreateInfo = {};
444- //fragCreateInfo.codeSize = fragShader.size() * sizeof(char);
445- //fragCreateInfo.pCode = reinterpret_cast<const uint32_t *>(fragShader.data());
446- //vk::ShaderModule fragShaderModule = device.createShaderModule(fragCreateInfo);
447-
448- //vk::PipelineShaderStageCreateInfo vertShaderStageInfo = {};
449- //vertShaderStageInfo.stage = vk::ShaderStageFlagBits::eVertex;
450- //vertShaderStageInfo.module = vertShaderModule;
451- //vertShaderStageInfo.pName = "main";
452-
453- //vk::PipelineShaderStageCreateInfo fragShaderStageInfo = {};
454- //fragShaderStageInfo.stage = vk::ShaderStageFlagBits::eFragment;
455- //fragShaderStageInfo.module = fragShaderModule;
456- //fragShaderStageInfo.pName = "main";
457-
458- auto shader = readFile("slang.spv");
459-
460- vk::ShaderModuleCreateInfo info = {};
461- info.codeSize = shader.size();
462- info.pCode = reinterpret_cast<const uint32_t *>(shader.data());
463- vk::ShaderModule shaderModule = device.createShaderModule(info);
464-
465- vk::PipelineShaderStageCreateInfo vertShaderStageInfo = {};
466- vertShaderStageInfo.stage = vk::ShaderStageFlagBits::eVertex;
467- vertShaderStageInfo.module = shaderModule;
468- vertShaderStageInfo.pName = "vertMain";
469-
470- vk::PipelineShaderStageCreateInfo fragShaderStageInfo = {};
471- fragShaderStageInfo.stage = vk::ShaderStageFlagBits::eFragment;
472- fragShaderStageInfo.module = shaderModule;
473- fragShaderStageInfo.pName = "fragMain";
474-
475- vk::PipelineShaderStageCreateInfo shaderStages[] = {
476- vertShaderStageInfo,
477- fragShaderStageInfo,
478- };
413+ Shaders shader(&device);
414+ std::vector<vk::PipelineShaderStageCreateInfo> shaderStages = shader.GetShaderStages();
479415 #pragma endregion
480416
481417 #pragma region fixedFunctions
@@ -557,7 +493,7 @@
557493
558494 vk::GraphicsPipelineCreateInfo pipelineInfo = {};
559495 pipelineInfo.stageCount = 2;
560- pipelineInfo.pStages = shaderStages;
496+ pipelineInfo.pStages = shaderStages.data();
561497 pipelineInfo.pVertexInputState = &vertexInputInfo;
562498 pipelineInfo.pInputAssemblyState = &inputAss;
563499 pipelineInfo.pViewportState = &viewportState;
@@ -681,9 +617,7 @@
681617 if (cmdPool) device.destroyCommandPool(cmdPool);
682618 if (gfxPipeline) device.destroyPipeline(gfxPipeline);
683619 if (pipelineLayout) device.destroyPipelineLayout(pipelineLayout);
684- if (shaderModule) device.destroyShaderModule(shaderModule);
685- //if (fragShaderModule) device.destroyShaderModule(fragShaderModule);
686- //if (vertShaderModule) device.destroyShaderModule(vertShaderModule);
620+ shader.Finalize();
687621
688622 for (auto &view : swapChainImageViews) device.destroyImageView(view);
689623 swapChainImageViews.clear();
@@ -0,0 +1,37 @@
1+#ifdef USING_GLSL
2+#include <shader/glsl.hh>
3+#include <util/file.hh>
4+
5+Shaders::Shaders(vk::Device *device) : m_Device(device) {
6+ auto vertShader = readFile("vert.spv");
7+ auto fragShader = readFile("frag.spv");
8+
9+ vk::ShaderModuleCreateInfo vertCreateInfo = {};
10+ vertCreateInfo.codeSize = vertShader.size() * sizeof(char);
11+ vertCreateInfo.pCode = reinterpret_cast<const uint32_t *>(vertShader.data());
12+ m_VertShaderModule = m_Device->createShaderModule(vertCreateInfo);
13+
14+ vk::ShaderModuleCreateInfo fragCreateInfo = {};
15+ fragCreateInfo.codeSize = fragShader.size() * sizeof(char);
16+ fragCreateInfo.pCode = reinterpret_cast<const uint32_t *>(fragShader.data());
17+ m_FragShaderModule = m_Device->createShaderModule(fragCreateInfo);
18+
19+ vk::PipelineShaderStageCreateInfo vertShaderStageInfo = {};
20+ vertShaderStageInfo.stage = vk::ShaderStageFlagBits::eVertex;
21+ vertShaderStageInfo.module = m_VertShaderModule;
22+ vertShaderStageInfo.pName = "main";
23+
24+ vk::PipelineShaderStageCreateInfo fragShaderStageInfo = {};
25+ fragShaderStageInfo.stage = vk::ShaderStageFlagBits::eFragment;
26+ fragShaderStageInfo.module = m_FragShaderModule;
27+ fragShaderStageInfo.pName = "main";
28+
29+ m_ShaderStages.emplace_back(vertShaderStageInfo);
30+ m_ShaderStages.emplace_back(fragShaderStageInfo);
31+}
32+
33+void Shaders::Finalize() {
34+ if (m_FragShaderModule) m_Device->destroyShaderModule(m_FragShaderModule);
35+ if (m_VertShaderModule) m_Device->destroyShaderModule(m_VertShaderModule);
36+}
37+#endif // USING_GLSL
@@ -0,0 +1,24 @@
1+#pragma once
2+
3+#ifdef USING_GLSL
4+#include <util/root.hh>
5+#include <vector>
6+
7+class Shaders {
8+ public:
9+ Shaders(vk::Device *device);
10+ ~Shaders() {}
11+
12+ public:
13+ void Finalize();
14+
15+ public:
16+ const std::vector<vk::PipelineShaderStageCreateInfo> GetShaderStages() const { return m_ShaderStages; }
17+
18+ private:
19+ vk::Device *m_Device;
20+ std::vector<vk::PipelineShaderStageCreateInfo> m_ShaderStages;
21+ vk::ShaderModule m_VertShaderModule;
22+ vk::ShaderModule m_FragShaderModule;
23+}; // Shaders
24+#endif // USING_GLSL
@@ -0,0 +1,30 @@
1+#ifdef USING_SLANG
2+#include <shader/slang.hh>
3+#include <util/file.hh>
4+
5+Shaders::Shaders(vk::Device *device) : m_Device(device) {
6+ auto shader = readFile("slang.spv");
7+
8+ vk::ShaderModuleCreateInfo info = {};
9+ info.codeSize = shader.size();
10+ info.pCode = reinterpret_cast<const uint32_t *>(shader.data());
11+ m_ShaderModule = m_Device->createShaderModule(info);
12+
13+ vk::PipelineShaderStageCreateInfo vertShaderStageInfo = {};
14+ vertShaderStageInfo.stage = vk::ShaderStageFlagBits::eVertex;
15+ vertShaderStageInfo.module = m_ShaderModule;
16+ vertShaderStageInfo.pName = "vertMain";
17+
18+ vk::PipelineShaderStageCreateInfo fragShaderStageInfo = {};
19+ fragShaderStageInfo.stage = vk::ShaderStageFlagBits::eFragment;
20+ fragShaderStageInfo.module = m_ShaderModule;
21+ fragShaderStageInfo.pName = "fragMain";
22+
23+ m_ShaderStages.emplace_back(vertShaderStageInfo);
24+ m_ShaderStages.emplace_back(fragShaderStageInfo);
25+}
26+
27+void Shaders::Finalize() {
28+ if (m_ShaderModule) m_Device->destroyShaderModule(m_ShaderModule);
29+}
30+#endif // USING_SLANG
@@ -0,0 +1,23 @@
1+#pragma once
2+
3+#ifdef USING_SLANG
4+#include <util/root.hh>
5+#include <vector>
6+
7+class Shaders {
8+ public:
9+ Shaders(vk::Device *device);
10+ ~Shaders() {}
11+
12+ public:
13+ void Finalize();
14+
15+ public:
16+ const std::vector<vk::PipelineShaderStageCreateInfo> GetShaderStages() const { return m_ShaderStages; }
17+
18+ private:
19+ vk::Device *m_Device;
20+ std::vector<vk::PipelineShaderStageCreateInfo> m_ShaderStages;
21+ vk::ShaderModule m_ShaderModule;
22+}; // Shaders
23+#endif // USING_SLANG
@@ -0,0 +1,24 @@
1+#pragma once
2+
3+#if defined(_WIN64)
4+#define VK_USE_PLATFORM_WIN32_KHR
5+#elif defined(__APPLE__)
6+#define VK_USE_PLATFORM_METAL_EXT
7+#else
8+#define VK_USE_PLATFORM_XCB_KHR
9+#endif
10+#define GLFW_INCLUDE_VULKAN
11+#include <GLFW/glfw3.h>
12+
13+#if defined(_WIN64)
14+#define GLFW_EXPOSE_NATIVE_WIN32
15+#elif defined(__APPLE__)
16+#define GLFW_EXPOSE_NATIVE_COCOA
17+#else
18+#define GLFW_EXPOSE_NATIVE_X11
19+#endif
20+#include <GLFW/glfw3native.h>
21+
22+#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1
23+#include <vulkan/vulkan.hpp>
24+#pragma endregion