BsGLOcclusionQuery.cpp 1.5 KB

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