citra-emu
/
citra-canary
Archived
1
0
Fork 0

video_core/GLES: fix issues cause by missing glTextureBarrier

create a duplicate for sampling instead
This commit is contained in:
BreadFish64 2020-05-27 22:14:27 -05:00
parent 8ce81b19be
commit d04071d6b3
3 changed files with 18 additions and 1 deletions

View File

@ -776,6 +776,20 @@ bool RasterizerOpenGL::Draw(bool accelerate, bool is_indexed) {
}
}
OGLTexture temp_tex;
if (need_texture_barrier && GLES) {
temp_tex.Create();
AllocateSurfaceTexture(temp_tex.handle, GetFormatTuple(color_surface->pixel_format),
color_surface->GetScaledWidth(), color_surface->GetScaledHeight());
glCopyImageSubData(color_surface->texture.handle, GL_TEXTURE_2D, 0, 0, 0, 0,
temp_tex.handle, GL_TEXTURE_2D, 0, 0, 0, 0, color_surface->GetScaledWidth(),
color_surface->GetScaledHeight(), 1);
for (auto& unit : state.texture_units) {
if (unit.texture_2d == color_surface->texture.handle)
unit.texture_2d = temp_tex.handle;
}
}
// Sync and bind the shader
if (shader_dirty) {
SetShader();

View File

@ -311,7 +311,7 @@ static constexpr std::array<void (*)(u32, u32, u8*, PAddr, PAddr, PAddr), 18> gl
};
// Allocate an uninitialized texture of appropriate size and format for the surface
static void AllocateSurfaceTexture(GLuint texture, const FormatTuple& format_tuple, u32 width,
void AllocateSurfaceTexture(GLuint texture, const FormatTuple& format_tuple, u32 width,
u32 height) {
OpenGLState cur_state = OpenGLState::GetCurState();

View File

@ -339,4 +339,7 @@ struct FormatTuple {
constexpr FormatTuple tex_tuple = {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE};
const FormatTuple& GetFormatTuple(SurfaceParams::PixelFormat pixel_format);
void AllocateSurfaceTexture(GLuint texture, const FormatTuple& format_tuple, u32 width,
u32 height);
} // namespace OpenGL