const_buffer_locker.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright 2019 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include <memory>
  6. #include "common/assert.h"
  7. #include "common/common_types.h"
  8. #include "video_core/engines/maxwell_3d.h"
  9. #include "video_core/engines/shader_type.h"
  10. #include "video_core/shader/const_buffer_locker.h"
  11. namespace VideoCommon::Shader {
  12. using Tegra::Engines::SamplerDescriptor;
  13. ConstBufferLocker::ConstBufferLocker(Tegra::Engines::ShaderType shader_stage)
  14. : stage{shader_stage} {}
  15. ConstBufferLocker::ConstBufferLocker(Tegra::Engines::ShaderType shader_stage,
  16. Tegra::Engines::ConstBufferEngineInterface& engine)
  17. : stage{shader_stage}, engine{&engine} {}
  18. ConstBufferLocker::~ConstBufferLocker() = default;
  19. std::optional<u32> ConstBufferLocker::ObtainKey(u32 buffer, u32 offset) {
  20. const std::pair<u32, u32> key = {buffer, offset};
  21. const auto iter = keys.find(key);
  22. if (iter != keys.end()) {
  23. return iter->second;
  24. }
  25. if (!engine) {
  26. return std::nullopt;
  27. }
  28. const u32 value = engine->AccessConstBuffer32(stage, buffer, offset);
  29. keys.emplace(key, value);
  30. return value;
  31. }
  32. std::optional<SamplerDescriptor> ConstBufferLocker::ObtainBoundSampler(u32 offset) {
  33. const u32 key = offset;
  34. const auto iter = bound_samplers.find(key);
  35. if (iter != bound_samplers.end()) {
  36. return iter->second;
  37. }
  38. if (!engine) {
  39. return std::nullopt;
  40. }
  41. const SamplerDescriptor value = engine->AccessBoundSampler(stage, offset);
  42. bound_samplers.emplace(key, value);
  43. return value;
  44. }
  45. std::optional<Tegra::Engines::SamplerDescriptor> ConstBufferLocker::ObtainBindlessSampler(
  46. u32 buffer, u32 offset) {
  47. const std::pair key = {buffer, offset};
  48. const auto iter = bindless_samplers.find(key);
  49. if (iter != bindless_samplers.end()) {
  50. return iter->second;
  51. }
  52. if (!engine) {
  53. return std::nullopt;
  54. }
  55. const SamplerDescriptor value = engine->AccessBindlessSampler(stage, buffer, offset);
  56. bindless_samplers.emplace(key, value);
  57. return value;
  58. }
  59. void ConstBufferLocker::InsertKey(u32 buffer, u32 offset, u32 value) {
  60. keys.insert_or_assign({buffer, offset}, value);
  61. }
  62. void ConstBufferLocker::InsertBoundSampler(u32 offset, SamplerDescriptor sampler) {
  63. bound_samplers.insert_or_assign(offset, sampler);
  64. }
  65. void ConstBufferLocker::InsertBindlessSampler(u32 buffer, u32 offset, SamplerDescriptor sampler) {
  66. bindless_samplers.insert_or_assign({buffer, offset}, sampler);
  67. }
  68. bool ConstBufferLocker::IsConsistent() const {
  69. if (!engine) {
  70. return false;
  71. }
  72. return std::all_of(keys.begin(), keys.end(),
  73. [this](const auto& pair) {
  74. const auto [cbuf, offset] = pair.first;
  75. const auto value = pair.second;
  76. return value == engine->AccessConstBuffer32(stage, cbuf, offset);
  77. }) &&
  78. std::all_of(bound_samplers.begin(), bound_samplers.end(),
  79. [this](const auto& sampler) {
  80. const auto [key, value] = sampler;
  81. return value == engine->AccessBoundSampler(stage, key);
  82. }) &&
  83. std::all_of(bindless_samplers.begin(), bindless_samplers.end(),
  84. [this](const auto& sampler) {
  85. const auto [cbuf, offset] = sampler.first;
  86. const auto value = sampler.second;
  87. return value == engine->AccessBindlessSampler(stage, cbuf, offset);
  88. });
  89. }
  90. bool ConstBufferLocker::HasEqualKeys(const ConstBufferLocker& rhs) const {
  91. return keys == rhs.keys && bound_samplers == rhs.bound_samplers &&
  92. bindless_samplers == rhs.bindless_samplers;
  93. }
  94. } // namespace VideoCommon::Shader