videocore/renderer_opengl/gl_rasterizer_cache: Move bits per pixel table out of function (#5101)

* videocore/renderer_opengl/gl_rasterizer_cache: Move bits per pixel table out of function

GCC and MSVC copy the table at runtime with the old implementation, which is wasteful and prevents inlining. Unfortunately, static constexpr variables are not legal in constexpr functions, so the table has to be external.
Also replaced non-standard assert with DEBUG_ASSERT_MSG.

* fix case of table name in assert

* set table to private
This commit is contained in:
Marshall Mohror 2020-02-22 15:37:42 -06:00 committed by GitHub
parent 55ec7031cc
commit 688e44bc8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 27 additions and 23 deletions

View File

@ -101,6 +101,29 @@ enum class ScaleMatch {
}; };
struct SurfaceParams { struct SurfaceParams {
private:
static constexpr std::array<unsigned int, 18> BPP_TABLE = {
32, // RGBA8
24, // RGB8
16, // RGB5A1
16, // RGB565
16, // RGBA4
16, // IA8
16, // RG8
8, // I8
8, // A8
8, // IA4
4, // I4
4, // A4
4, // ETC1
8, // ETC1A4
16, // D16
0,
24, // D24
32, // D24S8
};
public:
enum class PixelFormat { enum class PixelFormat {
// First 5 formats are shared between textures and color buffers // First 5 formats are shared between textures and color buffers
RGBA8 = 0, RGBA8 = 0,
@ -139,30 +162,11 @@ struct SurfaceParams {
}; };
static constexpr unsigned int GetFormatBpp(PixelFormat format) { static constexpr unsigned int GetFormatBpp(PixelFormat format) {
constexpr std::array<unsigned int, 18> bpp_table = { const auto format_idx = static_cast<std::size_t>(format);
32, // RGBA8 DEBUG_ASSERT_MSG(format_idx < BPP_TABLE.size(), "Invalid pixel format {}", format_idx);
24, // RGB8 return BPP_TABLE[format_idx];
16, // RGB5A1
16, // RGB565
16, // RGBA4
16, // IA8
16, // RG8
8, // I8
8, // A8
8, // IA4
4, // I4
4, // A4
4, // ETC1
8, // ETC1A4
16, // D16
0,
24, // D24
32, // D24S8
};
assert(static_cast<std::size_t>(format) < bpp_table.size());
return bpp_table[static_cast<std::size_t>(format)];
} }
unsigned int GetFormatBpp() const { unsigned int GetFormatBpp() const {
return GetFormatBpp(pixel_format); return GetFormatBpp(pixel_format);
} }