You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
8.1 KiB
208 lines
8.1 KiB
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
// SPDX-FileCopyrightText: 2014 Citra Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <climits>
|
|
#include <utility>
|
|
#include "common/assert.h"
|
|
#include "common/common_types.h"
|
|
#include "common/logging/log.h"
|
|
#include "video_core/gpu.h"
|
|
#include "video_core/textures/texture.h"
|
|
|
|
namespace VideoCore::Surface {
|
|
|
|
#define PIXEL_FORMAT_LIST \
|
|
PIXEL_FORMAT_ELEM(A8B8G8R8_UNORM, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(A8B8G8R8_SNORM, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(A8B8G8R8_SINT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(A8B8G8R8_UINT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R5G6B5_UNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(B5G6R5_UNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(A1R5G5B5_UNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(A2B10G10R10_UNORM, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(A2B10G10R10_UINT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(A2R10G10B10_UNORM, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(A1B5G5R5_UNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(A5B5G5R1_UNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(R8_UNORM, 1, 1, 8) \
|
|
PIXEL_FORMAT_ELEM(R8_SNORM, 1, 1, 8) \
|
|
PIXEL_FORMAT_ELEM(R8_SINT, 1, 1, 8) \
|
|
PIXEL_FORMAT_ELEM(R8_UINT, 1, 1, 8) \
|
|
PIXEL_FORMAT_ELEM(R16G16B16A16_FLOAT, 1, 1, 64) \
|
|
PIXEL_FORMAT_ELEM(R16G16B16A16_UNORM, 1, 1, 64) \
|
|
PIXEL_FORMAT_ELEM(R16G16B16A16_SNORM, 1, 1, 64) \
|
|
PIXEL_FORMAT_ELEM(R16G16B16A16_SINT, 1, 1, 64) \
|
|
PIXEL_FORMAT_ELEM(R16G16B16A16_UINT, 1, 1, 64) \
|
|
PIXEL_FORMAT_ELEM(B10G11R11_FLOAT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R32G32B32A32_UINT, 1, 1, 128) \
|
|
PIXEL_FORMAT_ELEM(BC1_RGBA_UNORM, 4, 4, 64) \
|
|
PIXEL_FORMAT_ELEM(BC2_UNORM, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(BC3_UNORM, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(BC4_UNORM, 4, 4, 64) \
|
|
PIXEL_FORMAT_ELEM(BC4_SNORM, 4, 4, 64) \
|
|
PIXEL_FORMAT_ELEM(BC5_UNORM, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(BC5_SNORM, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(BC7_UNORM, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(BC6H_UFLOAT, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(BC6H_SFLOAT, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_4X4_UNORM, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(B8G8R8A8_UNORM, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R32G32B32A32_FLOAT, 1, 1, 128) \
|
|
PIXEL_FORMAT_ELEM(R32G32B32A32_SINT, 1, 1, 128) \
|
|
PIXEL_FORMAT_ELEM(R32G32_FLOAT, 1, 1, 64) \
|
|
PIXEL_FORMAT_ELEM(R32G32_SINT, 1, 1, 64) \
|
|
PIXEL_FORMAT_ELEM(R32_FLOAT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R16_FLOAT, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(R16_UNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(R16_SNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(R16_UINT, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(R16_SINT, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(R16G16_UNORM, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R16G16_FLOAT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R16G16_UINT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R16G16_SINT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R16G16_SNORM, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R32G32B32_FLOAT, 1, 1, 96) \
|
|
PIXEL_FORMAT_ELEM(A8B8G8R8_SRGB, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R8G8_UNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(R8G8_SNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(R8G8_SINT, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(R8G8_UINT, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(R32G32_UINT, 1, 1, 64) \
|
|
PIXEL_FORMAT_ELEM(R16G16B16X16_FLOAT, 1, 1, 64) \
|
|
PIXEL_FORMAT_ELEM(R32_UINT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(R32_SINT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_8X8_UNORM, 8, 8, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_8X5_UNORM, 8, 5, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_5X4_UNORM, 5, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(B8G8R8A8_SRGB, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(BC1_RGBA_SRGB, 4, 4, 64) \
|
|
PIXEL_FORMAT_ELEM(BC2_SRGB, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(BC3_SRGB, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(BC7_SRGB, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(A4B4G4R4_UNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(G4R4_UNORM, 1, 1, 8) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_4X4_SRGB, 4, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_8X8_SRGB, 8, 8, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_8X5_SRGB, 8, 5, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_5X4_SRGB, 5, 4, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_5X5_UNORM, 5, 5, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_5X5_SRGB, 5, 5, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_10X8_UNORM, 10, 8, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_10X8_SRGB, 10, 8, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_6X6_UNORM, 6, 6, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_6X6_SRGB, 6, 6, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_10X6_UNORM, 10, 6, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_10X6_SRGB, 10, 6, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_10X5_UNORM, 10, 5, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_10X5_SRGB, 10, 5, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_10X10_UNORM, 10, 10, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_10X10_SRGB, 10, 10, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_12X10_UNORM, 12, 10, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_12X10_SRGB, 12, 10, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_12X12_UNORM, 12, 12, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_12X12_SRGB, 12, 12, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_8X6_UNORM, 8, 6, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_8X6_SRGB, 8, 6, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_6X5_UNORM, 6, 5, 128) \
|
|
PIXEL_FORMAT_ELEM(ASTC_2D_6X5_SRGB, 6, 5, 128) \
|
|
PIXEL_FORMAT_ELEM(E5B9G9R9_FLOAT, 1, 1, 32) \
|
|
/* Depth formats */ \
|
|
PIXEL_FORMAT_ELEM(D32_FLOAT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(D16_UNORM, 1, 1, 16) \
|
|
PIXEL_FORMAT_ELEM(X8_D24_UNORM, 1, 1, 32) \
|
|
/* Stencil formats */ \
|
|
PIXEL_FORMAT_ELEM(S8_UINT, 1, 1, 8) \
|
|
/* DepthStencil formats */ \
|
|
PIXEL_FORMAT_ELEM(D24_UNORM_S8_UINT, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(S8_UINT_D24_UNORM, 1, 1, 32) \
|
|
PIXEL_FORMAT_ELEM(D32_FLOAT_S8_UINT, 1, 1, 64)
|
|
|
|
enum class PixelFormat {
|
|
#define PIXEL_FORMAT_ELEM(name, ...) name,
|
|
PIXEL_FORMAT_LIST
|
|
#undef PIXEL_FORMAT_ELEM
|
|
MaxColorFormat = D32_FLOAT,
|
|
MaxDepthFormat = S8_UINT,
|
|
MaxStencilFormat = D24_UNORM_S8_UINT,
|
|
MaxDepthStencilFormat = u8(D32_FLOAT_S8_UINT) + 1,
|
|
Max = MaxDepthStencilFormat,
|
|
Invalid = 255,
|
|
};
|
|
constexpr std::size_t MaxPixelFormat = std::size_t(PixelFormat::Max);
|
|
|
|
enum class SurfaceType {
|
|
ColorTexture = 0,
|
|
Depth = 1,
|
|
Stencil = 2,
|
|
DepthStencil = 3,
|
|
Invalid = 4,
|
|
};
|
|
|
|
enum class SurfaceTarget {
|
|
Texture1D,
|
|
TextureBuffer,
|
|
Texture2D,
|
|
Texture3D,
|
|
Texture1DArray,
|
|
Texture2DArray,
|
|
TextureCubemap,
|
|
TextureCubeArray,
|
|
};
|
|
|
|
constexpr u32 DefaultBlockWidth(PixelFormat format) noexcept {
|
|
switch (format) {
|
|
#define PIXEL_FORMAT_ELEM(name, width, height, bits) case PixelFormat::name: return width;
|
|
PIXEL_FORMAT_LIST
|
|
#undef PIXEL_FORMAT_ELEM
|
|
default: UNREACHABLE();
|
|
}
|
|
}
|
|
|
|
constexpr u32 DefaultBlockHeight(PixelFormat format) noexcept {
|
|
switch (format) {
|
|
#define PIXEL_FORMAT_ELEM(name, width, height, bits) case PixelFormat::name: return height;
|
|
PIXEL_FORMAT_LIST
|
|
#undef PIXEL_FORMAT_ELEM
|
|
default: UNREACHABLE();
|
|
}
|
|
}
|
|
|
|
constexpr u32 BitsPerBlock(PixelFormat format) noexcept {
|
|
switch (format) {
|
|
#define PIXEL_FORMAT_ELEM(name, width, height, bits) case PixelFormat::name: return bits;
|
|
PIXEL_FORMAT_LIST
|
|
#undef PIXEL_FORMAT_ELEM
|
|
default: UNREACHABLE();
|
|
}
|
|
}
|
|
|
|
#undef PIXEL_FORMAT_LIST
|
|
|
|
/// Returns the sizer in bytes of the specified pixel format
|
|
constexpr u32 BytesPerBlock(PixelFormat pixel_format) {
|
|
return BitsPerBlock(pixel_format) / CHAR_BIT;
|
|
}
|
|
|
|
SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_type);
|
|
bool SurfaceTargetIsLayered(SurfaceTarget target);
|
|
bool SurfaceTargetIsArray(SurfaceTarget target);
|
|
PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format);
|
|
PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format);
|
|
PixelFormat PixelFormatFromGPUPixelFormat(Service::android::PixelFormat format);
|
|
SurfaceType GetFormatType(PixelFormat pixel_format);
|
|
bool HasAlpha(PixelFormat pixel_format);
|
|
bool IsPixelFormatASTC(PixelFormat format);
|
|
bool IsPixelFormatBCn(PixelFormat format);
|
|
bool IsPixelFormatSRGB(PixelFormat format);
|
|
bool IsPixelFormatInteger(PixelFormat format);
|
|
bool IsPixelFormatSignedInteger(PixelFormat format);
|
|
size_t PixelComponentSizeBitsInteger(PixelFormat format);
|
|
std::pair<u32, u32> GetASTCBlockSize(PixelFormat format);
|
|
u64 TranscodedAstcSize(u64 base_size, PixelFormat format);
|
|
|
|
} // namespace VideoCore::Surface
|