BsGLOcclusionQuery.cpp 1.9 KB

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