rsx/vk: Fix bug with custom border color sampler storage
- If an app used multiple border colors, only the first one was being applied.
This commit is contained in:
@@ -182,16 +182,8 @@ namespace vk
|
|||||||
return found == m_generic_sampler_pool.end() ? nullptr : found->second.get();
|
return found == m_generic_sampler_pool.end() ? nullptr : found->second.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto block = m_custom_color_sampler_pool.equal_range(key.base_key);
|
const auto found = m_custom_color_sampler_pool.find(key);
|
||||||
for (auto it = block.first; it != block.second; ++it)
|
return found == m_custom_color_sampler_pool.end() ? nullptr : found->second.get();
|
||||||
{
|
|
||||||
if (it->second->key.border_color_key == key.border_color_key)
|
|
||||||
{
|
|
||||||
return it->second.get();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cached_sampler_object_t* sampler_pool_t::emplace(const sampler_pool_key_t& key, std::unique_ptr<cached_sampler_object_t>& object)
|
cached_sampler_object_t* sampler_pool_t::emplace(const sampler_pool_key_t& key, std::unique_ptr<cached_sampler_object_t>& object)
|
||||||
@@ -204,7 +196,7 @@ namespace vk
|
|||||||
return iterator->second.get();
|
return iterator->second.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto [iterator, _unused] = m_custom_color_sampler_pool.emplace(key.base_key, std::move(object));
|
const auto [iterator, _unused] = m_custom_color_sampler_pool.emplace(key, std::move(object));
|
||||||
return iterator->second.get();
|
return iterator->second.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,22 @@ namespace vk
|
|||||||
{
|
{
|
||||||
u64 base_key;
|
u64 base_key;
|
||||||
u64 border_color_key;
|
u64 border_color_key;
|
||||||
|
|
||||||
|
bool operator == (const sampler_pool_key_t& that) const
|
||||||
|
{
|
||||||
|
return this->base_key == that.base_key &&
|
||||||
|
this->border_color_key == that.border_color_key;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sampler_pool_key_hash
|
||||||
|
{
|
||||||
|
size_t operator()(const vk::sampler_pool_key_t& k) const noexcept
|
||||||
|
{
|
||||||
|
usz result = k.base_key;
|
||||||
|
result ^= k.border_color_key + 0x9e3779b97f4a7c15ULL + (result << 6) + (result >> 2);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cached_sampler_object_t : public vk::sampler, public rsx::ref_counted
|
struct cached_sampler_object_t : public vk::sampler, public rsx::ref_counted
|
||||||
@@ -75,7 +91,7 @@ namespace vk
|
|||||||
class sampler_pool_t
|
class sampler_pool_t
|
||||||
{
|
{
|
||||||
std::unordered_map<u64, std::unique_ptr<cached_sampler_object_t>> m_generic_sampler_pool;
|
std::unordered_map<u64, std::unique_ptr<cached_sampler_object_t>> m_generic_sampler_pool;
|
||||||
std::unordered_map<u64, std::unique_ptr<cached_sampler_object_t>> m_custom_color_sampler_pool;
|
std::unordered_map<sampler_pool_key_t, std::unique_ptr<cached_sampler_object_t>, sampler_pool_key_hash> m_custom_color_sampler_pool;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user