CmGLGpuParamBlock.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "CmGLGpuParamBlock.h"
  2. namespace CamelotEngine
  3. {
  4. GLGpuParamBlock::GLGpuParamBlock(const GpuParamBlockDesc& desc)
  5. :GpuParamBlockBuffer(desc), mGLSharedData(nullptr)
  6. {
  7. mGLSharedData = new GLGpuParamBlockSharedData();
  8. }
  9. GLGpuParamBlock::~GLGpuParamBlock()
  10. {
  11. if(mOwnsSharedData)
  12. {
  13. glDeleteBuffers(1, &mGLSharedData->mGLHandle);
  14. delete mGLSharedData;
  15. }
  16. }
  17. void GLGpuParamBlock::updateIfDirty()
  18. {
  19. if(!sharedData->mInitialized)
  20. {
  21. glGenBuffers(1, &mGLSharedData->mGLHandle);
  22. glBindBuffer(GL_UNIFORM_BUFFER, mGLSharedData->mGLHandle);
  23. glBufferData(GL_UNIFORM_BUFFER, mSize, (GLvoid*)mData, GL_DYNAMIC_DRAW);
  24. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  25. sharedData->mInitialized = true;
  26. }
  27. if(sharedData->mDirty)
  28. {
  29. glBindBuffer(GL_UNIFORM_BUFFER, mGLSharedData->mGLHandle);
  30. glBufferSubData(GL_UNIFORM_BUFFER, 0 , mSize, mData);
  31. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  32. }
  33. GpuParamBlockBuffer::updateIfDirty();
  34. }
  35. GpuParamBlockBufferPtr GLGpuParamBlock::clone() const
  36. {
  37. std::shared_ptr<GLGpuParamBlock> clonedParamBlock(new GLGpuParamBlock(*this));
  38. clonedParamBlock->mData = new UINT8[mSize];
  39. clonedParamBlock->mOwnsSharedData = false;
  40. clonedParamBlock->mGLSharedData = mGLSharedData;
  41. memcpy(clonedParamBlock->mData, mData, mSize);
  42. return clonedParamBlock;
  43. }
  44. }