CmGLGpuParamBlock.cpp 1.6 KB

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