ShaderProgram.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Copyright (C) 2009-2021, 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. {
  12. ShaderProgram* ShaderProgram::newInstance(GrManager* manager, const ShaderProgramInitInfo& init)
  13. {
  14. class CreateCommand final : public GlCommand
  15. {
  16. public:
  17. ShaderProgramPtr m_prog;
  18. ShaderPtr m_vert;
  19. ShaderPtr m_tessc;
  20. ShaderPtr m_tesse;
  21. ShaderPtr m_geom;
  22. ShaderPtr m_frag;
  23. ShaderPtr m_comp;
  24. CreateCommand(ShaderProgram* prog, ShaderPtr vert, ShaderPtr tessc, ShaderPtr tesse, ShaderPtr geom,
  25. ShaderPtr frag, ShaderPtr comp)
  26. : m_prog(prog)
  27. , m_vert(vert)
  28. , m_tessc(tessc)
  29. , m_tesse(tesse)
  30. , m_geom(geom)
  31. , m_frag(frag)
  32. , m_comp(comp)
  33. {
  34. }
  35. Error operator()(GlState&)
  36. {
  37. if(m_comp)
  38. {
  39. return static_cast<ShaderProgramImpl&>(*m_prog).initCompute(m_comp);
  40. }
  41. else
  42. {
  43. return static_cast<ShaderProgramImpl&>(*m_prog).initGraphics(m_vert, m_tessc, m_tesse, m_geom, m_frag);
  44. }
  45. }
  46. };
  47. ANKI_ASSERT(init.isValid());
  48. ShaderProgramImpl* impl = manager->getAllocator().newInstance<ShaderProgramImpl>(manager, init.getName());
  49. impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
  50. CommandBufferPtr cmdb = manager->newCommandBuffer(CommandBufferInitInfo());
  51. static_cast<CommandBufferImpl&>(*cmdb).pushBackNewCommand<CreateCommand>(
  52. impl, init.m_shaders[ShaderType::VERTEX], init.m_shaders[ShaderType::TESSELLATION_CONTROL],
  53. init.m_shaders[ShaderType::TESSELLATION_EVALUATION], init.m_shaders[ShaderType::GEOMETRY],
  54. init.m_shaders[ShaderType::FRAGMENT], init.m_shaders[ShaderType::COMPUTE]);
  55. static_cast<CommandBufferImpl&>(*cmdb).flush();
  56. return impl;
  57. }
  58. } // end namespace anki