+GLenum
+_mesa_back_to_front_if_single_buffered(const struct gl_framebuffer *fb,
+ GLenum buffer)
+{
+ /* If the front buffer is the only buffer, GL_BACK and all other flags
+ * that include BACK select the front buffer for drawing. There are
+ * several reasons we want to do this.
+ *
+ * 1) OpenGL ES 3.0 requires it:
+ *
+ * Page 181 (page 192 of the PDF) in section 4.2.1 of the OpenGL
+ * ES 3.0.1 specification says:
+ *
+ * "When draw buffer zero is BACK, color values are written
+ * into the sole buffer for single-buffered contexts, or into
+ * the back buffer for double-buffered contexts."
+ *
+ * We also do this for GLES 1 and 2 because those APIs have no
+ * concept of selecting the front and back buffer anyway and it's
+ * convenient to be able to maintain the magic behaviour of
+ * GL_BACK in that case.
+ *
+ * 2) Pbuffers are back buffers from the application point of view,
+ * but they are front buffers from the Mesa point of view,
+ * because they are always single buffered.
+ */
+ if (!fb->Visual.doubleBufferMode) {
+ switch (buffer) {
+ case GL_BACK:
+ buffer = GL_FRONT;
+ break;
+ case GL_BACK_RIGHT:
+ buffer = GL_FRONT_RIGHT;
+ break;
+ case GL_BACK_LEFT:
+ buffer = GL_FRONT_LEFT;
+ break;
+ }
+ }
+
+ return buffer;
+}