|
|
@ -7,7 +7,6 @@
|
|
|
|
#include <array>
|
|
|
|
#include <array>
|
|
|
|
#include <cstddef>
|
|
|
|
#include <cstddef>
|
|
|
|
#include <memory>
|
|
|
|
#include <memory>
|
|
|
|
#include <tuple>
|
|
|
|
|
|
|
|
#include <type_traits>
|
|
|
|
#include <type_traits>
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <utility>
|
|
|
|
#include <utility>
|
|
|
@ -51,42 +50,38 @@ using ProgramCode = std::vector<u64>;
|
|
|
|
|
|
|
|
|
|
|
|
struct GraphicsPipelineCacheKey {
|
|
|
|
struct GraphicsPipelineCacheKey {
|
|
|
|
FixedPipelineState fixed_state;
|
|
|
|
FixedPipelineState fixed_state;
|
|
|
|
std::array<GPUVAddr, Maxwell::MaxShaderProgram> shaders;
|
|
|
|
|
|
|
|
RenderPassParams renderpass_params;
|
|
|
|
RenderPassParams renderpass_params;
|
|
|
|
|
|
|
|
std::array<GPUVAddr, Maxwell::MaxShaderProgram> shaders;
|
|
|
|
|
|
|
|
u64 padding; // This is necessary for unique object representations
|
|
|
|
|
|
|
|
|
|
|
|
std::size_t Hash() const noexcept {
|
|
|
|
std::size_t Hash() const noexcept;
|
|
|
|
std::size_t hash = fixed_state.Hash();
|
|
|
|
|
|
|
|
for (const auto& shader : shaders) {
|
|
|
|
|
|
|
|
boost::hash_combine(hash, shader);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
boost::hash_combine(hash, renderpass_params.Hash());
|
|
|
|
|
|
|
|
return hash;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool operator==(const GraphicsPipelineCacheKey& rhs) const noexcept {
|
|
|
|
bool operator==(const GraphicsPipelineCacheKey& rhs) const noexcept;
|
|
|
|
return std::tie(fixed_state, shaders, renderpass_params) ==
|
|
|
|
|
|
|
|
std::tie(rhs.fixed_state, rhs.shaders, rhs.renderpass_params);
|
|
|
|
bool operator!=(const GraphicsPipelineCacheKey& rhs) const noexcept {
|
|
|
|
|
|
|
|
return !operator==(rhs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
static_assert(std::has_unique_object_representations_v<GraphicsPipelineCacheKey>);
|
|
|
|
|
|
|
|
static_assert(std::is_trivially_copyable_v<GraphicsPipelineCacheKey>);
|
|
|
|
|
|
|
|
static_assert(std::is_trivially_constructible_v<GraphicsPipelineCacheKey>);
|
|
|
|
|
|
|
|
|
|
|
|
struct ComputePipelineCacheKey {
|
|
|
|
struct ComputePipelineCacheKey {
|
|
|
|
GPUVAddr shader{};
|
|
|
|
GPUVAddr shader;
|
|
|
|
u32 shared_memory_size{};
|
|
|
|
u32 shared_memory_size;
|
|
|
|
std::array<u32, 3> workgroup_size{};
|
|
|
|
std::array<u32, 3> workgroup_size;
|
|
|
|
|
|
|
|
|
|
|
|
std::size_t Hash() const noexcept {
|
|
|
|
std::size_t Hash() const noexcept;
|
|
|
|
return static_cast<std::size_t>(shader) ^
|
|
|
|
|
|
|
|
((static_cast<std::size_t>(shared_memory_size) >> 7) << 40) ^
|
|
|
|
|
|
|
|
static_cast<std::size_t>(workgroup_size[0]) ^
|
|
|
|
|
|
|
|
(static_cast<std::size_t>(workgroup_size[1]) << 16) ^
|
|
|
|
|
|
|
|
(static_cast<std::size_t>(workgroup_size[2]) << 24);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool operator==(const ComputePipelineCacheKey& rhs) const noexcept {
|
|
|
|
bool operator==(const ComputePipelineCacheKey& rhs) const noexcept;
|
|
|
|
return std::tie(shader, shared_memory_size, workgroup_size) ==
|
|
|
|
|
|
|
|
std::tie(rhs.shader, rhs.shared_memory_size, rhs.workgroup_size);
|
|
|
|
bool operator!=(const ComputePipelineCacheKey& rhs) const noexcept {
|
|
|
|
|
|
|
|
return !operator==(rhs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
static_assert(std::has_unique_object_representations_v<ComputePipelineCacheKey>);
|
|
|
|
|
|
|
|
static_assert(std::is_trivially_copyable_v<ComputePipelineCacheKey>);
|
|
|
|
|
|
|
|
static_assert(std::is_trivially_constructible_v<ComputePipelineCacheKey>);
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace Vulkan
|
|
|
|
} // namespace Vulkan
|
|
|
|
|
|
|
|
|
|
|
|