BsGLOcclusionQuery.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsGLOcclusionQuery.h"
  4. #include "BsMath.h"
  5. #include "BsRenderStats.h"
  6. namespace BansheeEngine
  7. {
  8. GLOcclusionQuery::GLOcclusionQuery(bool binary)
  9. :OcclusionQuery(binary), mQueryObj(0), mFinalized(false), mEndIssued(false), mNumSamples(0)
  10. {
  11. glGenQueries(1, &mQueryObj);
  12. BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_Query);
  13. }
  14. GLOcclusionQuery::~GLOcclusionQuery()
  15. {
  16. glDeleteQueries(1, &mQueryObj);
  17. BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_Query);
  18. }
  19. void GLOcclusionQuery::begin()
  20. {
  21. glBeginQuery(mBinary ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED, mQueryObj);
  22. mNumSamples = 0;
  23. mEndIssued = false;
  24. setActive(true);
  25. }
  26. void GLOcclusionQuery::end()
  27. {
  28. glEndQuery(mBinary ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED);
  29. mEndIssued = true;
  30. mFinalized = false;
  31. }
  32. bool GLOcclusionQuery::isReady() const
  33. {
  34. if (!mEndIssued)
  35. return false;
  36. GLint done = 0;
  37. glGetQueryObjectiv(mQueryObj, GL_QUERY_RESULT_AVAILABLE, &done);
  38. return done == GL_TRUE;
  39. }
  40. UINT32 GLOcclusionQuery::getNumSamples()
  41. {
  42. if (!mFinalized && isReady())
  43. {
  44. finalize();
  45. }
  46. return mNumSamples;
  47. }
  48. void GLOcclusionQuery::finalize()
  49. {
  50. mFinalized = true;
  51. if (mBinary)
  52. {
  53. GLboolean anyPassed = GL_FALSE;
  54. glGetQueryObjectuiv(mQueryObj, GL_QUERY_RESULT_ARB, (GLuint*)&anyPassed);
  55. mNumSamples = anyPassed == GL_TRUE ? 1 : 0;
  56. }
  57. else
  58. {
  59. GLuint numSamples = 0;
  60. glGetQueryObjectuiv(mQueryObj, GL_QUERY_RESULT_ARB, (GLuint*)&numSamples);
  61. mNumSamples = (UINT32)numSamples;
  62. }
  63. }
  64. }