Fragment program: use predefined texture fetch functions

This commit is contained in:
DH
2016-06-25 18:48:16 +03:00
parent 9f8814af57
commit 9f2d4c3c61
4 changed files with 103 additions and 8 deletions

View File

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

View File

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

View File

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

View File

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