BoundingBox.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // Copyright 2014 Dolphin Emulator Project
  2. // Licensed under GPLv2+
  3. // Refer to the license.txt file included.
  4. #include "VideoBackends/OGL/BoundingBox.h"
  5. #include "VideoBackends/OGL/GLUtil.h"
  6. #include "VideoCommon/VideoConfig.h"
  7. static GLuint s_bbox_buffer_id;
  8. namespace OGL
  9. {
  10. void BoundingBox::Init()
  11. {
  12. if (g_ActiveConfig.backend_info.bSupportsBBox)
  13. {
  14. int initial_values[4] = {0,0,0,0};
  15. glGenBuffers(1, &s_bbox_buffer_id);
  16. glBindBuffer(GL_SHADER_STORAGE_BUFFER, s_bbox_buffer_id);
  17. glBufferData(GL_SHADER_STORAGE_BUFFER, 4 * sizeof(s32), initial_values, GL_DYNAMIC_DRAW);
  18. glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, s_bbox_buffer_id);
  19. }
  20. }
  21. void BoundingBox::Shutdown()
  22. {
  23. if (g_ActiveConfig.backend_info.bSupportsBBox)
  24. glDeleteBuffers(1, &s_bbox_buffer_id);
  25. }
  26. void BoundingBox::Set(int index, int value)
  27. {
  28. glBindBuffer(GL_SHADER_STORAGE_BUFFER, s_bbox_buffer_id);
  29. glBufferSubData(GL_SHADER_STORAGE_BUFFER, index * sizeof(int), sizeof(int), &value);
  30. glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
  31. }
  32. int BoundingBox::Get(int index)
  33. {
  34. int data = 0;
  35. glBindBuffer(GL_SHADER_STORAGE_BUFFER, s_bbox_buffer_id);
  36. void* ptr = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, index * sizeof(int), sizeof(int), GL_MAP_READ_BIT);
  37. if (ptr)
  38. {
  39. data = *(int*)ptr;
  40. glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
  41. }
  42. glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
  43. return data;
  44. }
  45. };