|
|
|
@ -41,9 +41,6 @@ TextureCache<P>::TextureCache(Runtime& runtime_, VideoCore::RasterizerInterface& |
|
|
|
sampler_descriptor.mipmap_filter.Assign(Tegra::Texture::TextureMipmapFilter::Linear); |
|
|
|
sampler_descriptor.cubemap_anisotropy.Assign(1); |
|
|
|
|
|
|
|
// Setup channels |
|
|
|
current_channel_id = UNSET_CHANNEL; |
|
|
|
|
|
|
|
// Make sure the first index is reserved for the null resources |
|
|
|
// This way the null resource becomes a compile time constant |
|
|
|
void(slot_images.insert(NullImageParams{})); |
|
|
|
@ -886,13 +883,15 @@ void TextureCache<P>::InvalidateScale(Image& image) { |
|
|
|
} |
|
|
|
image.image_view_ids.clear(); |
|
|
|
image.image_view_infos.clear(); |
|
|
|
auto& channel_info = channel_storage[image.channel]; |
|
|
|
if constexpr (ENABLE_VALIDATION) { |
|
|
|
std::ranges::fill(channel_info.graphics_image_view_ids, CORRUPT_ID); |
|
|
|
std::ranges::fill(channel_info.compute_image_view_ids, CORRUPT_ID); |
|
|
|
for (size_t c : active_channel_ids) { |
|
|
|
auto& channel_info = channel_storage[c]; |
|
|
|
if constexpr (ENABLE_VALIDATION) { |
|
|
|
std::ranges::fill(channel_info.graphics_image_view_ids, CORRUPT_ID); |
|
|
|
std::ranges::fill(channel_info.compute_image_view_ids, CORRUPT_ID); |
|
|
|
} |
|
|
|
channel_info.graphics_image_table.Invalidate(); |
|
|
|
channel_info.compute_image_table.Invalidate(); |
|
|
|
} |
|
|
|
channel_info.graphics_image_table.Invalidate(); |
|
|
|
channel_info.compute_image_table.Invalidate(); |
|
|
|
has_deleted_images = true; |
|
|
|
} |
|
|
|
|
|
|
|
@ -1690,26 +1689,30 @@ void TextureCache<P>::DeleteImage(ImageId image_id, bool immediate_delete) { |
|
|
|
if (alloc_images.empty()) { |
|
|
|
image_allocs_table.erase(alloc_it); |
|
|
|
} |
|
|
|
for (auto& this_state : channel_storage) { |
|
|
|
for (size_t c : active_channel_ids) { |
|
|
|
auto& channel_info = channel_storage[c]; |
|
|
|
if constexpr (ENABLE_VALIDATION) { |
|
|
|
std::ranges::fill(this_state.graphics_image_view_ids, CORRUPT_ID); |
|
|
|
std::ranges::fill(this_state.compute_image_view_ids, CORRUPT_ID); |
|
|
|
std::ranges::fill(channel_info.graphics_image_view_ids, CORRUPT_ID); |
|
|
|
std::ranges::fill(channel_info.compute_image_view_ids, CORRUPT_ID); |
|
|
|
} |
|
|
|
this_state.graphics_image_table.Invalidate(); |
|
|
|
this_state.compute_image_table.Invalidate(); |
|
|
|
channel_info.graphics_image_table.Invalidate(); |
|
|
|
channel_info.compute_image_table.Invalidate(); |
|
|
|
} |
|
|
|
has_deleted_images = true; |
|
|
|
} |
|
|
|
|
|
|
|
template <class P> |
|
|
|
void TextureCache<P>::RemoveImageViewReferences(std::span<const ImageViewId> removed_views) { |
|
|
|
auto it = channel_state->image_views.begin(); |
|
|
|
while (it != channel_state->image_views.end()) { |
|
|
|
const auto found = std::ranges::find(removed_views, it->second); |
|
|
|
if (found != removed_views.end()) { |
|
|
|
it = channel_state->image_views.erase(it); |
|
|
|
} else { |
|
|
|
++it; |
|
|
|
for (size_t c : active_channel_ids) { |
|
|
|
auto& channel_info = channel_storage[c]; |
|
|
|
auto it = channel_info.image_views.begin(); |
|
|
|
while (it != channel_info.image_views.end()) { |
|
|
|
const auto found = std::ranges::find(removed_views, it->second); |
|
|
|
if (found != removed_views.end()) { |
|
|
|
it = channel_info.image_views.erase(it); |
|
|
|
} else { |
|
|
|
++it; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|