formatter.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <algorithm>
  4. #include <string>
  5. #include "common/polyfill_ranges.h"
  6. #include "video_core/texture_cache/formatter.h"
  7. #include "video_core/texture_cache/image_base.h"
  8. #include "video_core/texture_cache/image_info.h"
  9. #include "video_core/texture_cache/image_view_base.h"
  10. #include "video_core/texture_cache/render_targets.h"
  11. #include "video_core/texture_cache/samples_helper.h"
  12. namespace VideoCommon {
  13. std::string Name(const ImageBase& image) {
  14. const GPUVAddr gpu_addr = image.gpu_addr;
  15. const ImageInfo& info = image.info;
  16. u32 width = info.size.width;
  17. u32 height = info.size.height;
  18. const u32 depth = info.size.depth;
  19. const u32 num_layers = image.info.resources.layers;
  20. const u32 num_levels = image.info.resources.levels;
  21. std::string resource;
  22. if (image.info.num_samples > 1) {
  23. const auto [samples_x, samples_y] = VideoCommon::SamplesLog2(image.info.num_samples);
  24. width >>= samples_x;
  25. height >>= samples_y;
  26. resource += fmt::format(":{}xMSAA", image.info.num_samples);
  27. }
  28. if (num_layers > 1) {
  29. resource += fmt::format(":L{}", num_layers);
  30. }
  31. if (num_levels > 1) {
  32. resource += fmt::format(":M{}", num_levels);
  33. }
  34. switch (image.info.type) {
  35. case ImageType::e1D:
  36. return fmt::format("Image 1D 0x{:x} {}{}", gpu_addr, width, resource);
  37. case ImageType::e2D:
  38. return fmt::format("Image 2D 0x{:x} {}x{}{}", gpu_addr, width, height, resource);
  39. case ImageType::e3D:
  40. return fmt::format("Image 2D 0x{:x} {}x{}x{}{}", gpu_addr, width, height, depth, resource);
  41. case ImageType::Linear:
  42. return fmt::format("Image Linear 0x{:x} {}x{}", gpu_addr, width, height);
  43. case ImageType::Buffer:
  44. return fmt::format("Buffer 0x{:x} {}", image.gpu_addr, image.info.size.width);
  45. }
  46. return "Invalid";
  47. }
  48. std::string Name(const ImageViewBase& image_view, GPUVAddr addr) {
  49. const u32 width = image_view.size.width;
  50. const u32 height = image_view.size.height;
  51. const u32 depth = image_view.size.depth;
  52. const u32 num_levels = image_view.range.extent.levels;
  53. const u32 num_layers = image_view.range.extent.layers;
  54. const std::string level = num_levels > 1 ? fmt::format(":{}", num_levels) : "";
  55. switch (image_view.type) {
  56. case ImageViewType::e1D:
  57. return fmt::format("ImageView 1D 0x{:X} {}{}", addr, width, level);
  58. case ImageViewType::e2D:
  59. return fmt::format("ImageView 2D 0x{:X} {}x{}{}", addr, width, height, level);
  60. case ImageViewType::Cube:
  61. return fmt::format("ImageView Cube 0x{:X} {}x{}{}", addr, width, height, level);
  62. case ImageViewType::e3D:
  63. return fmt::format("ImageView 3D 0x{:X} {}x{}x{}{}", addr, width, height, depth, level);
  64. case ImageViewType::e1DArray:
  65. return fmt::format("ImageView 1DArray 0x{:X} {}{}|{}", addr, width, level, num_layers);
  66. case ImageViewType::e2DArray:
  67. return fmt::format("ImageView 2DArray 0x{:X} {}x{}{}|{}", addr, width, height, level,
  68. num_layers);
  69. case ImageViewType::CubeArray:
  70. return fmt::format("ImageView CubeArray 0x{:X} {}x{}{}|{}", addr, width, height, level,
  71. num_layers);
  72. case ImageViewType::Rect:
  73. return fmt::format("ImageView Rect 0x{:X} {}x{}{}", addr, width, height, level);
  74. case ImageViewType::Buffer:
  75. return fmt::format("BufferView 0x{:X} {}", addr, width);
  76. }
  77. return "Invalid";
  78. }
  79. std::string Name(const RenderTargets& render_targets) {
  80. std::string_view debug_prefix;
  81. const auto num_color = std::ranges::count_if(
  82. render_targets.color_buffer_ids, [](ImageViewId id) { return static_cast<bool>(id); });
  83. if (render_targets.depth_buffer_id) {
  84. debug_prefix = num_color > 0 ? "R" : "Z";
  85. } else {
  86. debug_prefix = num_color > 0 ? "C" : "X";
  87. }
  88. const Extent2D size = render_targets.size;
  89. if (num_color > 0) {
  90. return fmt::format("Framebuffer {}{} {}x{}", debug_prefix, num_color, size.width,
  91. size.height);
  92. } else {
  93. return fmt::format("Framebuffer {} {}x{}", debug_prefix, size.width, size.height);
  94. }
  95. }
  96. } // namespace VideoCommon