summaryrefslogtreecommitdiff
path: root/src/video_core/surface.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/surface.h')
-rw-r--r--src/video_core/surface.h225
1 files changed, 155 insertions, 70 deletions
diff --git a/src/video_core/surface.h b/src/video_core/surface.h
index b783e4b27..83f31c12c 100644
--- a/src/video_core/surface.h
+++ b/src/video_core/surface.h
@@ -114,6 +114,7 @@ enum class SurfaceType {
114 114
115enum class SurfaceTarget { 115enum class SurfaceTarget {
116 Texture1D, 116 Texture1D,
117 TextureBuffer,
117 Texture2D, 118 Texture2D,
118 Texture3D, 119 Texture3D,
119 Texture1DArray, 120 Texture1DArray,
@@ -122,71 +123,71 @@ enum class SurfaceTarget {
122 TextureCubeArray, 123 TextureCubeArray,
123}; 124};
124 125
125constexpr std::array<u32, MaxPixelFormat> compression_factor_table = {{ 126constexpr std::array<u32, MaxPixelFormat> compression_factor_shift_table = {{
126 1, // ABGR8U 127 0, // ABGR8U
127 1, // ABGR8S 128 0, // ABGR8S
128 1, // ABGR8UI 129 0, // ABGR8UI
129 1, // B5G6R5U 130 0, // B5G6R5U
130 1, // A2B10G10R10U 131 0, // A2B10G10R10U
131 1, // A1B5G5R5U 132 0, // A1B5G5R5U
132 1, // R8U 133 0, // R8U
133 1, // R8UI 134 0, // R8UI
134 1, // RGBA16F 135 0, // RGBA16F
135 1, // RGBA16U 136 0, // RGBA16U
136 1, // RGBA16UI 137 0, // RGBA16UI
137 1, // R11FG11FB10F 138 0, // R11FG11FB10F
138 1, // RGBA32UI 139 0, // RGBA32UI
139 4, // DXT1 140 2, // DXT1
140 4, // DXT23 141 2, // DXT23
141 4, // DXT45 142 2, // DXT45
142 4, // DXN1 143 2, // DXN1
143 4, // DXN2UNORM 144 2, // DXN2UNORM
144 4, // DXN2SNORM 145 2, // DXN2SNORM
145 4, // BC7U 146 2, // BC7U
146 4, // BC6H_UF16 147 2, // BC6H_UF16
147 4, // BC6H_SF16 148 2, // BC6H_SF16
148 4, // ASTC_2D_4X4 149 2, // ASTC_2D_4X4
149 1, // BGRA8 150 0, // BGRA8
150 1, // RGBA32F 151 0, // RGBA32F
151 1, // RG32F 152 0, // RG32F
152 1, // R32F 153 0, // R32F
153 1, // R16F 154 0, // R16F
154 1, // R16U 155 0, // R16U
155 1, // R16S 156 0, // R16S
156 1, // R16UI 157 0, // R16UI
157 1, // R16I 158 0, // R16I
158 1, // RG16 159 0, // RG16
159 1, // RG16F 160 0, // RG16F
160 1, // RG16UI 161 0, // RG16UI
161 1, // RG16I 162 0, // RG16I
162 1, // RG16S 163 0, // RG16S
163 1, // RGB32F 164 0, // RGB32F
164 1, // RGBA8_SRGB 165 0, // RGBA8_SRGB
165 1, // RG8U 166 0, // RG8U
166 1, // RG8S 167 0, // RG8S
167 1, // RG32UI 168 0, // RG32UI
168 1, // R32UI 169 0, // R32UI
169 4, // ASTC_2D_8X8 170 2, // ASTC_2D_8X8
170 4, // ASTC_2D_8X5 171 2, // ASTC_2D_8X5
171 4, // ASTC_2D_5X4 172 2, // ASTC_2D_5X4
172 1, // BGRA8_SRGB 173 0, // BGRA8_SRGB
173 4, // DXT1_SRGB 174 2, // DXT1_SRGB
174 4, // DXT23_SRGB 175 2, // DXT23_SRGB
175 4, // DXT45_SRGB 176 2, // DXT45_SRGB
176 4, // BC7U_SRGB 177 2, // BC7U_SRGB
177 4, // ASTC_2D_4X4_SRGB 178 2, // ASTC_2D_4X4_SRGB
178 4, // ASTC_2D_8X8_SRGB 179 2, // ASTC_2D_8X8_SRGB
179 4, // ASTC_2D_8X5_SRGB 180 2, // ASTC_2D_8X5_SRGB
180 4, // ASTC_2D_5X4_SRGB 181 2, // ASTC_2D_5X4_SRGB
181 4, // ASTC_2D_5X5 182 2, // ASTC_2D_5X5
182 4, // ASTC_2D_5X5_SRGB 183 2, // ASTC_2D_5X5_SRGB
183 4, // ASTC_2D_10X8 184 2, // ASTC_2D_10X8
184 4, // ASTC_2D_10X8_SRGB 185 2, // ASTC_2D_10X8_SRGB
185 1, // Z32F 186 0, // Z32F
186 1, // Z16 187 0, // Z16
187 1, // Z24S8 188 0, // Z24S8
188 1, // S8Z24 189 0, // S8Z24
189 1, // Z32FS8 190 0, // Z32FS8
190}}; 191}};
191 192
192/** 193/**
@@ -195,12 +196,14 @@ constexpr std::array<u32, MaxPixelFormat> compression_factor_table = {{
195 * compressed image. This is used for maintaining proper surface sizes for compressed 196 * compressed image. This is used for maintaining proper surface sizes for compressed
196 * texture formats. 197 * texture formats.
197 */ 198 */
198static constexpr u32 GetCompressionFactor(PixelFormat format) { 199inline constexpr u32 GetCompressionFactorShift(PixelFormat format) {
199 if (format == PixelFormat::Invalid) 200 DEBUG_ASSERT(format != PixelFormat::Invalid);
200 return 0; 201 DEBUG_ASSERT(static_cast<std::size_t>(format) < compression_factor_shift_table.size());
202 return compression_factor_shift_table[static_cast<std::size_t>(format)];
203}
201 204
202 ASSERT(static_cast<std::size_t>(format) < compression_factor_table.size()); 205inline constexpr u32 GetCompressionFactor(PixelFormat format) {
203 return compression_factor_table[static_cast<std::size_t>(format)]; 206 return 1U << GetCompressionFactorShift(format);
204} 207}
205 208
206constexpr std::array<u32, MaxPixelFormat> block_width_table = {{ 209constexpr std::array<u32, MaxPixelFormat> block_width_table = {{
@@ -436,6 +439,88 @@ static constexpr u32 GetBytesPerPixel(PixelFormat pixel_format) {
436 return GetFormatBpp(pixel_format) / CHAR_BIT; 439 return GetFormatBpp(pixel_format) / CHAR_BIT;
437} 440}
438 441
442enum class SurfaceCompression {
443 None, // Not compressed
444 Compressed, // Texture is compressed
445 Converted, // Texture is converted before upload or after download
446 Rearranged, // Texture is swizzled before upload or after download
447};
448
449constexpr std::array<SurfaceCompression, MaxPixelFormat> compression_type_table = {{
450 SurfaceCompression::None, // ABGR8U
451 SurfaceCompression::None, // ABGR8S
452 SurfaceCompression::None, // ABGR8UI
453 SurfaceCompression::None, // B5G6R5U
454 SurfaceCompression::None, // A2B10G10R10U
455 SurfaceCompression::None, // A1B5G5R5U
456 SurfaceCompression::None, // R8U
457 SurfaceCompression::None, // R8UI
458 SurfaceCompression::None, // RGBA16F
459 SurfaceCompression::None, // RGBA16U
460 SurfaceCompression::None, // RGBA16UI
461 SurfaceCompression::None, // R11FG11FB10F
462 SurfaceCompression::None, // RGBA32UI
463 SurfaceCompression::Compressed, // DXT1
464 SurfaceCompression::Compressed, // DXT23
465 SurfaceCompression::Compressed, // DXT45
466 SurfaceCompression::Compressed, // DXN1
467 SurfaceCompression::Compressed, // DXN2UNORM
468 SurfaceCompression::Compressed, // DXN2SNORM
469 SurfaceCompression::Compressed, // BC7U
470 SurfaceCompression::Compressed, // BC6H_UF16
471 SurfaceCompression::Compressed, // BC6H_SF16
472 SurfaceCompression::Converted, // ASTC_2D_4X4
473 SurfaceCompression::None, // BGRA8
474 SurfaceCompression::None, // RGBA32F
475 SurfaceCompression::None, // RG32F
476 SurfaceCompression::None, // R32F
477 SurfaceCompression::None, // R16F
478 SurfaceCompression::None, // R16U
479 SurfaceCompression::None, // R16S
480 SurfaceCompression::None, // R16UI
481 SurfaceCompression::None, // R16I
482 SurfaceCompression::None, // RG16
483 SurfaceCompression::None, // RG16F
484 SurfaceCompression::None, // RG16UI
485 SurfaceCompression::None, // RG16I
486 SurfaceCompression::None, // RG16S
487 SurfaceCompression::None, // RGB32F
488 SurfaceCompression::None, // RGBA8_SRGB
489 SurfaceCompression::None, // RG8U
490 SurfaceCompression::None, // RG8S
491 SurfaceCompression::None, // RG32UI
492 SurfaceCompression::None, // R32UI
493 SurfaceCompression::Converted, // ASTC_2D_8X8
494 SurfaceCompression::Converted, // ASTC_2D_8X5
495 SurfaceCompression::Converted, // ASTC_2D_5X4
496 SurfaceCompression::None, // BGRA8_SRGB
497 SurfaceCompression::Compressed, // DXT1_SRGB
498 SurfaceCompression::Compressed, // DXT23_SRGB
499 SurfaceCompression::Compressed, // DXT45_SRGB
500 SurfaceCompression::Compressed, // BC7U_SRGB
501 SurfaceCompression::Converted, // ASTC_2D_4X4_SRGB
502 SurfaceCompression::Converted, // ASTC_2D_8X8_SRGB
503 SurfaceCompression::Converted, // ASTC_2D_8X5_SRGB
504 SurfaceCompression::Converted, // ASTC_2D_5X4_SRGB
505 SurfaceCompression::Converted, // ASTC_2D_5X5
506 SurfaceCompression::Converted, // ASTC_2D_5X5_SRGB
507 SurfaceCompression::Converted, // ASTC_2D_10X8
508 SurfaceCompression::Converted, // ASTC_2D_10X8_SRGB
509 SurfaceCompression::None, // Z32F
510 SurfaceCompression::None, // Z16
511 SurfaceCompression::None, // Z24S8
512 SurfaceCompression::Rearranged, // S8Z24
513 SurfaceCompression::None, // Z32FS8
514}};
515
516constexpr SurfaceCompression GetFormatCompressionType(PixelFormat format) {
517 if (format == PixelFormat::Invalid) {
518 return SurfaceCompression::None;
519 }
520 DEBUG_ASSERT(static_cast<std::size_t>(format) < compression_type_table.size());
521 return compression_type_table[static_cast<std::size_t>(format)];
522}
523
439SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_type); 524SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_type);
440 525
441bool SurfaceTargetIsLayered(SurfaceTarget target); 526bool SurfaceTargetIsLayered(SurfaceTarget target);