GlShaderHandle.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright (C) 2014, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include "anki/gl/GlShaderHandle.h"
  6. #include "anki/gl/GlDevice.h"
  7. #include "anki/gl/GlClientBufferHandle.h"
  8. #include "anki/gl/GlHandleDeferredDeleter.h"
  9. #include "anki/gl/GlShader.h"
  10. namespace anki {
  11. //==============================================================================
  12. /// Create program command
  13. class GlShaderCreateCommand: public GlCommand
  14. {
  15. public:
  16. GlShaderHandle m_shader;
  17. GLenum m_type;
  18. GlClientBufferHandle m_source;
  19. GlShaderCreateCommand(GlShaderHandle shader,
  20. GLenum type, GlClientBufferHandle source)
  21. : m_shader(shader),
  22. m_type(type),
  23. m_source(source)
  24. {}
  25. Error operator()(GlCommandBuffer* commands)
  26. {
  27. Error err = m_shader._get().create(m_type,
  28. reinterpret_cast<const char*>(m_source.getBaseAddress()),
  29. commands->getQueue().getDevice()._getAllocator(),
  30. commands->getQueue().getDevice()._getCacheDirectory());
  31. GlHandleState oldState = m_shader._setState(
  32. (err) ? GlHandleState::ERROR : GlHandleState::CREATED);
  33. ANKI_ASSERT(oldState == GlHandleState::TO_BE_CREATED);
  34. (void)oldState;
  35. return err;
  36. }
  37. };
  38. //==============================================================================
  39. GlShaderHandle::GlShaderHandle()
  40. {}
  41. //==============================================================================
  42. GlShaderHandle::~GlShaderHandle()
  43. {}
  44. //==============================================================================
  45. Error GlShaderHandle::create(GlCommandBufferHandle& commands,
  46. GLenum type, const GlClientBufferHandle& source)
  47. {
  48. using Alloc = GlAllocator<GlShader>;
  49. using DeleteCommand = GlDeleteObjectCommand<GlShader, Alloc>;
  50. using Deleter = GlHandleDeferredDeleter<GlShader, Alloc, DeleteCommand>;
  51. Error err = _createAdvanced(
  52. &commands._get().getQueue().getDevice(),
  53. commands._get().getGlobalAllocator(),
  54. Deleter());
  55. if(!err)
  56. {
  57. _setState(GlHandleState::TO_BE_CREATED);
  58. commands._pushBackNewCommand<GlShaderCreateCommand>(
  59. *this, type, source);
  60. }
  61. return err;
  62. }
  63. //==============================================================================
  64. GLenum GlShaderHandle::getType() const
  65. {
  66. return (serializeOnGetter()) ? GL_NONE : _get().getType();
  67. }
  68. //==============================================================================
  69. const GlProgramVariable* GlShaderHandle::getVariablesBegin() const
  70. {
  71. Error err = serializeOnGetter();
  72. const GlProgramVariable* out = nullptr;
  73. if(!err && _get().getVariables().getSize() != 0)
  74. {
  75. out = _get().getVariables().begin();
  76. }
  77. return out;
  78. }
  79. //==============================================================================
  80. const GlProgramVariable* GlShaderHandle::getVariablesEnd() const
  81. {
  82. Error err = serializeOnGetter();
  83. const GlProgramVariable* out = nullptr;
  84. if(!err && _get().getVariables().getSize() != 0)
  85. {
  86. out = _get().getVariables().end();
  87. }
  88. return out;
  89. }
  90. //==============================================================================
  91. const GlProgramVariable*
  92. GlShaderHandle::tryFindVariable(const CString& name) const
  93. {
  94. return (serializeOnGetter()) ? nullptr : _get().tryFindVariable(name);
  95. }
  96. //==============================================================================
  97. const GlProgramBlock* GlShaderHandle::tryFindBlock(const CString& name) const
  98. {
  99. return (serializeOnGetter()) ? nullptr : _get().tryFindBlock(name);
  100. }
  101. } // end namespace anki