Shader.cpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include "Shader.h"
  2. #include "libraries/glslang/glslang/Public/ShaderLang.h"
  3. #include "libraries/glslang/SPIRV/GlslangToSpv.h"
  4. #include <vector>
  5. namespace love {
  6. namespace graphics {
  7. namespace vulkan {
  8. static VkShaderStageFlagBits getStageBit(ShaderStageType type) {
  9. switch (type) {
  10. case SHADERSTAGE_VERTEX:
  11. return VK_SHADER_STAGE_VERTEX_BIT;
  12. case SHADERSTAGE_PIXEL:
  13. return VK_SHADER_STAGE_FRAGMENT_BIT;
  14. case SHADERSTAGE_COMPUTE:
  15. return VK_SHADER_STAGE_COMPUTE_BIT;
  16. }
  17. throw love::Exception("invalid type");
  18. }
  19. Shader::Shader(StrongRef<love::graphics::ShaderStage> stages[])
  20. : graphics::Shader(stages) {
  21. if (false) {
  22. for (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++) {
  23. if (!stages[i])
  24. continue;
  25. auto stage = dynamic_cast<ShaderStage*>(stages[i].get());
  26. VkPipelineShaderStageCreateInfo shaderStageInfo{};
  27. shaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
  28. shaderStageInfo.stage = getStageBit(stage->getStageType());
  29. shaderStageInfo.module = stage->getShaderModule();
  30. shaderStageInfo.pName = "main";
  31. shaderStages.push_back(shaderStageInfo);
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }