2
0

BsGLOcclusionQuery.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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),
  10. mNumSamples(0), mFinalized(false), mEndIssued(false)
  11. {
  12. glGenQueries(1, &mQueryObj);
  13. BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_Query);
  14. }
  15. GLOcclusionQuery::~GLOcclusionQuery()
  16. {
  17. glDeleteQueries(1, &mQueryObj);
  18. BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_Query);
  19. }
  20. void GLOcclusionQuery::begin()
  21. {
  22. glBeginQuery(mBinary ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED, mQueryObj);
  23. mNumSamples = 0;
  24. mEndIssued = false;
  25. setActive(true);
  26. }
  27. void GLOcclusionQuery::end()
  28. {
  29. glEndQuery(mBinary ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED);
  30. mEndIssued = true;
  31. mFinalized = false;
  32. }
  33. bool GLOcclusionQuery::isReady() const
  34. {
  35. if (!mEndIssued)
  36. return false;
  37. GLint done = 0;
  38. glGetQueryObjectiv(mQueryObj, GL_QUERY_RESULT_AVAILABLE, &done);
  39. return done == GL_TRUE;
  40. }
  41. UINT32 GLOcclusionQuery::getNumSamples()
  42. {
  43. if (!mFinalized && isReady())
  44. {
  45. finalize();
  46. }
  47. return mNumSamples;
  48. }
  49. void GLOcclusionQuery::finalize()
  50. {
  51. mFinalized = true;
  52. if (mBinary)
  53. {
  54. GLboolean anyPassed = GL_FALSE;
  55. glGetQueryObjectuiv(mQueryObj, GL_QUERY_RESULT_ARB, (GLuint*)&anyPassed);
  56. mNumSamples = anyPassed == GL_TRUE ? 1 : 0;
  57. }
  58. else
  59. {
  60. GLuint numSamples = 0;
  61. glGetQueryObjectuiv(mQueryObj, GL_QUERY_RESULT_ARB, (GLuint*)&numSamples);
  62. mNumSamples = (UINT32)numSamples;
  63. }
  64. }
  65. }