mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-01-30 03:32:55 +00:00
gl: Only toggle state settings that are relevant to the current RSX state
This commit is contained in:
parent
e95084f138
commit
1c5b685398
@ -138,29 +138,11 @@ void GLGSRender::update_draw_state()
|
|||||||
m_profiler.start();
|
m_profiler.start();
|
||||||
|
|
||||||
gl_state.enable(GL_SCISSOR_TEST);
|
gl_state.enable(GL_SCISSOR_TEST);
|
||||||
|
gl_state.enable(rsx::method_registers.dither_enabled(), GL_DITHER);
|
||||||
|
|
||||||
for (int index = 0; index < m_rtts.get_color_surface_count(); ++index)
|
if (m_rtts.m_bound_depth_stencil.first)
|
||||||
{
|
{
|
||||||
bool color_mask_b = rsx::method_registers.color_mask_b(index);
|
// Z-buffer is active.
|
||||||
bool color_mask_g = rsx::method_registers.color_mask_g(index);
|
|
||||||
bool color_mask_r = rsx::method_registers.color_mask_r(index);
|
|
||||||
bool color_mask_a = rsx::method_registers.color_mask_a(index);
|
|
||||||
|
|
||||||
switch (rsx::method_registers.surface_color())
|
|
||||||
{
|
|
||||||
case rsx::surface_color_format::b8:
|
|
||||||
rsx::get_b8_colormask(color_mask_r, color_mask_g, color_mask_b, color_mask_a);
|
|
||||||
break;
|
|
||||||
case rsx::surface_color_format::g8b8:
|
|
||||||
rsx::get_g8b8_r8g8_colormask(color_mask_r, color_mask_g, color_mask_b, color_mask_a);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
gl_state.color_maski(index, color_mask_r, color_mask_g, color_mask_b, color_mask_a);
|
|
||||||
}
|
|
||||||
|
|
||||||
gl_state.depth_mask(rsx::method_registers.depth_write_enabled());
|
gl_state.depth_mask(rsx::method_registers.depth_write_enabled());
|
||||||
gl_state.stencil_mask(rsx::method_registers.stencil_mask());
|
gl_state.stencil_mask(rsx::method_registers.stencil_mask());
|
||||||
|
|
||||||
@ -181,8 +163,6 @@ void GLGSRender::update_draw_state()
|
|||||||
gl_state.depth_range(rsx::method_registers.clip_min(), rsx::method_registers.clip_max());
|
gl_state.depth_range(rsx::method_registers.clip_min(), rsx::method_registers.clip_max());
|
||||||
}
|
}
|
||||||
|
|
||||||
gl_state.enable(rsx::method_registers.dither_enabled(), GL_DITHER);
|
|
||||||
|
|
||||||
if (gl_state.enable(rsx::method_registers.stencil_test_enabled(), GL_STENCIL_TEST))
|
if (gl_state.enable(rsx::method_registers.stencil_test_enabled(), GL_STENCIL_TEST))
|
||||||
{
|
{
|
||||||
glStencilFunc(gl::comparison_op(rsx::method_registers.stencil_func()),
|
glStencilFunc(gl::comparison_op(rsx::method_registers.stencil_func()),
|
||||||
@ -203,6 +183,32 @@ void GLGSRender::update_draw_state()
|
|||||||
gl::stencil_op(rsx::method_registers.back_stencil_op_zfail()), gl::stencil_op(rsx::method_registers.back_stencil_op_zpass()));
|
gl::stencil_op(rsx::method_registers.back_stencil_op_zfail()), gl::stencil_op(rsx::method_registers.back_stencil_op_zpass()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_rtts.get_color_surface_count())
|
||||||
|
{
|
||||||
|
// Color buffer is active
|
||||||
|
for (int index = 0; index < m_rtts.get_color_surface_count(); ++index)
|
||||||
|
{
|
||||||
|
bool color_mask_b = rsx::method_registers.color_mask_b(index);
|
||||||
|
bool color_mask_g = rsx::method_registers.color_mask_g(index);
|
||||||
|
bool color_mask_r = rsx::method_registers.color_mask_r(index);
|
||||||
|
bool color_mask_a = rsx::method_registers.color_mask_a(index);
|
||||||
|
|
||||||
|
switch (rsx::method_registers.surface_color())
|
||||||
|
{
|
||||||
|
case rsx::surface_color_format::b8:
|
||||||
|
rsx::get_b8_colormask(color_mask_r, color_mask_g, color_mask_b, color_mask_a);
|
||||||
|
break;
|
||||||
|
case rsx::surface_color_format::g8b8:
|
||||||
|
rsx::get_g8b8_r8g8_colormask(color_mask_r, color_mask_g, color_mask_b, color_mask_a);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
gl_state.color_maski(index, color_mask_r, color_mask_g, color_mask_b, color_mask_a);
|
||||||
|
}
|
||||||
|
|
||||||
bool mrt_blend_enabled[] =
|
bool mrt_blend_enabled[] =
|
||||||
{
|
{
|
||||||
@ -235,10 +241,17 @@ void GLGSRender::update_draw_state()
|
|||||||
{
|
{
|
||||||
gl_state.logic_op(gl::logic_op(rsx::method_registers.logic_operation()));
|
gl_state.logic_op(gl::logic_op(rsx::method_registers.logic_operation()));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (rsx::method_registers.current_draw_clause.primitive)
|
||||||
|
{
|
||||||
|
case rsx::primitive_type::lines:
|
||||||
|
case rsx::primitive_type::line_loop:
|
||||||
|
case rsx::primitive_type::line_strip:
|
||||||
gl_state.line_width(rsx::method_registers.line_width() * rsx::get_resolution_scale());
|
gl_state.line_width(rsx::method_registers.line_width() * rsx::get_resolution_scale());
|
||||||
gl_state.enable(rsx::method_registers.line_smooth_enabled(), GL_LINE_SMOOTH);
|
gl_state.enable(rsx::method_registers.line_smooth_enabled(), GL_LINE_SMOOTH);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
gl_state.enable(rsx::method_registers.poly_offset_point_enabled(), GL_POLYGON_OFFSET_POINT);
|
gl_state.enable(rsx::method_registers.poly_offset_point_enabled(), GL_POLYGON_OFFSET_POINT);
|
||||||
gl_state.enable(rsx::method_registers.poly_offset_line_enabled(), GL_POLYGON_OFFSET_LINE);
|
gl_state.enable(rsx::method_registers.poly_offset_line_enabled(), GL_POLYGON_OFFSET_LINE);
|
||||||
gl_state.enable(rsx::method_registers.poly_offset_fill_enabled(), GL_POLYGON_OFFSET_FILL);
|
gl_state.enable(rsx::method_registers.poly_offset_fill_enabled(), GL_POLYGON_OFFSET_FILL);
|
||||||
@ -253,6 +266,8 @@ void GLGSRender::update_draw_state()
|
|||||||
}
|
}
|
||||||
|
|
||||||
gl_state.front_face(gl::front_face(rsx::method_registers.front_face_mode()));
|
gl_state.front_face(gl::front_face(rsx::method_registers.front_face_mode()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Sample control
|
// Sample control
|
||||||
// TODO: MinSampleShading
|
// TODO: MinSampleShading
|
||||||
@ -378,7 +393,7 @@ void GLGSRender::bind_texture_env()
|
|||||||
if (current_fragment_program.texture_state.redirected_textures & (1 << i))
|
if (current_fragment_program.texture_state.redirected_textures & (1 << i))
|
||||||
{
|
{
|
||||||
auto root_texture = static_cast<gl::viewable_image*>(view->image());
|
auto root_texture = static_cast<gl::viewable_image*>(view->image());
|
||||||
auto stencil_view = root_texture->get_view(0xAAE4, rsx::default_remap_vector, gl::image_aspect::stencil);
|
auto stencil_view = root_texture->get_view(gl::GL_REMAP_IDENTITY, rsx::default_remap_vector, gl::image_aspect::stencil);
|
||||||
stencil_view->bind(cmd, GL_STENCIL_MIRRORS_START + i);
|
stencil_view->bind(cmd, GL_STENCIL_MIRRORS_START + i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user