1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-22 18:53:28 +01:00

rsx/common: Use typed enum for max anisotropy.

This commit is contained in:
Vincent Lejeune 2016-03-30 19:20:39 +02:00
parent 7f25720bd3
commit d971c4e0f6
10 changed files with 82 additions and 52 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -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";
}

View File

@ -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

View File

@ -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);

View File

@ -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)
{

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -16,7 +16,7 @@ namespace vk
std::tuple<VkFilter, VkSamplerMipmapMode> 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);
}