GLSLとSlangを分けた
テクニカル諏訪子 <suwako@076.moe>、2026-07-21 13:02
コミット 6b7ea3fc9c6f142797782d04b241c487a5bc1e45
・親 f7ec533
・ファイルを見る
8個のファイル、+150 -74
| @@ -100,7 +100,7 @@ | ||
| 100 | 100 | <ClCompile> |
| 101 | 101 | <WarningLevel>Level3</WarningLevel> |
| 102 | 102 | <SDLCheck>true</SDLCheck> |
| 103 | - <PreprocessorDefinitions>_DEBUG;_CONSOLE;USING_SLANG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |
| 103 | + <PreprocessorDefinitions>_DEBUG;_CONSOLE;USING_GLSL;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |
| 104 | 104 | <ConformanceMode>true</ConformanceMode> |
| 105 | 105 | <AdditionalIncludeDirectories>$(SolutionDir)dep\include;$(VULKAN_SDK)\Include;$(ProjectDir)</AdditionalIncludeDirectories> |
| 106 | 106 | <LanguageStandard>stdcpp20</LanguageStandard> |
| @@ -152,6 +152,7 @@ | ||
| 152 | 152 | <ClInclude Include="shader\glsl.hh" /> |
| 153 | 153 | <ClInclude Include="shader\slang.hh" /> |
| 154 | 154 | <ClInclude Include="util\file.hh" /> |
| 155 | + <ClInclude Include="util\root.hh" /> | |
| 155 | 156 | </ItemGroup> |
| 156 | 157 | <ItemGroup> |
| 157 | 158 | <None Include="shader.frag" /> |
| @@ -50,6 +50,9 @@ | ||
| 50 | 50 | <ClInclude Include="util\file.hh"> |
| 51 | 51 | <Filter>Header Files\util</Filter> |
| 52 | 52 | </ClInclude> |
| 53 | + <ClInclude Include="util\root.hh"> | |
| 54 | + <Filter>Header Files\util</Filter> | |
| 55 | + </ClInclude> | |
| 53 | 56 | </ItemGroup> |
| 54 | 57 | <ItemGroup> |
| 55 | 58 | <None Include="shader.frag"> |
| @@ -2,6 +2,8 @@ | ||
| 2 | 2 | |
| 3 | 3 | #pragma region headers |
| 4 | 4 | #include <util/file.hh> |
| 5 | +#include <shader/slang.hh> | |
| 6 | +#include <shader/glsl.hh> | |
| 5 | 7 | |
| 6 | 8 | #include <iostream> |
| 7 | 9 | #include <map> |
| @@ -11,30 +13,8 @@ | ||
| 11 | 13 | #include <fstream> |
| 12 | 14 | #include <cassert> |
| 13 | 15 | |
| 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> | |
| 36 | 17 | VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE |
| 37 | -#pragma endregion | |
| 38 | 18 | |
| 39 | 19 | std::vector<vk::Image> swapChainImages; |
| 40 | 20 | vk::CommandBuffer cmdBuf; |
| @@ -430,52 +410,8 @@ | ||
| 430 | 410 | #pragma endregion |
| 431 | 411 | |
| 432 | 412 | #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(); | |
| 479 | 415 | #pragma endregion |
| 480 | 416 | |
| 481 | 417 | #pragma region fixedFunctions |
| @@ -557,7 +493,7 @@ | ||
| 557 | 493 | |
| 558 | 494 | vk::GraphicsPipelineCreateInfo pipelineInfo = {}; |
| 559 | 495 | pipelineInfo.stageCount = 2; |
| 560 | - pipelineInfo.pStages = shaderStages; | |
| 496 | + pipelineInfo.pStages = shaderStages.data(); | |
| 561 | 497 | pipelineInfo.pVertexInputState = &vertexInputInfo; |
| 562 | 498 | pipelineInfo.pInputAssemblyState = &inputAss; |
| 563 | 499 | pipelineInfo.pViewportState = &viewportState; |
| @@ -681,9 +617,7 @@ | ||
| 681 | 617 | if (cmdPool) device.destroyCommandPool(cmdPool); |
| 682 | 618 | if (gfxPipeline) device.destroyPipeline(gfxPipeline); |
| 683 | 619 | 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(); | |
| 687 | 621 | |
| 688 | 622 | for (auto &view : swapChainImageViews) device.destroyImageView(view); |
| 689 | 623 | 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 |