BsGLOcclusionQuery.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "BsGLOcclusionQuery.h"
  2. #include "BsMath.h"
  3. namespace BansheeEngine
  4. {
  5. GLOcclusionQuery::GLOcclusionQuery(bool binary)
  6. :OcclusionQuery(binary), mQueryObj(0), mNumSamples(0), mFinalized(false)
  7. {
  8. glGenQueries(1, &mQueryObj);
  9. }
  10. GLOcclusionQuery::~GLOcclusionQuery()
  11. {
  12. glDeleteQueries(1, &mQueryObj);
  13. }
  14. void GLOcclusionQuery::begin()
  15. {
  16. glBeginQuery(mBinary ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED, mQueryObj);
  17. mNumSamples = 0;
  18. setActive(true);
  19. }
  20. void GLOcclusionQuery::end()
  21. {
  22. glEndQuery(mBinary ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED);
  23. }
  24. bool GLOcclusionQuery::isReady() const
  25. {
  26. GLint done = 0;
  27. glGetQueryObjectiv(mQueryObj, GL_QUERY_RESULT_AVAILABLE, &done);
  28. return done == GL_TRUE;
  29. }
  30. UINT32 GLOcclusionQuery::getNumSamples()
  31. {
  32. if (!mFinalized && isReady())
  33. {
  34. finalize();
  35. }
  36. return mNumSamples;
  37. }
  38. void GLOcclusionQuery::finalize()
  39. {
  40. mFinalized = true;
  41. if (mBinary)
  42. {
  43. GLboolean anyPassed = GL_FALSE;
  44. glGetQueryObjectuiv(mQueryObj, GL_QUERY_RESULT_ARB, (GLuint*)&anyPassed);
  45. mNumSamples = anyPassed == GL_TRUE ? 1 : 0;
  46. }
  47. else
  48. {
  49. GLuint numSamples = 0;
  50. glGetQueryObjectuiv(mQueryObj, GL_QUERY_RESULT_ARB, (GLuint*)&numSamples);
  51. mNumSamples = (UINT32)numSamples;
  52. }
  53. }
  54. }