ShaderHandle.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright (C) 2009-2015, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include "anki/gr/ShaderHandle.h"
  6. #include "anki/gr/GrManager.h"
  7. #include "anki/gr/gl/DeferredDeleter.h"
  8. #include "anki/gr/gl/ShaderImpl.h"
  9. namespace anki {
  10. //==============================================================================
  11. // Commands =
  12. //==============================================================================
  13. /// Create program command
  14. class ShaderCreateCommand final: public GlCommand
  15. {
  16. public:
  17. ShaderHandle m_shader;
  18. GLenum m_type;
  19. const char* m_source;
  20. ShaderCreateCommand(ShaderHandle shader,
  21. GLenum type, const char* source)
  22. : m_shader(shader),
  23. m_type(type),
  24. m_source(source)
  25. {}
  26. Error operator()(CommandBufferImpl* commands)
  27. {
  28. Error err = m_shader.get().create(m_type,
  29. static_cast<const char*>(m_source));
  30. GlObject::State oldState = m_shader.get().setStateAtomically(
  31. (err) ? GlObject::State::ERROR : GlObject::State::CREATED);
  32. ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
  33. (void)oldState;
  34. return err;
  35. }
  36. };
  37. //==============================================================================
  38. // ShaderHandle =
  39. //==============================================================================
  40. //==============================================================================
  41. ShaderHandle::ShaderHandle()
  42. {}
  43. //==============================================================================
  44. ShaderHandle::~ShaderHandle()
  45. {}
  46. //==============================================================================
  47. Error ShaderHandle::create(CommandBufferHandle& commands,
  48. GLenum type, const void* source, PtrSize sourceSize)
  49. {
  50. ANKI_ASSERT(strlen(source) == sourceSize + 1);
  51. using DeleteCommand = DeleteObjectCommand<ShaderImpl>;
  52. using Deleter = DeferredDeleter<ShaderImpl, DeleteCommand>;
  53. Error err = Base::create(commands.get().getManager(), Deleter());
  54. if(!err)
  55. {
  56. get().setStateAtomically(GlObject::State::TO_BE_CREATED);
  57. // Copy source to the command buffer
  58. void* src = commands.get().getInternalAllocator().newArray<char>(
  59. sourceSize);
  60. memcpy(src, source, sourceSize);
  61. commands.get().pushBackNewCommand<ShaderCreateCommand>(
  62. *this, type, static_cast<char*>(src));
  63. }
  64. return err;
  65. }
  66. //==============================================================================
  67. GLenum ShaderHandle::getType() const
  68. {
  69. return (get().serializeOnGetter()) ? GL_NONE : get().getType();
  70. }
  71. } // end namespace anki