2019-09-23 20:02:02 +02:00
|
|
|
// Copyright 2019 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <unordered_map>
|
|
|
|
#include "common/common_types.h"
|
|
|
|
#include "common/hash.h"
|
|
|
|
#include "video_core/engines/const_buffer_engine_interface.h"
|
|
|
|
|
|
|
|
namespace VideoCommon::Shader {
|
|
|
|
|
2019-09-25 15:53:18 +02:00
|
|
|
using KeyMap = std::unordered_map<std::pair<u32, u32>, u32, Common::PairHash>;
|
|
|
|
using BoundSamplerMap = std::unordered_map<u32, Tegra::Engines::SamplerDescriptor>;
|
|
|
|
using BindlessSamplerMap =
|
|
|
|
std::unordered_map<std::pair<u32, u32>, Tegra::Engines::SamplerDescriptor, Common::PairHash>;
|
|
|
|
|
2019-09-23 20:02:02 +02:00
|
|
|
class ConstBufferLocker {
|
|
|
|
public:
|
|
|
|
explicit ConstBufferLocker(Tegra::Engines::ShaderType shader_stage);
|
|
|
|
|
|
|
|
explicit ConstBufferLocker(Tegra::Engines::ShaderType shader_stage,
|
2019-09-25 04:34:18 +02:00
|
|
|
Tegra::Engines::ConstBufferEngineInterface& engine);
|
2019-09-23 20:02:02 +02:00
|
|
|
|
2019-09-26 00:19:41 +02:00
|
|
|
/// Retrieves a key from the locker, if it's registered, it will give the registered value, if
|
|
|
|
/// not it will obtain it from maxwell3d and register it.
|
2019-09-23 20:02:02 +02:00
|
|
|
std::optional<u32> ObtainKey(u32 buffer, u32 offset);
|
|
|
|
|
2019-09-25 15:53:18 +02:00
|
|
|
std::optional<Tegra::Engines::SamplerDescriptor> ObtainBoundSampler(u32 offset);
|
|
|
|
|
|
|
|
std::optional<Tegra::Engines::SamplerDescriptor> ObtainBindlessSampler(u32 buffer, u32 offset);
|
|
|
|
|
2019-09-26 00:19:41 +02:00
|
|
|
/// Inserts a key.
|
2019-09-23 20:02:02 +02:00
|
|
|
void InsertKey(u32 buffer, u32 offset, u32 value);
|
|
|
|
|
2019-09-26 00:19:41 +02:00
|
|
|
/// Inserts a bound sampler key.
|
2019-09-25 15:53:18 +02:00
|
|
|
void InsertBoundSampler(u32 offset, Tegra::Engines::SamplerDescriptor sampler);
|
|
|
|
|
2019-09-26 00:19:41 +02:00
|
|
|
/// Inserts a bindless sampler key.
|
2019-09-25 15:53:18 +02:00
|
|
|
void InsertBindlessSampler(u32 buffer, u32 offset, Tegra::Engines::SamplerDescriptor sampler);
|
|
|
|
|
2019-09-26 00:19:41 +02:00
|
|
|
/// Checks keys and samplers against engine's current const buffers. Returns true if they are
|
|
|
|
/// the same value, false otherwise;
|
|
|
|
bool IsConsistent() const;
|
2019-09-23 20:02:02 +02:00
|
|
|
|
2019-09-26 00:19:41 +02:00
|
|
|
/// Gives an getter to the const buffer keys in the database.
|
|
|
|
const KeyMap& GetKeys() const {
|
|
|
|
return keys;
|
2019-09-25 15:53:18 +02:00
|
|
|
}
|
|
|
|
|
2019-09-26 00:19:41 +02:00
|
|
|
/// Gets samplers database.
|
|
|
|
const BoundSamplerMap& GetBoundSamplers() const {
|
|
|
|
return bound_samplers;
|
2019-09-25 15:53:18 +02:00
|
|
|
}
|
|
|
|
|
2019-09-26 00:19:41 +02:00
|
|
|
/// Gets bindless samplers database.
|
|
|
|
const BindlessSamplerMap& GetBindlessSamplers() const {
|
|
|
|
return bindless_samplers;
|
2019-09-25 15:53:18 +02:00
|
|
|
}
|
2019-09-23 20:02:02 +02:00
|
|
|
|
|
|
|
private:
|
2019-09-26 00:19:41 +02:00
|
|
|
const Tegra::Engines::ShaderType stage;
|
|
|
|
Tegra::Engines::ConstBufferEngineInterface* engine = nullptr;
|
|
|
|
KeyMap keys;
|
|
|
|
BoundSamplerMap bound_samplers;
|
|
|
|
BindlessSamplerMap bindless_samplers;
|
2019-09-23 20:02:02 +02:00
|
|
|
};
|
2019-09-26 00:19:41 +02:00
|
|
|
|
2019-09-23 20:02:02 +02:00
|
|
|
} // namespace VideoCommon::Shader
|