BsGLGpuParamBlockBuffer.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "BsGLGpuParamBlockBuffer.h"
  2. #include "BsRenderStats.h"
  3. #include "BsException.h"
  4. namespace BansheeEngine
  5. {
  6. GLGpuParamBlockBufferCore::GLGpuParamBlockBufferCore(UINT32 size, GpuParamBlockUsage usage)
  7. :GpuParamBlockBufferCore(size, usage), mGLHandle(0)
  8. {
  9. }
  10. void GLGpuParamBlockBufferCore::initialize()
  11. {
  12. glGenBuffers(1, &mGLHandle);
  13. glBindBuffer(GL_UNIFORM_BUFFER, mGLHandle);
  14. if(mUsage == GPBU_STATIC)
  15. glBufferData(GL_UNIFORM_BUFFER, mSize, nullptr, GL_STATIC_DRAW);
  16. else if(mUsage == GPBU_DYNAMIC)
  17. glBufferData(GL_UNIFORM_BUFFER, mSize, nullptr, GL_DYNAMIC_DRAW);
  18. else
  19. BS_EXCEPT(InternalErrorException, "Invalid gpu param block usage.");
  20. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  21. BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_GpuParamBuffer);
  22. GpuParamBlockBufferCore::initialize();
  23. }
  24. void GLGpuParamBlockBufferCore::destroy()
  25. {
  26. glDeleteBuffers(1, &mGLHandle);
  27. BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_GpuParamBuffer);
  28. GpuParamBlockBufferCore::destroy();
  29. }
  30. void GLGpuParamBlockBufferCore::writeData(const UINT8* data)
  31. {
  32. glBindBuffer(GL_UNIFORM_BUFFER, mGLHandle);
  33. glBufferSubData(GL_UNIFORM_BUFFER, 0 , mSize, data);
  34. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  35. BS_INC_RENDER_STAT_CAT(ResWrite, RenderStatObject_GpuParamBuffer);
  36. }
  37. void GLGpuParamBlockBufferCore::readData(UINT8* data) const
  38. {
  39. glBindBuffer(GL_UNIFORM_BUFFER, mGLHandle);
  40. glGetBufferSubData(GL_UNIFORM_BUFFER, 0 , mSize, (GLvoid*)data);
  41. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  42. BS_INC_RENDER_STAT_CAT(ResRead, RenderStatObject_GpuParamBuffer);
  43. }
  44. }