Shader.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "Shader.h"
  2. #include <vector>
  3. namespace love {
  4. namespace graphics {
  5. namespace vulkan {
  6. static VkShaderStageFlagBits getStageBit(ShaderStageType type) {
  7. switch (type) {
  8. case SHADERSTAGE_VERTEX:
  9. return VK_SHADER_STAGE_VERTEX_BIT;
  10. case SHADERSTAGE_PIXEL:
  11. return VK_SHADER_STAGE_FRAGMENT_BIT;
  12. case SHADERSTAGE_COMPUTE:
  13. return VK_SHADER_STAGE_COMPUTE_BIT;
  14. }
  15. throw love::Exception("invalid type");
  16. }
  17. Shader::Shader(StrongRef<love::graphics::ShaderStage> stages[])
  18. : graphics::Shader(stages) {
  19. for (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++) {
  20. if (!stages[i])
  21. continue;
  22. auto stage = dynamic_cast<ShaderStage*>(stages[i].get());
  23. VkPipelineShaderStageCreateInfo shaderStageInfo{};
  24. shaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
  25. shaderStageInfo.stage = getStageBit(stage->getStageType());
  26. shaderStageInfo.module = stage->getShaderModule();
  27. shaderStageInfo.pName = "main";
  28. shaderStages.push_back(shaderStageInfo);
  29. }
  30. }
  31. void Shader::attach() {
  32. if (Shader::current != this) {
  33. Graphics::flushBatchedDrawsGlobal();
  34. Shader::current = this;
  35. Vulkan::shaderSwitch();
  36. }
  37. }
  38. int Shader::getVertexAttributeIndex(const std::string& name) {
  39. return vertexAttributeIndices.at(name);
  40. }
  41. }
  42. }
  43. }