shader_program.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. //
  2. // shader_program.cpp
  3. // graphics
  4. //
  5. // Created by Sam Jaffe on 7/5/16.
  6. //
  7. #include "game/graphics/shader_program.hpp"
  8. #include <unordered_map>
  9. #include <utility>
  10. #include "game/graphics/shader.hpp"
  11. #include "helper.hpp"
  12. using namespace graphics;
  13. namespace {
  14. using key_t = std::pair<std::string, std::string>;
  15. std::unordered_map<key_t, flyweight<shader_program>> g_shader_programs;
  16. }
  17. flyweight<shader_program> shader_program::create(std::string const & frag,
  18. std::string const & vert) {
  19. auto key = std::make_pair(frag, vert);
  20. auto found = g_shader_programs.find(key);
  21. if (found != g_shader_programs.end()) { return found->second; }
  22. auto fragment_shader = shader::create(shaders::type::FRAGMENT, frag);
  23. auto vertex_shader = shader::create(shaders::type::VERTEX, vert);
  24. shader_program prog{shaders::init(fragment_shader, vertex_shader),
  25. fragment_shader, vertex_shader};
  26. return g_shader_programs.emplace(key, std::move(prog)).first->second;
  27. }
  28. shader_program::shader_program(unsigned int id, flyweight<shader> frag,
  29. flyweight<shader> vert)
  30. : identity<shader_program>(id), fragment_shader(frag), vertex_shader(vert) {
  31. }
  32. void shader_program::activate() const { shaders::activate(id); }