From d971c4e0f6f684182fa657b3eb0882de0eb7e19d Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Wed, 30 Mar 2016 19:20:39 +0200 Subject: [PATCH] rsx/common: Use typed enum for max anisotropy. --- rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp | 18 ++++++------ rpcs3/Emu/RSX/D3D12/D3D12Formats.h | 2 +- rpcs3/Emu/RSX/GCM.cpp | 44 ++++++++++++++++++++++------ rpcs3/Emu/RSX/GCM.h | 24 ++++++++------- rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp | 18 ++++++------ rpcs3/Emu/RSX/GL/rsx_gl_texture.h | 2 +- rpcs3/Emu/RSX/RSXTexture.cpp | 4 +-- rpcs3/Emu/RSX/RSXTexture.h | 2 +- rpcs3/Emu/RSX/VK/VKFormats.cpp | 18 ++++++------ rpcs3/Emu/RSX/VK/VKFormats.h | 2 +- 10 files changed, 82 insertions(+), 52 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp index 14c2088732..27c07f4d90 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp @@ -172,18 +172,18 @@ DXGI_FORMAT get_texture_format(u8 format) throw EXCEPTION("Invalid or unsupported texture format (0x%x)", format); } -UINT get_texture_max_aniso(u8 aniso) +UINT get_texture_max_aniso(rsx::texture_max_anisotropy aniso) { switch (aniso) { - case CELL_GCM_TEXTURE_MAX_ANISO_1: return 1; - case CELL_GCM_TEXTURE_MAX_ANISO_2: return 2; - case CELL_GCM_TEXTURE_MAX_ANISO_4: return 4; - case CELL_GCM_TEXTURE_MAX_ANISO_6: return 6; - case CELL_GCM_TEXTURE_MAX_ANISO_8: return 8; - case CELL_GCM_TEXTURE_MAX_ANISO_10: return 10; - case CELL_GCM_TEXTURE_MAX_ANISO_12: return 12; - case CELL_GCM_TEXTURE_MAX_ANISO_16: return 16; + case rsx::texture_max_anisotropy::x1: return 1; + case rsx::texture_max_anisotropy::x2: return 2; + case rsx::texture_max_anisotropy::x4: return 4; + case rsx::texture_max_anisotropy::x6: return 6; + case rsx::texture_max_anisotropy::x8: return 8; + case rsx::texture_max_anisotropy::x10: return 10; + case rsx::texture_max_anisotropy::x12: return 12; + case rsx::texture_max_anisotropy::x16: return 16; } throw EXCEPTION("Invalid texture max aniso (0x%x)", aniso); } diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Formats.h b/rpcs3/Emu/RSX/D3D12/D3D12Formats.h index 38bc5a5291..0eebbf541b 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Formats.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12Formats.h @@ -41,7 +41,7 @@ DXGI_FORMAT get_texture_format(u8 format); /** * Convert texture aniso value to UINT. */ -UINT get_texture_max_aniso(u8 aniso); +UINT get_texture_max_aniso(rsx::texture_max_anisotropy aniso); /** * Convert texture wrap mode to D3D12_TEXTURE_ADDRESS_MODE diff --git a/rpcs3/Emu/RSX/GCM.cpp b/rpcs3/Emu/RSX/GCM.cpp index 211bf0a24c..57dc4d0e40 100644 --- a/rpcs3/Emu/RSX/GCM.cpp +++ b/rpcs3/Emu/RSX/GCM.cpp @@ -886,6 +886,16 @@ enum CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP_TO_EDGE = 6, CELL_GCM_TEXTURE_MIRROR_ONCE_BORDER = 7, CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP = 8, + + // Max Anisotropy + CELL_GCM_TEXTURE_MAX_ANISO_1 = 0, + CELL_GCM_TEXTURE_MAX_ANISO_2 = 1, + CELL_GCM_TEXTURE_MAX_ANISO_4 = 2, + CELL_GCM_TEXTURE_MAX_ANISO_6 = 3, + CELL_GCM_TEXTURE_MAX_ANISO_8 = 4, + CELL_GCM_TEXTURE_MAX_ANISO_10 = 5, + CELL_GCM_TEXTURE_MAX_ANISO_12 = 6, + CELL_GCM_TEXTURE_MAX_ANISO_16 = 7, }; rsx::texture_wrap_mode rsx::to_texture_wrap_mode(u8 in) @@ -904,6 +914,22 @@ rsx::texture_wrap_mode rsx::to_texture_wrap_mode(u8 in) throw EXCEPTION("Unknow wrap mode %x", in); } +rsx::texture_max_anisotropy rsx::to_texture_max_anisotropy(u8 in) +{ + switch (in) + { + case CELL_GCM_TEXTURE_MAX_ANISO_1: return rsx::texture_max_anisotropy::x1; + case CELL_GCM_TEXTURE_MAX_ANISO_2: return rsx::texture_max_anisotropy::x2; + case CELL_GCM_TEXTURE_MAX_ANISO_4: return rsx::texture_max_anisotropy::x4; + case CELL_GCM_TEXTURE_MAX_ANISO_6: return rsx::texture_max_anisotropy::x6; + case CELL_GCM_TEXTURE_MAX_ANISO_8: return rsx::texture_max_anisotropy::x8; + case CELL_GCM_TEXTURE_MAX_ANISO_10: return rsx::texture_max_anisotropy::x10; + case CELL_GCM_TEXTURE_MAX_ANISO_12: return rsx::texture_max_anisotropy::x12; + case CELL_GCM_TEXTURE_MAX_ANISO_16: return rsx::texture_max_anisotropy::x16; + } + throw EXCEPTION("Unknow anisotropy max mode %x", in); +} + rsx::surface_target rsx::to_surface_target(u8 in) { switch (in) @@ -1335,16 +1361,16 @@ namespace std::string get_texture_max_aniso_name(u8 aniso) { - switch (aniso) + switch (rsx::to_texture_max_anisotropy(aniso)) { - case CELL_GCM_TEXTURE_MAX_ANISO_1: return "1"; - case CELL_GCM_TEXTURE_MAX_ANISO_2: return "2"; - case CELL_GCM_TEXTURE_MAX_ANISO_4: return "4"; - case CELL_GCM_TEXTURE_MAX_ANISO_6: return "6"; - case CELL_GCM_TEXTURE_MAX_ANISO_8: return "8"; - case CELL_GCM_TEXTURE_MAX_ANISO_10: return "10"; - case CELL_GCM_TEXTURE_MAX_ANISO_12: return "12"; - case CELL_GCM_TEXTURE_MAX_ANISO_16: return "16"; + case rsx::texture_max_anisotropy::x1 : return "1"; + case rsx::texture_max_anisotropy::x2: return "2"; + case rsx::texture_max_anisotropy::x4: return "4"; + case rsx::texture_max_anisotropy::x6: return "6"; + case rsx::texture_max_anisotropy::x8: return "8"; + case rsx::texture_max_anisotropy::x10: return "10"; + case rsx::texture_max_anisotropy::x12: return "12"; + case rsx::texture_max_anisotropy::x16: return "16"; } return "Error"; } diff --git a/rpcs3/Emu/RSX/GCM.h b/rpcs3/Emu/RSX/GCM.h index bf1d1653a8..4ed5c9ac4e 100644 --- a/rpcs3/Emu/RSX/GCM.h +++ b/rpcs3/Emu/RSX/GCM.h @@ -176,6 +176,20 @@ namespace rsx }; texture_wrap_mode to_texture_wrap_mode(u8 in); + + enum class texture_max_anisotropy : u8 + { + x1, + x2, + x4, + x6, + x8, + x10, + x12, + x16, + }; + + texture_max_anisotropy to_texture_max_anisotropy(u8 in); } enum @@ -252,16 +266,6 @@ enum // Normalization Flag CELL_GCM_TEXTURE_NR = 0x00, CELL_GCM_TEXTURE_UN = 0x40, - - // Max Anisotropy - CELL_GCM_TEXTURE_MAX_ANISO_1 = 0, - CELL_GCM_TEXTURE_MAX_ANISO_2 = 1, - CELL_GCM_TEXTURE_MAX_ANISO_4 = 2, - CELL_GCM_TEXTURE_MAX_ANISO_6 = 3, - CELL_GCM_TEXTURE_MAX_ANISO_8 = 4, - CELL_GCM_TEXTURE_MAX_ANISO_10 = 5, - CELL_GCM_TEXTURE_MAX_ANISO_12 = 6, - CELL_GCM_TEXTURE_MAX_ANISO_16 = 7, }; // GCM Surface diff --git a/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp b/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp index 219fe550a4..3f97a08bf1 100644 --- a/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp +++ b/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp @@ -218,18 +218,18 @@ namespace rsx return GL_REPEAT; } - float texture::max_aniso(int aniso) + float texture::max_aniso(rsx::texture_max_anisotropy aniso) { switch (aniso) { - case CELL_GCM_TEXTURE_MAX_ANISO_1: return 1.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_2: return 2.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_4: return 4.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_6: return 6.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_8: return 8.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_10: return 10.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_12: return 12.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_16: return 16.0f; + case rsx::texture_max_anisotropy::x1: return 1.0f; + case rsx::texture_max_anisotropy::x2: return 2.0f; + case rsx::texture_max_anisotropy::x4: return 4.0f; + case rsx::texture_max_anisotropy::x6: return 6.0f; + case rsx::texture_max_anisotropy::x8: return 8.0f; + case rsx::texture_max_anisotropy::x10: return 10.0f; + case rsx::texture_max_anisotropy::x12: return 12.0f; + case rsx::texture_max_anisotropy::x16: return 16.0f; } LOG_ERROR(RSX, "Texture anisotropy error: bad max aniso (%d).", aniso); diff --git a/rpcs3/Emu/RSX/GL/rsx_gl_texture.h b/rpcs3/Emu/RSX/GL/rsx_gl_texture.h index e5db9f34cc..8198e583ba 100644 --- a/rpcs3/Emu/RSX/GL/rsx_gl_texture.h +++ b/rpcs3/Emu/RSX/GL/rsx_gl_texture.h @@ -17,7 +17,7 @@ namespace rsx int gl_wrap(rsx::texture_wrap_mode in); - float max_aniso(int aniso); + float max_aniso(rsx::texture_max_anisotropy aniso); inline static u8 convert_4_to_8(u8 v) { diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index d9e5075c8c..4262aac20c 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -136,9 +136,9 @@ namespace rsx return ((method_registers[NV4097_SET_TEXTURE_CONTROL0 + (m_index * 8)] >> 7) & 0xfff); } - u8 texture::max_aniso() const + rsx::texture_max_anisotropy texture::max_aniso() const { - return ((method_registers[NV4097_SET_TEXTURE_CONTROL0 + (m_index * 8)] >> 4) & 0x7); + return rsx::to_texture_max_anisotropy((method_registers[NV4097_SET_TEXTURE_CONTROL0 + (m_index * 8)] >> 4) & 0x7); } bool texture::alpha_kill_enabled() const diff --git a/rpcs3/Emu/RSX/RSXTexture.h b/rpcs3/Emu/RSX/RSXTexture.h index 7f3584aab8..7518fb9d6c 100644 --- a/rpcs3/Emu/RSX/RSXTexture.h +++ b/rpcs3/Emu/RSX/RSXTexture.h @@ -42,7 +42,7 @@ namespace rsx bool enabled() const; u16 min_lod() const; u16 max_lod() const; - u8 max_aniso() const; + rsx::texture_max_anisotropy max_aniso() const; bool alpha_kill_enabled() const; // Control1 diff --git a/rpcs3/Emu/RSX/VK/VKFormats.cpp b/rpcs3/Emu/RSX/VK/VKFormats.cpp index d4c9732ee4..ebd7ff42df 100644 --- a/rpcs3/Emu/RSX/VK/VKFormats.cpp +++ b/rpcs3/Emu/RSX/VK/VKFormats.cpp @@ -81,18 +81,18 @@ VkSamplerAddressMode vk_wrap_mode(rsx::texture_wrap_mode gcm_wrap) throw EXCEPTION("unhandled texture clamp mode"); } -float max_aniso(u32 gcm_aniso) +float max_aniso(rsx::texture_max_anisotropy gcm_aniso) { switch (gcm_aniso) { - case CELL_GCM_TEXTURE_MAX_ANISO_1: return 1.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_2: return 2.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_4: return 4.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_6: return 6.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_8: return 8.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_10: return 10.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_12: return 12.0f; - case CELL_GCM_TEXTURE_MAX_ANISO_16: return 16.0f; + case rsx::texture_max_anisotropy::x1: return 1.0f; + case rsx::texture_max_anisotropy::x2: return 2.0f; + case rsx::texture_max_anisotropy::x4: return 4.0f; + case rsx::texture_max_anisotropy::x6: return 6.0f; + case rsx::texture_max_anisotropy::x8: return 8.0f; + case rsx::texture_max_anisotropy::x10: return 10.0f; + case rsx::texture_max_anisotropy::x12: return 12.0f; + case rsx::texture_max_anisotropy::x16: return 16.0f; } throw EXCEPTION("Texture anisotropy error: bad max aniso (%d).", gcm_aniso); diff --git a/rpcs3/Emu/RSX/VK/VKFormats.h b/rpcs3/Emu/RSX/VK/VKFormats.h index fac595ddf1..471467ece2 100644 --- a/rpcs3/Emu/RSX/VK/VKFormats.h +++ b/rpcs3/Emu/RSX/VK/VKFormats.h @@ -16,7 +16,7 @@ namespace vk std::tuple get_min_filter_and_mip(u8 min_filter); VkFilter get_mag_filter(u8 mag_filter); VkSamplerAddressMode vk_wrap_mode(rsx::texture_wrap_mode gcm_wrap); - float max_aniso(u32 gcm_aniso); + float max_aniso(rsx::texture_max_anisotropy gcm_aniso); VkComponentMapping get_component_mapping(u32 format, u8 swizzle_mask); VkPrimitiveTopology get_appropriate_topology(rsx::primitive_type& mode, bool &requires_modification); }