command_processor.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // Copyright 2018 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <type_traits>
  6. #include "common/bit_field.h"
  7. #include "common/common_types.h"
  8. #include "video_core/memory_manager.h"
  9. namespace Tegra {
  10. enum class SubmissionMode : u32 {
  11. IncreasingOld = 0,
  12. Increasing = 1,
  13. NonIncreasingOld = 2,
  14. NonIncreasing = 3,
  15. Inline = 4,
  16. IncreaseOnce = 5
  17. };
  18. struct CommandListHeader {
  19. u32 entry0; // gpu_va_lo
  20. union {
  21. u32 entry1; // gpu_va_hi | (unk_0x02 << 0x08) | (size << 0x0A) | (unk_0x01 << 0x1F)
  22. BitField<0, 8, u32> gpu_va_hi;
  23. BitField<8, 2, u32> unk1;
  24. BitField<10, 21, u32> sz;
  25. BitField<31, 1, u32> unk2;
  26. };
  27. GPUVAddr Address() const {
  28. return (static_cast<GPUVAddr>(gpu_va_hi) << 32) | entry0;
  29. }
  30. };
  31. static_assert(sizeof(CommandListHeader) == 8, "CommandListHeader is incorrect size");
  32. union CommandHeader {
  33. u32 hex;
  34. BitField<0, 13, u32> method;
  35. BitField<13, 3, u32> subchannel;
  36. BitField<16, 13, u32> arg_count;
  37. BitField<16, 13, u32> inline_data;
  38. BitField<29, 3, SubmissionMode> mode;
  39. };
  40. static_assert(std::is_standard_layout_v<CommandHeader>, "CommandHeader is not standard layout");
  41. static_assert(sizeof(CommandHeader) == sizeof(u32), "CommandHeader has incorrect size!");
  42. } // namespace Tegra