summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp26
-rw-r--r--src/video_core/renderer_opengl/maxwell_to_gl.h2
-rw-r--r--src/video_core/renderer_vulkan/maxwell_to_vk.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp49
-rw-r--r--src/video_core/surface.h8
-rw-r--r--src/video_core/texture_cache/format_lookup_table.cpp6
-rw-r--r--src/video_core/texture_cache/formatter.h4
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp12
8 files changed, 102 insertions, 7 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp
index d12076358..f8c6e5c7e 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp
@@ -182,6 +182,26 @@ GLenum AttachmentType(PixelFormat format) {
182 } 182 }
183} 183}
184 184
185GLint ConvertA5B5G5R1_UNORM(SwizzleSource source) {
186 switch (source) {
187 case SwizzleSource::Zero:
188 return GL_ZERO;
189 case SwizzleSource::R:
190 return GL_ALPHA;
191 case SwizzleSource::G:
192 return GL_BLUE;
193 case SwizzleSource::B:
194 return GL_GREEN;
195 case SwizzleSource::A:
196 return GL_RED;
197 case SwizzleSource::OneInt:
198 case SwizzleSource::OneFloat:
199 return GL_ONE;
200 }
201 UNREACHABLE_MSG("Invalid swizzle source={}", source);
202 return GL_NONE;
203}
204
185void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4> swizzle) { 205void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4> swizzle) {
186 switch (format) { 206 switch (format) {
187 case PixelFormat::D24_UNORM_S8_UINT: 207 case PixelFormat::D24_UNORM_S8_UINT:
@@ -192,6 +212,12 @@ void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4
192 TextureMode(format, swizzle[0] == SwizzleSource::R)); 212 TextureMode(format, swizzle[0] == SwizzleSource::R));
193 std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); 213 std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
194 break; 214 break;
215 case PixelFormat::A5B5G5R1_UNORM: {
216 std::array<GLint, 4> gl_swizzle;
217 std::ranges::transform(swizzle, gl_swizzle.begin(), ConvertA5B5G5R1_UNORM);
218 glTextureParameteriv(handle, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle.data());
219 return;
220 }
195 default: 221 default:
196 break; 222 break;
197 } 223 }
diff --git a/src/video_core/renderer_opengl/maxwell_to_gl.h b/src/video_core/renderer_opengl/maxwell_to_gl.h
index db5bf1d30..03adf3d4c 100644
--- a/src/video_core/renderer_opengl/maxwell_to_gl.h
+++ b/src/video_core/renderer_opengl/maxwell_to_gl.h
@@ -30,6 +30,7 @@ constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> FORMAT_TAB
30 {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UNORM 30 {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UNORM
31 {GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UINT 31 {GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UINT
32 {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5_UNORM 32 {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5_UNORM
33 {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // A5B5G5R1_UNORM
33 {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8_UNORM 34 {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8_UNORM
34 {GL_R8_SNORM, GL_RED, GL_BYTE}, // R8_SNORM 35 {GL_R8_SNORM, GL_RED, GL_BYTE}, // R8_SNORM
35 {GL_R8I, GL_RED_INTEGER, GL_BYTE}, // R8_SINT 36 {GL_R8I, GL_RED_INTEGER, GL_BYTE}, // R8_SINT
@@ -87,6 +88,7 @@ constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> FORMAT_TAB
87 {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, // BC3_SRGB 88 {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, // BC3_SRGB
88 {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM}, // BC7_SRGB 89 {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM}, // BC7_SRGB
89 {GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // A4B4G4R4_UNORM 90 {GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // A4B4G4R4_UNORM
91 {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R4G4_UNORM
90 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR}, // ASTC_2D_4X4_SRGB 92 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR}, // ASTC_2D_4X4_SRGB
91 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR}, // ASTC_2D_8X8_SRGB 93 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR}, // ASTC_2D_8X8_SRGB
92 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR}, // ASTC_2D_8X5_SRGB 94 {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR}, // ASTC_2D_8X5_SRGB
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
index 1c136c410..a2c6d0e6c 100644
--- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
+++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
@@ -127,6 +127,7 @@ struct FormatTuple {
127 {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM 127 {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM
128 {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT 128 {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT
129 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle) 129 {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle)
130 {VK_FORMAT_R5G5B5A1_UNORM_PACK16}, // A5B5G5R1_UNORM (specially swizzled)
130 {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM 131 {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM
131 {VK_FORMAT_R8_SNORM, Attachable | Storage}, // R8_SNORM 132 {VK_FORMAT_R8_SNORM, Attachable | Storage}, // R8_SNORM
132 {VK_FORMAT_R8_SINT, Attachable | Storage}, // R8_SINT 133 {VK_FORMAT_R8_SINT, Attachable | Storage}, // R8_SINT
@@ -184,6 +185,7 @@ struct FormatTuple {
184 {VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB 185 {VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB
185 {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB 186 {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB
186 {VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // A4B4G4R4_UNORM 187 {VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // A4B4G4R4_UNORM
188 {VK_FORMAT_R4G4_UNORM_PACK8}, // R4G4_UNORM
187 {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB 189 {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB
188 {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB 190 {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB
189 {VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB 191 {VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 2c2ccc7c6..49691ce0c 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -438,6 +438,32 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
438 } 438 }
439} 439}
440 440
441[[nodiscard]] SwizzleSource SwapGreenRed(SwizzleSource value) {
442 switch (value) {
443 case SwizzleSource::R:
444 return SwizzleSource::G;
445 case SwizzleSource::G:
446 return SwizzleSource::R;
447 default:
448 return value;
449 }
450}
451
452[[nodiscard]] SwizzleSource SwapSpecial(SwizzleSource value) {
453 switch (value) {
454 case SwizzleSource::A:
455 return SwizzleSource::R;
456 case SwizzleSource::R:
457 return SwizzleSource::A;
458 case SwizzleSource::G:
459 return SwizzleSource::B;
460 case SwizzleSource::B:
461 return SwizzleSource::G;
462 default:
463 return value;
464 }
465}
466
441void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image, 467void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image,
442 VkImageAspectFlags aspect_mask, bool is_initialized, 468 VkImageAspectFlags aspect_mask, bool is_initialized,
443 std::span<const VkBufferImageCopy> copies) { 469 std::span<const VkBufferImageCopy> copies) {
@@ -554,14 +580,25 @@ void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage im
554 }; 580 };
555} 581}
556 582
557[[nodiscard]] bool IsFormatFlipped(PixelFormat format, bool emulate_bgr565) { 583void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4>& swizzle,
584 bool emulate_bgr565) {
558 switch (format) { 585 switch (format) {
559 case PixelFormat::A1B5G5R5_UNORM: 586 case PixelFormat::A1B5G5R5_UNORM:
560 return true; 587 std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed);
588 break;
561 case PixelFormat::B5G6R5_UNORM: 589 case PixelFormat::B5G6R5_UNORM:
562 return emulate_bgr565; 590 if (emulate_bgr565) {
591 std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed);
592 }
593 break;
594 case PixelFormat::A5B5G5R1_UNORM:
595 std::ranges::transform(swizzle, swizzle.begin(), SwapSpecial);
596 break;
597 case PixelFormat::R4G4_UNORM:
598 std::ranges::transform(swizzle, swizzle.begin(), SwapGreenRed);
599 break;
563 default: 600 default:
564 return false; 601 break;
565 } 602 }
566} 603}
567 604
@@ -1496,9 +1533,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
1496 }; 1533 };
1497 if (!info.IsRenderTarget()) { 1534 if (!info.IsRenderTarget()) {
1498 swizzle = info.Swizzle(); 1535 swizzle = info.Swizzle();
1499 if (IsFormatFlipped(format, device->MustEmulateBGR565())) { 1536 TryTransformSwizzleIfNeeded(format, swizzle, device->MustEmulateBGR565());
1500 std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed);
1501 }
1502 if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { 1537 if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) {
1503 std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); 1538 std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
1504 } 1539 }
diff --git a/src/video_core/surface.h b/src/video_core/surface.h
index 5704cf16a..86fea61ae 100644
--- a/src/video_core/surface.h
+++ b/src/video_core/surface.h
@@ -25,6 +25,7 @@ enum class PixelFormat {
25 A2B10G10R10_UNORM, 25 A2B10G10R10_UNORM,
26 A2B10G10R10_UINT, 26 A2B10G10R10_UINT,
27 A1B5G5R5_UNORM, 27 A1B5G5R5_UNORM,
28 A5B5G5R1_UNORM,
28 R8_UNORM, 29 R8_UNORM,
29 R8_SNORM, 30 R8_SNORM,
30 R8_SINT, 31 R8_SINT,
@@ -82,6 +83,7 @@ enum class PixelFormat {
82 BC3_SRGB, 83 BC3_SRGB,
83 BC7_SRGB, 84 BC7_SRGB,
84 A4B4G4R4_UNORM, 85 A4B4G4R4_UNORM,
86 R4G4_UNORM,
85 ASTC_2D_4X4_SRGB, 87 ASTC_2D_4X4_SRGB,
86 ASTC_2D_8X8_SRGB, 88 ASTC_2D_8X8_SRGB,
87 ASTC_2D_8X5_SRGB, 89 ASTC_2D_8X5_SRGB,
@@ -156,6 +158,7 @@ constexpr std::array<u32, MaxPixelFormat> BLOCK_WIDTH_TABLE = {{
156 1, // A2B10G10R10_UNORM 158 1, // A2B10G10R10_UNORM
157 1, // A2B10G10R10_UINT 159 1, // A2B10G10R10_UINT
158 1, // A1B5G5R5_UNORM 160 1, // A1B5G5R5_UNORM
161 1, // A5B5G5R1_UNORM
159 1, // R8_UNORM 162 1, // R8_UNORM
160 1, // R8_SNORM 163 1, // R8_SNORM
161 1, // R8_SINT 164 1, // R8_SINT
@@ -213,6 +216,7 @@ constexpr std::array<u32, MaxPixelFormat> BLOCK_WIDTH_TABLE = {{
213 4, // BC3_SRGB 216 4, // BC3_SRGB
214 4, // BC7_SRGB 217 4, // BC7_SRGB
215 1, // A4B4G4R4_UNORM 218 1, // A4B4G4R4_UNORM
219 1, // R4G4_UNORM
216 4, // ASTC_2D_4X4_SRGB 220 4, // ASTC_2D_4X4_SRGB
217 8, // ASTC_2D_8X8_SRGB 221 8, // ASTC_2D_8X8_SRGB
218 8, // ASTC_2D_8X5_SRGB 222 8, // ASTC_2D_8X5_SRGB
@@ -256,6 +260,7 @@ constexpr std::array<u32, MaxPixelFormat> BLOCK_HEIGHT_TABLE = {{
256 1, // A2B10G10R10_UNORM 260 1, // A2B10G10R10_UNORM
257 1, // A2B10G10R10_UINT 261 1, // A2B10G10R10_UINT
258 1, // A1B5G5R5_UNORM 262 1, // A1B5G5R5_UNORM
263 1, // A5B5G5R1_UNORM
259 1, // R8_UNORM 264 1, // R8_UNORM
260 1, // R8_SNORM 265 1, // R8_SNORM
261 1, // R8_SINT 266 1, // R8_SINT
@@ -313,6 +318,7 @@ constexpr std::array<u32, MaxPixelFormat> BLOCK_HEIGHT_TABLE = {{
313 4, // BC3_SRGB 318 4, // BC3_SRGB
314 4, // BC7_SRGB 319 4, // BC7_SRGB
315 1, // A4B4G4R4_UNORM 320 1, // A4B4G4R4_UNORM
321 1, // R4G4_UNORM
316 4, // ASTC_2D_4X4_SRGB 322 4, // ASTC_2D_4X4_SRGB
317 8, // ASTC_2D_8X8_SRGB 323 8, // ASTC_2D_8X8_SRGB
318 5, // ASTC_2D_8X5_SRGB 324 5, // ASTC_2D_8X5_SRGB
@@ -356,6 +362,7 @@ constexpr std::array<u32, MaxPixelFormat> BITS_PER_BLOCK_TABLE = {{
356 32, // A2B10G10R10_UNORM 362 32, // A2B10G10R10_UNORM
357 32, // A2B10G10R10_UINT 363 32, // A2B10G10R10_UINT
358 16, // A1B5G5R5_UNORM 364 16, // A1B5G5R5_UNORM
365 16, // A5B5G5R1_UNORM
359 8, // R8_UNORM 366 8, // R8_UNORM
360 8, // R8_SNORM 367 8, // R8_SNORM
361 8, // R8_SINT 368 8, // R8_SINT
@@ -413,6 +420,7 @@ constexpr std::array<u32, MaxPixelFormat> BITS_PER_BLOCK_TABLE = {{
413 128, // BC3_SRGB 420 128, // BC3_SRGB
414 128, // BC7_UNORM 421 128, // BC7_UNORM
415 16, // A4B4G4R4_UNORM 422 16, // A4B4G4R4_UNORM
423 8, // R4G4_UNORM
416 128, // ASTC_2D_4X4_SRGB 424 128, // ASTC_2D_4X4_SRGB
417 128, // ASTC_2D_8X8_SRGB 425 128, // ASTC_2D_8X8_SRGB
418 128, // ASTC_2D_8X5_SRGB 426 128, // ASTC_2D_8X5_SRGB
diff --git a/src/video_core/texture_cache/format_lookup_table.cpp b/src/video_core/texture_cache/format_lookup_table.cpp
index afa807d5d..20e64a7c2 100644
--- a/src/video_core/texture_cache/format_lookup_table.cpp
+++ b/src/video_core/texture_cache/format_lookup_table.cpp
@@ -63,6 +63,10 @@ PixelFormat PixelFormatFromTextureInfo(TextureFormat format, ComponentType red,
63 return PixelFormat::A1B5G5R5_UNORM; 63 return PixelFormat::A1B5G5R5_UNORM;
64 case Hash(TextureFormat::A4B4G4R4, UNORM): 64 case Hash(TextureFormat::A4B4G4R4, UNORM):
65 return PixelFormat::A4B4G4R4_UNORM; 65 return PixelFormat::A4B4G4R4_UNORM;
66 case Hash(TextureFormat::G4R4, UNORM):
67 return PixelFormat::R4G4_UNORM;
68 case Hash(TextureFormat::A5B5G5R1, UNORM):
69 return PixelFormat::A5B5G5R1_UNORM;
66 case Hash(TextureFormat::R8, UNORM): 70 case Hash(TextureFormat::R8, UNORM):
67 return PixelFormat::R8_UNORM; 71 return PixelFormat::R8_UNORM;
68 case Hash(TextureFormat::R8, SNORM): 72 case Hash(TextureFormat::R8, SNORM):
@@ -143,6 +147,8 @@ PixelFormat PixelFormatFromTextureInfo(TextureFormat format, ComponentType red,
143 return PixelFormat::S8_UINT_D24_UNORM; 147 return PixelFormat::S8_UINT_D24_UNORM;
144 case Hash(TextureFormat::R8G24, UINT, UNORM, UNORM, UNORM, LINEAR): 148 case Hash(TextureFormat::R8G24, UINT, UNORM, UNORM, UNORM, LINEAR):
145 return PixelFormat::S8_UINT_D24_UNORM; 149 return PixelFormat::S8_UINT_D24_UNORM;
150 case Hash(TextureFormat::D24S8, UNORM, UINT, UINT, UINT, LINEAR):
151 return PixelFormat::D24_UNORM_S8_UINT;
146 case Hash(TextureFormat::D32S8, FLOAT, UINT, UNORM, UNORM, LINEAR): 152 case Hash(TextureFormat::D32S8, FLOAT, UINT, UNORM, UNORM, LINEAR):
147 return PixelFormat::D32_FLOAT_S8_UINT; 153 return PixelFormat::D32_FLOAT_S8_UINT;
148 case Hash(TextureFormat::BC1_RGBA, UNORM, LINEAR): 154 case Hash(TextureFormat::BC1_RGBA, UNORM, LINEAR):
diff --git a/src/video_core/texture_cache/formatter.h b/src/video_core/texture_cache/formatter.h
index b2c81057b..6f5afc5a9 100644
--- a/src/video_core/texture_cache/formatter.h
+++ b/src/video_core/texture_cache/formatter.h
@@ -38,6 +38,8 @@ struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::str
38 return "A2B10G10R10_UINT"; 38 return "A2B10G10R10_UINT";
39 case PixelFormat::A1B5G5R5_UNORM: 39 case PixelFormat::A1B5G5R5_UNORM:
40 return "A1B5G5R5_UNORM"; 40 return "A1B5G5R5_UNORM";
41 case PixelFormat::A5B5G5R1_UNORM:
42 return "A5B5G5R1_UNORM";
41 case PixelFormat::R8_UNORM: 43 case PixelFormat::R8_UNORM:
42 return "R8_UNORM"; 44 return "R8_UNORM";
43 case PixelFormat::R8_SNORM: 45 case PixelFormat::R8_SNORM:
@@ -152,6 +154,8 @@ struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::str
152 return "BC7_SRGB"; 154 return "BC7_SRGB";
153 case PixelFormat::A4B4G4R4_UNORM: 155 case PixelFormat::A4B4G4R4_UNORM:
154 return "A4B4G4R4_UNORM"; 156 return "A4B4G4R4_UNORM";
157 case PixelFormat::R4G4_UNORM:
158 return "R4G4_UNORM";
155 case PixelFormat::ASTC_2D_4X4_SRGB: 159 case PixelFormat::ASTC_2D_4X4_SRGB:
156 return "ASTC_2D_4X4_SRGB"; 160 return "ASTC_2D_4X4_SRGB";
157 case PixelFormat::ASTC_2D_8X8_SRGB: 161 case PixelFormat::ASTC_2D_8X8_SRGB:
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp
index f3a05ada9..bd05a1f84 100644
--- a/src/video_core/vulkan_common/vulkan_device.cpp
+++ b/src/video_core/vulkan_common/vulkan_device.cpp
@@ -45,6 +45,12 @@ constexpr std::array B5G6R5_UNORM_PACK16{
45 VK_FORMAT_R5G6B5_UNORM_PACK16, 45 VK_FORMAT_R5G6B5_UNORM_PACK16,
46 VK_FORMAT_UNDEFINED, 46 VK_FORMAT_UNDEFINED,
47}; 47};
48
49constexpr std::array R4G4_UNORM_PACK8{
50 VK_FORMAT_R8_UNORM,
51 VK_FORMAT_UNDEFINED,
52};
53
48} // namespace Alternatives 54} // namespace Alternatives
49 55
50enum class NvidiaArchitecture { 56enum class NvidiaArchitecture {
@@ -95,6 +101,8 @@ constexpr const VkFormat* GetFormatAlternatives(VkFormat format) {
95 return Alternatives::DEPTH16_UNORM_STENCIL8_UINT.data(); 101 return Alternatives::DEPTH16_UNORM_STENCIL8_UINT.data();
96 case VK_FORMAT_B5G6R5_UNORM_PACK16: 102 case VK_FORMAT_B5G6R5_UNORM_PACK16:
97 return Alternatives::B5G6R5_UNORM_PACK16.data(); 103 return Alternatives::B5G6R5_UNORM_PACK16.data();
104 case VK_FORMAT_R4G4_UNORM_PACK8:
105 return Alternatives::R4G4_UNORM_PACK8.data();
98 default: 106 default:
99 return nullptr; 107 return nullptr;
100 } 108 }
@@ -122,6 +130,8 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica
122 VK_FORMAT_A8B8G8R8_SRGB_PACK32, 130 VK_FORMAT_A8B8G8R8_SRGB_PACK32,
123 VK_FORMAT_R5G6B5_UNORM_PACK16, 131 VK_FORMAT_R5G6B5_UNORM_PACK16,
124 VK_FORMAT_B5G6R5_UNORM_PACK16, 132 VK_FORMAT_B5G6R5_UNORM_PACK16,
133 VK_FORMAT_R5G5B5A1_UNORM_PACK16,
134 VK_FORMAT_B5G5R5A1_UNORM_PACK16,
125 VK_FORMAT_A2B10G10R10_UNORM_PACK32, 135 VK_FORMAT_A2B10G10R10_UNORM_PACK32,
126 VK_FORMAT_A2B10G10R10_UINT_PACK32, 136 VK_FORMAT_A2B10G10R10_UINT_PACK32,
127 VK_FORMAT_A1R5G5B5_UNORM_PACK16, 137 VK_FORMAT_A1R5G5B5_UNORM_PACK16,
@@ -160,7 +170,9 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica
160 VK_FORMAT_R16G16B16A16_SFLOAT, 170 VK_FORMAT_R16G16B16A16_SFLOAT,
161 VK_FORMAT_B8G8R8A8_UNORM, 171 VK_FORMAT_B8G8R8A8_UNORM,
162 VK_FORMAT_B8G8R8A8_SRGB, 172 VK_FORMAT_B8G8R8A8_SRGB,
173 VK_FORMAT_R4G4_UNORM_PACK8,
163 VK_FORMAT_R4G4B4A4_UNORM_PACK16, 174 VK_FORMAT_R4G4B4A4_UNORM_PACK16,
175 VK_FORMAT_B4G4R4A4_UNORM_PACK16,
164 VK_FORMAT_D32_SFLOAT, 176 VK_FORMAT_D32_SFLOAT,
165 VK_FORMAT_D16_UNORM, 177 VK_FORMAT_D16_UNORM,
166 VK_FORMAT_S8_UINT, 178 VK_FORMAT_S8_UINT,