diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index e9055efeb..d66285bfa 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -54,14 +54,14 @@ RasterizerOpenGL::RasterizerOpenGL() index_buffer(GL_ELEMENT_ARRAY_BUFFER, INDEX_BUFFER_SIZE, false), texture_buffer(GL_TEXTURE_BUFFER, TEXTURE_BUFFER_SIZE, false) { - allow_shadow = GLAD_GL_ARB_shader_image_load_store && GLAD_GL_ARB_shader_image_size && - GLAD_GL_ARB_framebuffer_no_attachments; + allow_shadow = GLES || (GLAD_GL_ARB_shader_image_load_store && GLAD_GL_ARB_shader_image_size && + GLAD_GL_ARB_framebuffer_no_attachments); if (!allow_shadow) { LOG_WARNING(Render_OpenGL, "Shadow might not be able to render because of unsupported OpenGL extensions."); } - if (!GLAD_GL_ARB_texture_barrier) { + if (!(GLES || GLAD_GL_ARB_texture_barrier)) { LOG_WARNING(Render_OpenGL, "ARB_texture_barrier not supported. Some games might produce artifacts."); } @@ -850,7 +850,7 @@ bool RasterizerOpenGL::Draw(bool accelerate, bool is_indexed) { GL_TEXTURE_UPDATE_BARRIER_BIT | GL_FRAMEBUFFER_BARRIER_BIT); } - if (need_texture_barrier && GLAD_GL_ARB_texture_barrier) { + if (need_texture_barrier && (GLES || GLAD_GL_ARB_texture_barrier)) { glTextureBarrier(); } diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp index 359601da1..22ac10479 100644 --- a/src/video_core/renderer_opengl/gl_shader_gen.cpp +++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp @@ -1241,14 +1241,21 @@ float ProcTexNoiseCoef(vec2 x) { ShaderDecompiler::ProgramResult GenerateFragmentShader(const PicaFSConfig& config, bool separable_shader) { const auto& state = config.state; + std::string out; - std::string out = R"( + if (GLES) { + out += R"( +#define ALLOW_SHADOW (defined(CITRA_GLES)) +)"; + } else { + out += R"( #extension GL_ARB_shader_image_load_store : enable #extension GL_ARB_shader_image_size : enable #define ALLOW_SHADOW (defined(GL_ARB_shader_image_load_store) && defined(GL_ARB_shader_image_size)) )"; + } - if (separable_shader) { + if (separable_shader && !GLES) { out += "#extension GL_ARB_separate_shader_objects : enable\n"; } @@ -1625,7 +1632,7 @@ do { ShaderDecompiler::ProgramResult GenerateTrivialVertexShader(bool separable_shader) { std::string out; - if (separable_shader) { + if (separable_shader && !GLES) { out += "#extension GL_ARB_separate_shader_objects : enable\n"; } @@ -1673,8 +1680,8 @@ void main() { std::optional GenerateVertexShader( const Pica::Shader::ShaderSetup& setup, const PicaVSConfig& config, bool separable_shader) { - std::string out = ""; - if (separable_shader) { + std::string out; + if (separable_shader && !GLES) { out += "#extension GL_ARB_separate_shader_objects : enable\n"; } @@ -1823,8 +1830,8 @@ void EmitPrim(Vertex vtx0, Vertex vtx1, Vertex vtx2) { ShaderDecompiler::ProgramResult GenerateFixedGeometryShader(const PicaFixedGSConfig& config, bool separable_shader) { - std::string out = ""; - if (separable_shader) { + std::string out; + if (separable_shader && !GLES) { out += "#extension GL_ARB_separate_shader_objects : enable\n\n"; }