// // Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // WorkaroundsGL.h: Workarounds for GL driver bugs and other issues. #ifndef LIBANGLE_RENDERER_GL_WORKAROUNDSGL_H_ #define LIBANGLE_RENDERER_GL_WORKAROUNDSGL_H_ namespace rx { struct WorkaroundsGL { WorkaroundsGL() : avoid1BitAlphaTextureFormats(false), rgba4IsNotSupportedForColorRendering(false), doesSRGBClearsOnLinearFramebufferAttachments(false), doWhileGLSLCausesGPUHang(false), finishDoesNotCauseQueriesToBeAvailable(false), alwaysCallUseProgramAfterLink(false), unpackOverlappingRowsSeparatelyUnpackBuffer(false) { } // When writing a float to a normalized integer framebuffer, desktop OpenGL is allowed to write // one of the two closest normalized integer representations (although round to nearest is // preferred) (see section 2.3.5.2 of the GL 4.5 core specification). OpenGL ES requires that // round-to-nearest is used (see "Conversion from Floating-Point to Framebuffer Fixed-Point" in // section 2.1.2 of the OpenGL ES 2.0.25 spec). This issue only shows up on Intel and AMD // drivers on framebuffer formats that have 1-bit alpha, work around this by using higher // precision formats instead. bool avoid1BitAlphaTextureFormats; // On some older Intel drivers, GL_RGBA4 is not color renderable, glCheckFramebufferStatus // returns GL_FRAMEBUFFER_UNSUPPORTED. Work around this by using a known color-renderable // format. bool rgba4IsNotSupportedForColorRendering; // When clearing a framebuffer on Intel or AMD drivers, when GL_FRAMEBUFFER_SRGB is enabled, the // driver clears to the linearized clear color despite the framebuffer not supporting SRGB // blending. It only seems to do this when the framebuffer has only linear attachments, mixed // attachments appear to get the correct clear color. bool doesSRGBClearsOnLinearFramebufferAttachments; // On Mac some GLSL constructs involving do-while loops cause GPU hangs, such as the following: // int i = 1; // do { // i --; // continue; // } while (i > 0) // Work around this by rewriting the do-while to use another GLSL construct (block + while) bool doWhileGLSLCausesGPUHang; // Calling glFinish doesn't cause all queries to report that the result is available on some // (NVIDIA) drivers. It was found that enabling GL_DEBUG_OUTPUT_SYNCHRONOUS before the finish // causes it to fully finish. bool finishDoesNotCauseQueriesToBeAvailable; // Always call useProgram after a successful link to avoid a driver bug. // This workaround is meant to reproduce the use_current_program_after_successful_link // workaround in Chromium (http://crbug.com/110263). It has been shown that this workaround is // not necessary for MacOSX 10.9 and higher (http://crrev.com/39eb535b). bool alwaysCallUseProgramAfterLink; // In the case of unpacking from a pixel unpack buffer, unpack overlapping rows row by row. bool unpackOverlappingRowsSeparatelyUnpackBuffer; }; } #endif // LIBANGLE_RENDERER_GL_WORKAROUNDSGL_H_