GraphicsStateTracker.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Gr/BackendCommon/GraphicsStateTracker.h>
  6. namespace anki {
  7. Bool GraphicsStateTracker::updateHashes()
  8. {
  9. Bool someHashWasDirty = false;
  10. if(m_hashes.m_vert == 0)
  11. {
  12. if(!!m_staticState.m_vert.m_activeAttribs)
  13. {
  14. m_hashes.m_vert = 0xC0FEE;
  15. for(const VertexAttributeSemantic i :
  16. EnumBitsIterable<VertexAttributeSemantic, VertexAttributeSemanticBit>(m_staticState.m_vert.m_activeAttribs))
  17. {
  18. ANKI_ASSERT(!!(m_staticState.m_vert.m_attribsSetMask & VertexAttributeSemanticBit(1 << i)) && "Forgot to set the vert attribute");
  19. m_hashes.m_vert = appendObjectHash(m_staticState.m_vert.m_attribs[i], m_hashes.m_vert);
  20. ANKI_ASSERT(m_staticState.m_vert.m_bindingsSetMask.get(m_staticState.m_vert.m_attribs[i].m_binding)
  21. && "Forgot to inform about the vert binding");
  22. m_hashes.m_vert = appendObjectHash(m_staticState.m_vert.m_bindings[m_staticState.m_vert.m_attribs[i].m_binding], m_hashes.m_vert);
  23. }
  24. }
  25. else
  26. {
  27. m_hashes.m_vert = 0xC0FEE;
  28. }
  29. someHashWasDirty = true;
  30. }
  31. if(m_hashes.m_rast == 0)
  32. {
  33. static_assert(sizeof(m_staticState.m_rast) < kMaxU64);
  34. memcpy(&m_hashes.m_rast, &m_staticState.m_rast, sizeof(m_staticState.m_rast));
  35. ++m_hashes.m_rast; // Because m_staticState.m_rast may be zero
  36. someHashWasDirty = true;
  37. }
  38. if(m_hashes.m_ia == 0)
  39. {
  40. static_assert(sizeof(m_staticState.m_ia) < kMaxU64);
  41. memcpy(&m_hashes.m_ia, &m_staticState.m_ia, sizeof(m_staticState.m_ia));
  42. ++m_hashes.m_ia; // Because m_staticState.m_ia may be zero
  43. someHashWasDirty = true;
  44. }
  45. if(m_hashes.m_depthStencil == 0)
  46. {
  47. const Bool hasStencil =
  48. m_staticState.m_misc.m_depthStencilFormat != Format::kNone && getFormatInfo(m_staticState.m_misc.m_depthStencilFormat).isStencil();
  49. const Bool hasDepth =
  50. m_staticState.m_misc.m_depthStencilFormat != Format::kNone && getFormatInfo(m_staticState.m_misc.m_depthStencilFormat).isDepth();
  51. m_hashes.m_depthStencil = 0xC0FEE;
  52. if(hasStencil)
  53. {
  54. m_hashes.m_depthStencil = appendObjectHash(m_staticState.m_stencil, m_hashes.m_depthStencil);
  55. }
  56. if(hasDepth)
  57. {
  58. m_hashes.m_depthStencil = appendObjectHash(m_staticState.m_depth, m_hashes.m_depthStencil);
  59. }
  60. someHashWasDirty = true;
  61. }
  62. if(m_hashes.m_blend == 0)
  63. {
  64. if(m_staticState.m_misc.m_colorRtMask.getAnySet())
  65. {
  66. m_hashes.m_blend = m_staticState.m_blend.m_alphaToCoverage;
  67. for(U32 i = 0; i < kMaxColorRenderTargets; ++i)
  68. {
  69. if(m_staticState.m_misc.m_colorRtMask.get(i))
  70. {
  71. m_hashes.m_blend = appendObjectHash(m_staticState.m_blend.m_colorRts[i], m_hashes.m_blend);
  72. }
  73. }
  74. }
  75. else
  76. {
  77. m_hashes.m_blend = 0xC0FFE;
  78. }
  79. someHashWasDirty = true;
  80. }
  81. if(m_hashes.m_misc == 0)
  82. {
  83. m_hashes.m_misc = computeObjectHash(m_staticState.m_misc);
  84. someHashWasDirty = true;
  85. }
  86. if(m_hashes.m_shaderProg == 0)
  87. {
  88. m_hashes.m_shaderProg = m_staticState.m_shaderProg->getUuid();
  89. someHashWasDirty = true;
  90. }
  91. if(!someHashWasDirty)
  92. {
  93. ANKI_ASSERT(m_globalHash == computeObjectHash(m_hashes));
  94. return false;
  95. }
  96. else
  97. {
  98. // Compute complete hash
  99. const U64 globalHash = computeObjectHash(m_hashes);
  100. if(globalHash != m_globalHash)
  101. {
  102. m_globalHash = globalHash;
  103. return true;
  104. }
  105. else
  106. {
  107. return false;
  108. }
  109. }
  110. }
  111. } // end namespace anki