ShaderProgramParser.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright (C) 2009-2019, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <tests/framework/Framework.h>
  6. #include <anki/shader_compiler/ShaderProgramParser.h>
  7. ANKI_TEST(ShaderCompiler, ShaderCompilerParser)
  8. {
  9. HeapAllocator<U8> alloc(allocAligned, nullptr);
  10. class FilesystemInterface : public ShaderProgramFilesystemInterface
  11. {
  12. public:
  13. U32 count = 0;
  14. Error readAllText(CString filename, StringAuto& txt) final
  15. {
  16. if(count == 0)
  17. {
  18. txt = R"(
  19. #pragma anki mutator M0 1 2
  20. #pragma anki mutator M1 3 4
  21. #pragma anki rewrite_mutation M0 2 M1 4 to M0 1 M1 3
  22. #if M0 == 1
  23. #pragma anki input Vec3 var0
  24. #endif
  25. #if M1 == 4
  26. #pragma anki input const Vec3 var1
  27. #endif
  28. #pragma anki start vert
  29. // vert
  30. #pragma anki end
  31. #pragma anki start frag
  32. // frag
  33. #pragma anki end
  34. )";
  35. }
  36. else
  37. {
  38. return Error::FUNCTION_FAILED;
  39. }
  40. ++count;
  41. return Error::NONE;
  42. }
  43. } interface;
  44. ShaderProgramParser parser("filename0", &interface, alloc, 128, 1, 1, GpuVendor::AMD);
  45. ANKI_TEST_EXPECT_NO_ERR(parser.parse());
  46. // Check inputs
  47. ANKI_TEST_EXPECT_EQ(parser.getInputs().getSize(), 2);
  48. // Test a variant
  49. Array<MutatorValue, 2> mutation = {{2, 4}};
  50. ShaderProgramParserVariant variant;
  51. ANKI_TEST_EXPECT_NO_ERR(parser.generateVariant(mutation, variant));
  52. ANKI_TEST_EXPECT_EQ(variant.isInputActive(parser.getInputs()[0]), false);
  53. ANKI_TEST_EXPECT_EQ(variant.isInputActive(parser.getInputs()[1]), true);
  54. // Test rewrite
  55. ANKI_TEST_EXPECT_EQ(parser.rewriteMutation(mutation), true);
  56. ANKI_TEST_EXPECT_EQ(mutation[0], 1);
  57. ANKI_TEST_EXPECT_EQ(mutation[1], 3);
  58. // printf("%s\n", variant.getSource(ShaderType::VERTEX).cstr());
  59. }