gl: Finalize the merge of bind_texture_env and bind_interpreter_env

This commit is contained in:
kd-11 2026-06-14 22:32:34 +03:00 committed by kd-11
parent 00c57be1ed
commit c38e8229ed
2 changed files with 17 additions and 90 deletions

View File

@ -489,92 +489,6 @@ void GLGSRender::load_texture_env()
} }
void GLGSRender::bind_texture_env() void GLGSRender::bind_texture_env()
{
// Bind textures and resolve external copy operations
gl::command_context cmd{ gl_state };
for (u32 textures_ref = current_fp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i)
{
if (!(textures_ref & 1))
{
continue;
}
gl::texture_view* view = nullptr;
auto sampler_state = static_cast<gl::texture_cache::sampled_image_descriptor*>(fs_sampler_state[i].get());
if (rsx::method_registers.fragment_textures[i].enabled() &&
sampler_state->validate())
{
if (view = sampler_state->image_handle; !view) [[unlikely]]
{
view = m_gl_texture_cache.create_temporary_subresource(cmd, sampler_state->external_subresource_desc);
}
}
if (view) [[likely]]
{
view->bind(cmd, GL_FRAGMENT_TEXTURES_START + i);
if (current_fragment_program.texture_state.redirected_textures & (1 << i))
{
auto root_texture = static_cast<gl::viewable_image*>(view->image());
auto stencil_view = root_texture->get_view(rsx::default_remap_vector.with_encoding(gl::GL_REMAP_IDENTITY), gl::image_aspect::stencil);
stencil_view->bind(cmd, GL_STENCIL_MIRRORS_START + i);
}
}
else
{
const auto target = gl::get_target(current_fragment_program.get_texture_dimension(i));
cmd->bind_texture(GL_FRAGMENT_TEXTURES_START + i, target, m_null_textures[target]->id());
if (current_fragment_program.texture_state.redirected_textures & (1 << i))
{
cmd->bind_texture(GL_STENCIL_MIRRORS_START + i, target, m_null_textures[target]->id());
}
}
}
for (u32 textures_ref = current_vp_metadata.referenced_textures_mask, i = 0; textures_ref; textures_ref >>= 1, ++i)
{
if (!(textures_ref & 1))
{
continue;
}
auto sampler_state = static_cast<gl::texture_cache::sampled_image_descriptor*>(vs_sampler_state[i].get());
gl::texture_view* view = nullptr;
if (rsx::method_registers.vertex_textures[i].enabled() &&
sampler_state->validate())
{
if (view = sampler_state->image_handle; !view)
{
view = m_gl_texture_cache.create_temporary_subresource(cmd, sampler_state->external_subresource_desc);
}
}
if (view) [[likely]]
{
view->bind(cmd, GL_VERTEX_TEXTURES_START + i);
}
else
{
cmd->bind_texture(GL_VERTEX_TEXTURES_START + i, GL_TEXTURE_2D, GL_NONE);
}
}
if (current_fragment_program.ctrl & RSX_SHADER_CONTROL_EMULATE_DEPTH_COMPARE)
{
ensure(m_rtts.m_bound_depth_stencil.first, "Invalid FBO setup");
gl::insert_texture_barrier();
auto view = m_rtts.m_bound_depth_stencil.second->get_view(rsx::default_remap_vector, gl::image_aspect::depth);
view->bind(cmd, GL_TEMP_IMAGE_SLOT(0));
}
}
void GLGSRender::bind_interpreter_texture_env()
{ {
// Bind textures and resolve external copy operations // Bind textures and resolve external copy operations
gl::command_context cmd{ gl_state }; gl::command_context cmd{ gl_state };
@ -600,13 +514,18 @@ void GLGSRender::bind_interpreter_texture_env()
} }
} }
if (!primary_view) if (const bool is_redirected = (current_fragment_program.texture_state.redirected_textures & (1 << i));
!primary_view)
{ {
const auto target = gl::get_target(current_fragment_program.get_texture_dimension(i)); const auto target = gl::get_target(current_fragment_program.get_texture_dimension(i));
primary_view = m_null_textures[target]->get_view(rsx::default_remap_vector); primary_view = m_null_textures[target]->get_view(rsx::default_remap_vector);
stencil_mirror = primary_view;
if (is_redirected)
{
stencil_mirror = primary_view;
}
} }
else if (current_fragment_program.texture_state.redirected_textures & (1 << i)) else if (is_redirected)
{ {
auto root_texture = static_cast<gl::viewable_image*>(primary_view->image()); auto root_texture = static_cast<gl::viewable_image*>(primary_view->image());
stencil_mirror = root_texture->get_view(rsx::default_remap_vector.with_encoding(gl::GL_REMAP_IDENTITY), gl::image_aspect::stencil); stencil_mirror = root_texture->get_view(rsx::default_remap_vector.with_encoding(gl::GL_REMAP_IDENTITY), gl::image_aspect::stencil);
@ -659,6 +578,15 @@ void GLGSRender::bind_interpreter_texture_env()
{ {
m_shader_interpreter.flush_texture_bindings(); m_shader_interpreter.flush_texture_bindings();
} }
if (current_fragment_program.ctrl & RSX_SHADER_CONTROL_EMULATE_DEPTH_COMPARE)
{
ensure(m_rtts.m_bound_depth_stencil.first, "Invalid FBO setup");
gl::insert_texture_barrier();
auto view = m_rtts.m_bound_depth_stencil.second->get_view(rsx::default_remap_vector, gl::image_aspect::depth);
view->bind(cmd, GL_TEMP_IMAGE_SLOT(0));
}
} }
void GLGSRender::emit_geometry(u32 sub_index) void GLGSRender::emit_geometry(u32 sub_index)

View File

@ -184,7 +184,6 @@ private:
void load_texture_env(); void load_texture_env();
void bind_texture_env(); void bind_texture_env();
void bind_interpreter_texture_env();
gl::texture* get_present_source(gl::present_surface_info* info, const rsx::avconf& avconfig); gl::texture* get_present_source(gl::present_surface_info* info, const rsx::avconf& avconfig);