BsGLGpuParamBlockBuffer.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsGLGpuParamBlockBuffer.h"
  4. #include "Profiling/BsRenderStats.h"
  5. #include "Error/BsException.h"
  6. namespace bs { namespace ct
  7. {
  8. GLGpuParamBlockBuffer::GLGpuParamBlockBuffer(UINT32 size, GpuParamBlockUsage usage, GpuDeviceFlags deviceMask)
  9. :GpuParamBlockBuffer(size, usage, deviceMask), mGLHandle(0)
  10. {
  11. assert((deviceMask == GDF_DEFAULT || deviceMask == GDF_PRIMARY) && "Multiple GPUs not supported natively on OpenGL.");
  12. }
  13. GLGpuParamBlockBuffer::~GLGpuParamBlockBuffer()
  14. {
  15. glDeleteBuffers(1, &mGLHandle);
  16. BS_CHECK_GL_ERROR();
  17. BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_GpuParamBuffer);
  18. }
  19. void GLGpuParamBlockBuffer::initialize()
  20. {
  21. glGenBuffers(1, &mGLHandle);
  22. BS_CHECK_GL_ERROR();
  23. glBindBuffer(GL_UNIFORM_BUFFER, mGLHandle);
  24. BS_CHECK_GL_ERROR();
  25. if (mUsage == GPBU_STATIC)
  26. {
  27. glBufferData(GL_UNIFORM_BUFFER, mSize, nullptr, GL_STATIC_DRAW);
  28. BS_CHECK_GL_ERROR();
  29. }
  30. else if (mUsage == GPBU_DYNAMIC)
  31. {
  32. glBufferData(GL_UNIFORM_BUFFER, mSize, nullptr, GL_DYNAMIC_DRAW);
  33. BS_CHECK_GL_ERROR();
  34. }
  35. else
  36. BS_EXCEPT(InternalErrorException, "Invalid gpu param block usage.");
  37. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  38. BS_CHECK_GL_ERROR();
  39. BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_GpuParamBuffer);
  40. GpuParamBlockBuffer::initialize();
  41. }
  42. void GLGpuParamBlockBuffer::writeToGPU(const UINT8* data, UINT32 queueIdx)
  43. {
  44. glBindBuffer(GL_UNIFORM_BUFFER, mGLHandle);
  45. BS_CHECK_GL_ERROR();
  46. glBufferSubData(GL_UNIFORM_BUFFER, 0 , mSize, data);
  47. BS_CHECK_GL_ERROR();
  48. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  49. BS_CHECK_GL_ERROR();
  50. BS_INC_RENDER_STAT_CAT(ResWrite, RenderStatObject_GpuParamBuffer);
  51. }
  52. }}