video_core/GLES: fix issues cause by missing glTextureBarrier
create a duplicate for sampling instead
This commit is contained in:
parent
8ce81b19be
commit
d04071d6b3
|
@ -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
|
// Sync and bind the shader
|
||||||
if (shader_dirty) {
|
if (shader_dirty) {
|
||||||
SetShader();
|
SetShader();
|
||||||
|
|
|
@ -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
|
// 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) {
|
u32 height) {
|
||||||
OpenGLState cur_state = OpenGLState::GetCurState();
|
OpenGLState cur_state = OpenGLState::GetCurState();
|
||||||
|
|
||||||
|
|
|
@ -339,4 +339,7 @@ struct FormatTuple {
|
||||||
constexpr FormatTuple tex_tuple = {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE};
|
constexpr FormatTuple tex_tuple = {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE};
|
||||||
|
|
||||||
const FormatTuple& GetFormatTuple(SurfaceParams::PixelFormat pixel_format);
|
const FormatTuple& GetFormatTuple(SurfaceParams::PixelFormat pixel_format);
|
||||||
|
|
||||||
|
void AllocateSurfaceTexture(GLuint texture, const FormatTuple& format_tuple, u32 width,
|
||||||
|
u32 height);
|
||||||
} // namespace OpenGL
|
} // namespace OpenGL
|
||||||
|
|
Reference in New Issue