channel_state_cache.inc 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "video_core/control/channel_state.h"
  2. #include "video_core/control/channel_state_cache.h"
  3. #include "video_core/engines/kepler_compute.h"
  4. #include "video_core/engines/maxwell_3d.h"
  5. #include "video_core/memory_manager.h"
  6. namespace VideoCommon {
  7. ChannelInfo::ChannelInfo(Tegra::Control::ChannelState& channel_state)
  8. : maxwell3d{*channel_state.maxwell_3d}, kepler_compute{*channel_state.kepler_compute},
  9. gpu_memory{*channel_state.memory_manager} {}
  10. template <class P>
  11. void ChannelSetupCaches<P>::CreateChannel(struct Tegra::Control::ChannelState& channel) {
  12. ASSERT(channel_map.find(channel.bind_id) == channel_map.end() && channel.bind_id >= 0);
  13. auto new_id = [this, &channel]() {
  14. if (!free_channel_ids.empty()) {
  15. auto id = free_channel_ids.front();
  16. free_channel_ids.pop_front();
  17. new (&channel_storage[id]) ChannelInfo(channel);
  18. return id;
  19. }
  20. channel_storage.emplace_back(channel);
  21. return channel_storage.size() - 1;
  22. }();
  23. channel_map.emplace(channel.bind_id, new_id);
  24. if (current_channel_id != UNSET_CHANNEL) {
  25. channel_state = &channel_storage[current_channel_id];
  26. }
  27. }
  28. /// Bind a channel for execution.
  29. template <class P>
  30. void ChannelSetupCaches<P>::BindToChannel(s32 id) {
  31. auto it = channel_map.find(id);
  32. ASSERT(it != channel_map.end() && id >= 0);
  33. current_channel_id = it->second;
  34. channel_state = &channel_storage[current_channel_id];
  35. maxwell3d = &channel_state->maxwell3d;
  36. kepler_compute = &channel_state->kepler_compute;
  37. gpu_memory = &channel_state->gpu_memory;
  38. }
  39. /// Erase channel's channel_state.
  40. template <class P>
  41. void ChannelSetupCaches<P>::EraseChannel(s32 id) {
  42. const auto it = channel_map.find(id);
  43. ASSERT(it != channel_map.end() && id >= 0);
  44. const auto this_id = it->second;
  45. free_channel_ids.push_back(this_id);
  46. channel_map.erase(it);
  47. if (this_id == current_channel_id) {
  48. current_channel_id = UNSET_CHANNEL;
  49. channel_state = nullptr;
  50. maxwell3d = nullptr;
  51. kepler_compute = nullptr;
  52. gpu_memory = nullptr;
  53. } else if (current_channel_id != UNSET_CHANNEL) {
  54. channel_state = &channel_storage[current_channel_id];
  55. }
  56. }
  57. } // namespace VideoCommon