ShaderProgram.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Gr/ShaderProgram.h>
  6. #include <AnKi/Gr/gl/ShaderProgramImpl.h>
  7. #include <AnKi/Gr/gl/CommandBufferImpl.h>
  8. #include <AnKi/Gr/GrManager.h>
  9. #include <AnKi/Gr/Shader.h>
  10. namespace anki {
  11. ShaderProgram* ShaderProgram::newInstance(GrManager* manager, const ShaderProgramInitInfo& init)
  12. {
  13. class CreateCommand final : public GlCommand
  14. {
  15. public:
  16. ShaderProgramPtr m_prog;
  17. ShaderPtr m_vert;
  18. ShaderPtr m_tessc;
  19. ShaderPtr m_tesse;
  20. ShaderPtr m_geom;
  21. ShaderPtr m_frag;
  22. ShaderPtr m_comp;
  23. CreateCommand(ShaderProgram* prog, ShaderPtr vert, ShaderPtr tessc, ShaderPtr tesse, ShaderPtr geom,
  24. ShaderPtr frag, ShaderPtr comp)
  25. : m_prog(prog)
  26. , m_vert(vert)
  27. , m_tessc(tessc)
  28. , m_tesse(tesse)
  29. , m_geom(geom)
  30. , m_frag(frag)
  31. , m_comp(comp)
  32. {
  33. }
  34. Error operator()(GlState&)
  35. {
  36. if(m_comp)
  37. {
  38. return static_cast<ShaderProgramImpl&>(*m_prog).initCompute(m_comp);
  39. }
  40. else
  41. {
  42. return static_cast<ShaderProgramImpl&>(*m_prog).initGraphics(m_vert, m_tessc, m_tesse, m_geom, m_frag);
  43. }
  44. }
  45. };
  46. ANKI_ASSERT(init.isValid());
  47. ShaderProgramImpl* impl = manager->getAllocator().newInstance<ShaderProgramImpl>(manager, init.getName());
  48. impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
  49. CommandBufferPtr cmdb = manager->newCommandBuffer(CommandBufferInitInfo());
  50. static_cast<CommandBufferImpl&>(*cmdb).pushBackNewCommand<CreateCommand>(
  51. impl, init.m_shaders[ShaderType::kVertex], init.m_shaders[ShaderType::kTessellationControl],
  52. init.m_shaders[ShaderType::kTessellationEvaluation], init.m_shaders[ShaderType::kGeometry],
  53. init.m_shaders[ShaderType::kFragment], init.m_shaders[ShaderType::kCompute]);
  54. static_cast<CommandBufferImpl&>(*cmdb).flush();
  55. return impl;
  56. }
  57. } // end namespace anki