mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-05 22:41:25 +12:00
gl: Fix stencil resolve for NVIDIA cards
- Only NV cards fail to expose ARB_shader_stencil_export which forces a very clunky workaround - Fix stencil parameter initialization
This commit is contained in:
parent
10d5907f46
commit
3392f0a271
2 changed files with 44 additions and 6 deletions
|
@ -111,6 +111,10 @@ namespace gl
|
||||||
fbo.draw_buffer(fbo.no_color);
|
fbo.draw_buffer(fbo.no_color);
|
||||||
fbo.depth = target_texture;
|
fbo.depth = target_texture;
|
||||||
break;
|
break;
|
||||||
|
case gl::image_aspect::stencil:
|
||||||
|
fbo.draw_buffer(fbo.no_color);
|
||||||
|
fbo.depth_stencil = target_texture;
|
||||||
|
break;
|
||||||
case gl::image_aspect::depth | gl::image_aspect::stencil:
|
case gl::image_aspect::depth | gl::image_aspect::stencil:
|
||||||
fbo.draw_buffer(fbo.no_color);
|
fbo.draw_buffer(fbo.no_color);
|
||||||
fbo.depth_stencil = target_texture;
|
fbo.depth_stencil = target_texture;
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "GLResolveHelper.h"
|
#include "GLResolveHelper.h"
|
||||||
|
#include "GLTexture.h"
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <stack>
|
||||||
|
|
||||||
namespace gl
|
namespace gl
|
||||||
{
|
{
|
||||||
|
@ -316,23 +318,39 @@ namespace gl
|
||||||
|
|
||||||
const auto read_resource = m_config.is_unresolve ? resolve_image : msaa_image;
|
const auto read_resource = m_config.is_unresolve ? resolve_image : msaa_image;
|
||||||
const auto write_resource = m_config.is_unresolve ? msaa_image : resolve_image;
|
const auto write_resource = m_config.is_unresolve ? msaa_image : resolve_image;
|
||||||
saved_sampler_state saved(GL_TEMP_IMAGE_SLOT(0), m_sampler);
|
|
||||||
saved_sampler_state saved2(GL_TEMP_IMAGE_SLOT(1), m_sampler);
|
// Resource binding
|
||||||
|
std::stack<int> bind_slots;
|
||||||
|
std::vector<std::unique_ptr<saved_sampler_state>> saved_sampler_states;
|
||||||
|
auto allocate_slot = [&]() -> int
|
||||||
|
{
|
||||||
|
ensure(!bind_slots.empty());
|
||||||
|
const int slot = bind_slots.top();
|
||||||
|
bind_slots.pop();
|
||||||
|
saved_sampler_states.emplace_back(std::make_unique<gl::saved_sampler_state>(slot, m_sampler));
|
||||||
|
return slot;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Reserve 2 slots max
|
||||||
|
bind_slots.push(GL_TEMP_IMAGE_SLOT(1));
|
||||||
|
bind_slots.push(GL_TEMP_IMAGE_SLOT(0));
|
||||||
|
|
||||||
if (m_config.resolve_depth)
|
if (m_config.resolve_depth)
|
||||||
{
|
{
|
||||||
cmd->bind_texture(GL_TEMP_IMAGE_SLOT(0), static_cast<GLenum>(read_resource->get_target()), read_resource->id(), GL_TRUE);
|
const int bind_slot = allocate_slot();
|
||||||
|
cmd->bind_texture(bind_slot, static_cast<GLenum>(read_resource->get_target()), read_resource->id(), GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_config.resolve_stencil)
|
if (m_config.resolve_stencil)
|
||||||
{
|
{
|
||||||
|
const int bind_slot = allocate_slot();
|
||||||
auto stencil_view = read_resource->get_view(rsx::default_remap_vector.with_encoding(gl::GL_REMAP_IDENTITY), gl::image_aspect::stencil);
|
auto stencil_view = read_resource->get_view(rsx::default_remap_vector.with_encoding(gl::GL_REMAP_IDENTITY), gl::image_aspect::stencil);
|
||||||
cmd->bind_texture(GL_TEMP_IMAGE_SLOT(1), static_cast<GLenum>(read_resource->get_target()), stencil_view->id(), GL_TRUE);
|
cmd->bind_texture(bind_slot, static_cast<GLenum>(read_resource->get_target()), stencil_view->id(), GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
areau viewport{};
|
areau viewport{};
|
||||||
viewport.x2 = msaa_image->width();
|
viewport.x2 = write_resource->width();
|
||||||
viewport.y2 = msaa_image->height();
|
viewport.y2 = write_resource->height();
|
||||||
overlay_pass::run(cmd, viewport, write_resource->id(), m_write_aspect_mask, false);
|
overlay_pass::run(cmd, viewport, write_resource->id(), m_write_aspect_mask, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,6 +361,22 @@ namespace gl
|
||||||
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &old_vao);
|
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &old_vao);
|
||||||
m_vao.bind();
|
m_vao.bind();
|
||||||
|
|
||||||
|
// Clear the target
|
||||||
|
gl::clear_cmd_info clear_info
|
||||||
|
{
|
||||||
|
.aspect_mask = gl::image_aspect::stencil,
|
||||||
|
.clear_stencil = {
|
||||||
|
.mask = 0xFF,
|
||||||
|
.value = 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
gl::clear_attachments(cmd, clear_info);
|
||||||
|
|
||||||
|
// Override stencil settings. Always pass, reference is all one, compare mask doesn't matter.
|
||||||
|
// For each pass the write mask will be overriden to commit output bitwise
|
||||||
|
cmd->stencil_func(GL_ALWAYS, 0xFF, 0xFF);
|
||||||
|
cmd->stencil_op(GL_REPLACE, GL_REPLACE, GL_REPLACE);
|
||||||
|
|
||||||
// Start our inner loop
|
// Start our inner loop
|
||||||
for (s32 write_mask = 0x1; write_mask <= 0x80; write_mask <<= 1)
|
for (s32 write_mask = 0x1; write_mask <= 0x80; write_mask <<= 1)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue