ResourceGroupImpl.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. // Copyright (C) 2009-2016, 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/vulkan/ResourceGroupImpl.h>
  6. #include <anki/gr/ResourceGroup.h>
  7. #include <anki/gr/vulkan/GrManagerImpl.h>
  8. #include <anki/gr/vulkan/BufferImpl.h>
  9. namespace anki
  10. {
  11. //==============================================================================
  12. ResourceGroupImpl::~ResourceGroupImpl()
  13. {
  14. if(m_handle)
  15. {
  16. getGrManagerImpl().freeDescriptorSet(m_handle);
  17. }
  18. m_refs.destroy(getAllocator());
  19. }
  20. //==============================================================================
  21. U ResourceGroupImpl::calcRefCount(
  22. const ResourceGroupInitInfo& init, Bool& hasUploaded)
  23. {
  24. U count = 0;
  25. hasUploaded = false;
  26. for(U i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; ++i)
  27. {
  28. if(init.m_uniformBuffers[i].m_buffer)
  29. {
  30. ++count;
  31. }
  32. else if(init.m_uniformBuffers[i].m_uploadedMemory)
  33. {
  34. hasUploaded = true;
  35. }
  36. }
  37. for(U i = 0; i < MAX_VERTEX_ATTRIBUTES; ++i)
  38. {
  39. if(init.m_vertexBuffers[i].m_buffer)
  40. {
  41. ++count;
  42. }
  43. else if(init.m_vertexBuffers[i].m_uploadedMemory)
  44. {
  45. hasUploaded = true;
  46. }
  47. }
  48. // TODO: The rest of the resources
  49. return count;
  50. }
  51. //==============================================================================
  52. Error ResourceGroupImpl::init(const ResourceGroupInitInfo& init)
  53. {
  54. // Store the references
  55. //
  56. Bool hasUploaded = false;
  57. U refCount = calcRefCount(init, hasUploaded);
  58. ANKI_ASSERT(refCount > 0 || hasUploaded);
  59. if(refCount)
  60. {
  61. m_refs.create(getAllocator(), refCount);
  62. }
  63. // Update
  64. //
  65. Array<VkDescriptorBufferInfo, MAX_UNIFORM_BUFFER_BINDINGS> unis = {{}};
  66. U uniCount = 0;
  67. Array<VkWriteDescriptorSet, 1> write = {{}};
  68. U writeCount = 0;
  69. refCount = 0;
  70. // 1st the textures
  71. // TODO
  72. // 2nd the uniform buffers
  73. for(U i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; ++i)
  74. {
  75. if(init.m_uniformBuffers[i].m_buffer)
  76. {
  77. VkDescriptorBufferInfo& inf = unis[uniCount++];
  78. inf.buffer = init.m_uniformBuffers[i]
  79. .m_buffer->getImplementation()
  80. .getHandle();
  81. inf.offset = init.m_uniformBuffers[i].m_offset;
  82. inf.range = init.m_uniformBuffers[i].m_range;
  83. m_refs[refCount++] = init.m_uniformBuffers[i].m_buffer;
  84. }
  85. else if(init.m_uniformBuffers[i].m_uploadedMemory)
  86. {
  87. ANKI_ASSERT(0 && "TODO");
  88. }
  89. }
  90. if(uniCount)
  91. {
  92. if(m_handle == VK_NULL_HANDLE)
  93. {
  94. ANKI_CHECK(getGrManagerImpl().allocateDescriptorSet(m_handle));
  95. }
  96. VkWriteDescriptorSet& w = write[writeCount++];
  97. w.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
  98. w.descriptorCount = uniCount;
  99. w.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
  100. w.dstBinding = MAX_TEXTURE_BINDINGS;
  101. w.pBufferInfo = &unis[0];
  102. w.dstSet = m_handle;
  103. }
  104. // Check if it was created. It's not created only if the rc group contains
  105. // only vertex info.
  106. if(m_handle)
  107. {
  108. vkUpdateDescriptorSets(getDevice(), writeCount, &write[0], 0, nullptr);
  109. }
  110. // Vertex stuff
  111. //
  112. for(U i = 0; i < init.m_vertexBuffers.getSize(); ++i)
  113. {
  114. if(init.m_vertexBuffers[i].m_buffer)
  115. {
  116. m_vertBuffs[i] = init.m_vertexBuffers[i]
  117. .m_buffer->getImplementation()
  118. .getHandle();
  119. m_offsets[i] = init.m_vertexBuffers[i].m_offset;
  120. ++m_bindingCount;
  121. m_refs[refCount++] = init.m_vertexBuffers[i].m_buffer;
  122. }
  123. else if(init.m_vertexBuffers[i].m_uploadedMemory)
  124. {
  125. ANKI_ASSERT(0 && "TODO");
  126. ++m_bindingCount;
  127. }
  128. else
  129. {
  130. break;
  131. }
  132. }
  133. return ErrorCode::NONE;
  134. }
  135. } // end namespace anki