VkShader.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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/Vulkan/VkShader.h>
  6. #include <AnKi/Gr/Vulkan/VkGrManager.h>
  7. #define ANKI_DUMP_SHADERS 0
  8. #if ANKI_DUMP_SHADERS
  9. # include <AnKi/Util/File.h>
  10. # include <AnKi/Gr/GrManager.h>
  11. #endif
  12. namespace anki {
  13. Shader* Shader::newInstance(const ShaderInitInfo& init)
  14. {
  15. ShaderImpl* impl = anki::newInstance<ShaderImpl>(GrMemoryPool::getSingleton(), init.getName());
  16. const Error err = impl->init(init);
  17. if(err)
  18. {
  19. deleteInstance(GrMemoryPool::getSingleton(), impl);
  20. impl = nullptr;
  21. }
  22. return impl;
  23. }
  24. ShaderImpl::~ShaderImpl()
  25. {
  26. }
  27. Error ShaderImpl::init(const ShaderInitInfo& inf)
  28. {
  29. inf.validate();
  30. ANKI_ASSERT((inf.m_binary.getSize() % sizeof(U32)) == 0);
  31. m_shaderType = inf.m_shaderType;
  32. m_hasDiscard = inf.m_reflection.m_pixel.m_discards;
  33. m_shaderBinarySize = U32(inf.m_binary.getSizeInBytes());
  34. m_reflection = inf.m_reflection;
  35. m_reflection.validate();
  36. m_spirvBin.resize(inf.m_binary.getSize() / sizeof(U32));
  37. memcpy(m_spirvBin.getBegin(), inf.m_binary.getBegin(), inf.m_binary.getSizeInBytes());
  38. #if ANKI_DUMP_SHADERS
  39. {
  40. StringRaii fnameSpirv(getAllocator());
  41. fnameSpirv.sprintf("%s/%s_t%u_%05u.spv", getManager().getCacheDirectory().cstr(), getName().cstr(), U(m_shaderType), getUuid());
  42. File fileSpirv;
  43. ANKI_CHECK(fileSpirv.open(fnameSpirv.toCString(), FileOpenFlag::kBinary | FileOpenFlag::kWrite | FileOpenFlag::kSpecial));
  44. ANKI_CHECK(fileSpirv.write(&inf.m_binary[0], inf.m_binary.getSize()));
  45. }
  46. #endif
  47. return Error::kNone;
  48. }
  49. } // end namespace anki