Просмотр исходного кода

texture_cache: Use std::array for siblings_table

ReinUsesLisp 7 лет назад
Родитель
Сommit
dd9ace502b
1 измененных файлов с 13 добавлено и 10 удалено
  1. 13 10
      src/video_core/texture_cache/texture_cache.h

+ 13 - 10
src/video_core/texture_cache/texture_cache.h

@@ -4,6 +4,8 @@
 
 
 #pragma once
 #pragma once
 
 
+#include <algorithm>
+#include <array>
 #include <memory>
 #include <memory>
 #include <mutex>
 #include <mutex>
 #include <set>
 #include <set>
@@ -244,20 +246,19 @@ protected:
         for (std::size_t i = 0; i < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; i++) {
         for (std::size_t i = 0; i < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; i++) {
             SetEmptyColorBuffer(i);
             SetEmptyColorBuffer(i);
         }
         }
+
         SetEmptyDepthBuffer();
         SetEmptyDepthBuffer();
         staging_cache.SetSize(2);
         staging_cache.SetSize(2);
+
         const auto make_siblings = [this](PixelFormat a, PixelFormat b) {
         const auto make_siblings = [this](PixelFormat a, PixelFormat b) {
-            siblings_table[a] = b;
-            siblings_table[b] = a;
+            siblings_table[static_cast<std::size_t>(a)] = b;
+            siblings_table[static_cast<std::size_t>(b)] = a;
         };
         };
-        const auto max_formats = static_cast<u32>(PixelFormat::Max);
-        siblings_table.reserve(max_formats);
-        for (u32 i = 0; i < max_formats; i++) {
-            siblings_table[static_cast<PixelFormat>(i)] = PixelFormat::Invalid;
-        }
+        std::fill(siblings_table.begin(), siblings_table.end(), PixelFormat::Invalid);
         make_siblings(PixelFormat::Z16, PixelFormat::R16U);
         make_siblings(PixelFormat::Z16, PixelFormat::R16U);
         make_siblings(PixelFormat::Z32F, PixelFormat::R32F);
         make_siblings(PixelFormat::Z32F, PixelFormat::R32F);
         make_siblings(PixelFormat::Z32FS8, PixelFormat::RG32F);
         make_siblings(PixelFormat::Z32FS8, PixelFormat::RG32F);
+
         sampled_textures_stack.resize(64);
         sampled_textures_stack.resize(64);
     }
     }
 
 
@@ -426,7 +427,8 @@ private:
         const auto& cr_params = current_surface->GetSurfaceParams();
         const auto& cr_params = current_surface->GetSurfaceParams();
         TSurface new_surface;
         TSurface new_surface;
         if (cr_params.pixel_format != params.pixel_format && !is_render &&
         if (cr_params.pixel_format != params.pixel_format && !is_render &&
-            siblings_table[cr_params.pixel_format] == params.pixel_format) {
+            siblings_table[static_cast<std::size_t>(cr_params.pixel_format)] ==
+                params.pixel_format) {
             SurfaceParams new_params = params;
             SurfaceParams new_params = params;
             new_params.pixel_format = cr_params.pixel_format;
             new_params.pixel_format = cr_params.pixel_format;
             new_params.component_type = cr_params.component_type;
             new_params.component_type = cr_params.component_type;
@@ -472,7 +474,8 @@ private:
         if (!is_mirage) {
         if (!is_mirage) {
             return match_check();
             return match_check();
         }
         }
-        if (!is_render && siblings_table[current_surface->GetFormat()] == params.pixel_format) {
+        if (!is_render && siblings_table[static_cast<std::size_t>(current_surface->GetFormat())] ==
+                              params.pixel_format) {
             return match_check();
             return match_check();
         }
         }
         return RebuildSurface(current_surface, params, is_render);
         return RebuildSurface(current_surface, params, is_render);
@@ -786,7 +789,7 @@ private:
     // The siblings table is for formats that can inter exchange with one another
     // The siblings table is for formats that can inter exchange with one another
     // without causing issues. This is only valid when a conflict occurs on a non
     // without causing issues. This is only valid when a conflict occurs on a non
     // rendering use.
     // rendering use.
-    std::unordered_map<PixelFormat, PixelFormat> siblings_table;
+    std::array<PixelFormat, static_cast<std::size_t>(PixelFormat::Max)> siblings_table;
 
 
     // The internal Cache is different for the Texture Cache. It's based on buckets
     // The internal Cache is different for the Texture Cache. It's based on buckets
     // of 1MB. This fits better for the purpose of this cache as textures are normaly
     // of 1MB. This fits better for the purpose of this cache as textures are normaly