mirror of
https://github.com/RPCS3/rsx_program_decompiler.git
synced 2026-01-31 01:25:19 +01:00
Fragment program: use predefined texture fetch functions
This commit is contained in:
@@ -156,7 +156,16 @@ namespace rsx
|
||||
}
|
||||
};
|
||||
|
||||
struct alignas(8) program_state
|
||||
enum class texture_target : std::uint8_t
|
||||
{
|
||||
none,
|
||||
_1,
|
||||
_2,
|
||||
_3,
|
||||
cube
|
||||
};
|
||||
|
||||
struct alignas(4) program_state
|
||||
{
|
||||
std::uint32_t input_attributes;
|
||||
std::uint32_t output_attributes;
|
||||
@@ -165,6 +174,7 @@ namespace rsx
|
||||
std::uint32_t is_array;
|
||||
std::uint32_t is_int;
|
||||
std::uint16_t frequency[16];
|
||||
texture_target textures[16];
|
||||
|
||||
bool operator ==(const program_state &rhs) const
|
||||
{
|
||||
|
||||
@@ -19,6 +19,9 @@ namespace rsx
|
||||
template<int Count>
|
||||
using float_point_expr = typename base::template float_point_expr<Count>;
|
||||
|
||||
template<int Count>
|
||||
using integer_expr = typename base::template integer_expr<Count>;
|
||||
|
||||
using sampler2D_expr = typename base::template expression_from<typename base::sampler2D_t>;
|
||||
|
||||
template<int Count>
|
||||
@@ -69,15 +72,22 @@ namespace rsx
|
||||
{
|
||||
texture_info info;
|
||||
info.id = index;
|
||||
info.name = "texture" + std::to_string(index);
|
||||
info.name = "ftexture" + std::to_string(index);
|
||||
program.textures.insert(info);
|
||||
|
||||
return info.name;
|
||||
}
|
||||
|
||||
integer_expr<1> texture_index(int index)
|
||||
{
|
||||
texture(index);
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
float_point_expr<4> texture_coords_modifier(int index)
|
||||
{
|
||||
return{ "texture" + std::to_string(index) + "_cm" };
|
||||
return{ "ftexture" + std::to_string(index) + "_cm" };
|
||||
}
|
||||
|
||||
float_point_expr<4> input(int index)
|
||||
@@ -201,6 +211,11 @@ namespace rsx
|
||||
return context.texture(data.dst.tex_num);
|
||||
}
|
||||
|
||||
integer_expr<1> texture_index(context_t& context) const
|
||||
{
|
||||
return context.texture_index(data.dst.tex_num);
|
||||
}
|
||||
|
||||
float_point_expr<4> texture_coords_modifier(context_t& context) const
|
||||
{
|
||||
return context.texture_coords_modifier(data.dst.tex_num);
|
||||
@@ -340,6 +355,11 @@ namespace rsx
|
||||
return instruction.texture(context);
|
||||
}
|
||||
|
||||
integer_expr<1> texture_index()
|
||||
{
|
||||
return instruction.texture_index(context);
|
||||
}
|
||||
|
||||
float_point_expr<4> texture_coords(int src_index = 0)
|
||||
{
|
||||
return src(src_index) * instruction.texture_coords_modifier(context);
|
||||
@@ -605,9 +625,9 @@ namespace rsx
|
||||
case (u32)opcode_t::up4: return base::unimplemented("UP4");
|
||||
//case (u32)opcode_t::ddx: return set_dst(base::ddx(src(0).xy()), disable_swizzle_as_dst);
|
||||
//case (u32)opcode_t::ddy: return set_dst(base::ddy(src(0).xy()), disable_swizzle_as_dst);
|
||||
case (u32)opcode_t::tex: return set_dst(base::texture(texture(), texture_coords().xy()), allow_bx2);
|
||||
case (u32)opcode_t::txp: return set_dst(base::texture(texture(), texture_coords().xy() / src(0).w()), allow_bx2);
|
||||
case (u32)opcode_t::txd: return set_dst(base::texture_grad(texture(), texture_coords().xy(), src(1).xy(), src(2).xy()), allow_bx2);
|
||||
case (u32)opcode_t::tex: return set_dst(base::texture_fetch(texture_index(), texture_coords()), allow_bx2);
|
||||
case (u32)opcode_t::txp: return set_dst(base::texture_fetch(texture_index(), texture_coords() / src(0).w()), allow_bx2);
|
||||
case (u32)opcode_t::txd: return set_dst(base::texture_grad_fetch(texture_index(), texture_coords(), src(1), src(2)), allow_bx2);
|
||||
case (u32)opcode_t::rcp: return set_dst(float_point_t<1>::ctor(1.0f) / src(0).x(), disable_swizzle_as_dst);
|
||||
case (u32)opcode_t::rsq: return set_dst(base::rsqrt(src(0).x()), disable_swizzle_as_dst);
|
||||
case (u32)opcode_t::ex2: return set_dst(base::exp2(src(0).x()), disable_swizzle_as_dst);
|
||||
@@ -635,8 +655,8 @@ namespace rsx
|
||||
|
||||
return set_dst(float_point_t<4>::ctor(src_0.x() * src_1.x() + src_0.y() * src_1.y() + src(2).z()));
|
||||
}
|
||||
case (u32)opcode_t::txl: return set_dst(base::texture_lod(texture(), texture_coords().xy(), src(1).x()), allow_bx2);
|
||||
case (u32)opcode_t::txb: return set_dst(base::texture_bias(texture(), texture_coords().xy(), src(1).x()), allow_bx2);
|
||||
case (u32)opcode_t::txl: return set_dst(base::texture_lod_fetch(texture_index(), texture_coords(), src(1).x()), allow_bx2);
|
||||
case (u32)opcode_t::txb: return set_dst(base::texture_bias_fetch(texture_index(), texture_coords(), src(1).x()), allow_bx2);
|
||||
case (u32)opcode_t::texbem: return base::unimplemented("TEXBEM");
|
||||
case (u32)opcode_t::txpbem: return base::unimplemented("TXPBEM");
|
||||
case (u32)opcode_t::bemlum: return base::unimplemented("BEMLUM");
|
||||
|
||||
@@ -9,6 +9,40 @@ namespace shader_code
|
||||
{
|
||||
using language = Language;
|
||||
|
||||
|
||||
template<clike_language::predefined_function_class_t Function>
|
||||
struct predefined_function_name_t;
|
||||
|
||||
template<>
|
||||
struct predefined_function_name_t<clike_language::predefined_function_class_t::predefined_function_texture_fetch>
|
||||
{
|
||||
static constexpr auto name = "texture_fetch";
|
||||
};
|
||||
|
||||
template<>
|
||||
struct predefined_function_name_t<clike_language::predefined_function_class_t::predefined_function_texture_bias_fetch>
|
||||
{
|
||||
static constexpr auto name = "texture_bias_fetch";
|
||||
};
|
||||
|
||||
template<>
|
||||
struct predefined_function_name_t<clike_language::predefined_function_class_t::predefined_function_texture_lod_fetch>
|
||||
{
|
||||
static constexpr auto name = "texture_lod_fetch";
|
||||
};
|
||||
|
||||
template<>
|
||||
struct predefined_function_name_t<clike_language::predefined_function_class_t::predefined_function_texture_proj_fetch>
|
||||
{
|
||||
static constexpr auto name = "texture_proj_fetch";
|
||||
};
|
||||
|
||||
template<>
|
||||
struct predefined_function_name_t<clike_language::predefined_function_class_t::predefined_function_texture_grad_fetch>
|
||||
{
|
||||
static constexpr auto name = "texture_grad_fetch";
|
||||
};
|
||||
|
||||
template<clike_language::type_class_t Type, int Count>
|
||||
struct type_helper_t : public clike_language::type_t<Type, Count>
|
||||
{
|
||||
@@ -353,5 +387,27 @@ namespace shader_code
|
||||
{
|
||||
return function_t<float_point_t<Count>, typename language::template function_name_t<function_class_t::function_ddy>>::invoke(arg);
|
||||
}
|
||||
|
||||
//predefined functions
|
||||
static expression_from<float_point_t<4>> texture_fetch(const expression_from<integer_t<1>>& texture, const expression_from<float_point_t<4>>& arg0)
|
||||
{
|
||||
return function_t<float_point_t<4>, predefined_function_name_t<predefined_function_class_t::predefined_function_texture_fetch>>::invoke(texture, arg0);
|
||||
}
|
||||
static expression_from<float_point_t<4>> texture_bias_fetch(const expression_from<integer_t<1>>& texture, const expression_from<float_point_t<4>>& arg0, const expression_from<float_point_t<1>>& arg1)
|
||||
{
|
||||
return function_t<float_point_t<4>, predefined_function_name_t<predefined_function_class_t::predefined_function_texture_bias_fetch>>::invoke(texture, arg0, arg1);
|
||||
}
|
||||
static expression_from<float_point_t<4>> texture_grad_fetch(const expression_from<integer_t<1>>& texture, const expression_from<float_point_t<4>>& arg0, const expression_from<float_point_t<4>>& arg1, const expression_from<float_point_t<4>>& arg2)
|
||||
{
|
||||
return function_t<float_point_t<4>, predefined_function_name_t<predefined_function_class_t::predefined_function_texture_grad_fetch>>::invoke(texture, arg0, arg1, arg2);
|
||||
}
|
||||
static expression_from<float_point_t<4>> texture_lod_fetch(const expression_from<integer_t<1>>& texture, const expression_from<float_point_t<4>>& arg0, const expression_from<float_point_t<1>>& arg1)
|
||||
{
|
||||
return function_t<float_point_t<4>, predefined_function_name_t<predefined_function_class_t::predefined_function_texture_lod_fetch>>::invoke(texture, arg0, arg1);
|
||||
}
|
||||
static expression_from<float_point_t<4>> texture_proj_fetch(const expression_from<integer_t<1>>& texture, const expression_from<float_point_t<4>>& arg0, const expression_from<float_point_t<1>>& arg1)
|
||||
{
|
||||
return function_t<float_point_t<4>, predefined_function_name_t<predefined_function_class_t::predefined_function_texture_proj_fetch>>::invoke(texture, arg0, arg1);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -650,6 +650,15 @@ namespace shader_code
|
||||
function_ddy
|
||||
};
|
||||
|
||||
enum predefined_function_class_t
|
||||
{
|
||||
predefined_function_texture_fetch,
|
||||
predefined_function_texture_bias_fetch,
|
||||
predefined_function_texture_lod_fetch,
|
||||
predefined_function_texture_proj_fetch,
|
||||
predefined_function_texture_grad_fetch
|
||||
};
|
||||
|
||||
template<typename Type>
|
||||
static expression_t<(type_class_t)Type::type, Type::count> expression(const std::string& text, bool is_single = true)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user