On Thu, Dec 8, 2011 at 10:00 PM, <jfons...@vmware.com> wrote: > From: José Fonseca <jfons...@vmware.com> > > It sets the wrong values (GL_XXX_LEFT instead of GL_XXX), and no other > Mesa driver does this, given that Mesa sets the right draw/read buffers > provided the Mesa visual has the doublebuffer flag filled correctly > which is the case. In EGL, when an EGLSurface is created, users can specify whether the front or back buffer will be rendered to. The function is used to make a double-buffered context work with an EGLSurface whose front buffer is supposed to be rendered to. But I admit that the function is hacky.
Since this is brought up, I did this experiment some time ago: 1. create a single-buffered drawable 2. create a context with a GLX_DOUBLEBUFFER visual 3. make the context and drawable current 4. query GL_DRAW_BUFFER Mesa returned GL_BACK and nVidia's proprietary driver returned GL_FRONT. This difference, IMHO, comes from that Mesa uses the visual of the context to determine whether the context is double-buffered or single-buffered, while nVidia uses the visual of the drawable to make the decision (and at the time when the context is first made current). What I want to argue here is that, maybe there should be no single-buffered or double-buffered contexts, but single-buffered or double-buffered drawables. Or more precisely, the type of the context should be determined by the type of the current drawable. I checked GLX spec and it seemed that GLX_DOUBLEBUFFER applies for drawables. Since GL 3.0, GL_DOUBLEBUFFER is also listed as one of the framebuffer dependent values. That implies the state may change when the current drawable changes. So it is still a correct behavior for the drawable to determine the type of the context. I did not have a chance to look deeper into this due to the lack of time. So I may be terribly wrong here... > --- > src/mesa/state_tracker/st_manager.c | 64 > ----------------------------------- > 1 files changed, 0 insertions(+), 64 deletions(-) > > diff --git a/src/mesa/state_tracker/st_manager.c > b/src/mesa/state_tracker/st_manager.c > index d5228d3..55699e7 100644 > --- a/src/mesa/state_tracker/st_manager.c > +++ b/src/mesa/state_tracker/st_manager.c > @@ -404,54 +404,6 @@ st_visual_to_context_mode(const struct st_visual *visual, > } > > /** > - * Determine the default draw or read buffer from a visual. > - */ > -static void > -st_visual_to_default_buffer(const struct st_visual *visual, > - GLenum *buffer, GLint *index) > -{ > - enum st_attachment_type statt; > - GLenum buf; > - gl_buffer_index idx; > - > - statt = visual->render_buffer; > - /* do nothing if an invalid render buffer is specified */ > - if (statt == ST_ATTACHMENT_INVALID || > - !st_visual_have_buffers(visual, 1 << statt)) > - return; > - > - switch (statt) { > - case ST_ATTACHMENT_FRONT_LEFT: > - buf = GL_FRONT_LEFT; > - idx = BUFFER_FRONT_LEFT; > - break; > - case ST_ATTACHMENT_BACK_LEFT: > - buf = GL_BACK_LEFT; > - idx = BUFFER_BACK_LEFT; > - break; > - case ST_ATTACHMENT_FRONT_RIGHT: > - buf = GL_FRONT_RIGHT; > - idx = BUFFER_FRONT_RIGHT; > - break; > - case ST_ATTACHMENT_BACK_RIGHT: > - buf = GL_BACK_RIGHT; > - idx = BUFFER_BACK_RIGHT; > - break; > - default: > - buf = GL_NONE; > - idx = BUFFER_COUNT; > - break; > - } > - > - if (buf != GL_NONE) { > - if (buffer) > - *buffer = buf; > - if (index) > - *index = idx; > - } > -} > - > -/** > * Create a framebuffer from a manager interface. > */ > static struct st_framebuffer * > @@ -471,12 +423,6 @@ st_framebuffer_create(struct st_framebuffer_iface *stfbi) > st_visual_to_context_mode(stfbi->visual, &mode); > _mesa_initialize_window_framebuffer(&stfb->Base, &mode); > > - /* modify the draw/read buffers of the fb */ > - st_visual_to_default_buffer(stfbi->visual, &stfb->Base.ColorDrawBuffer[0], > - &stfb->Base._ColorDrawBufferIndexes[0]); > - st_visual_to_default_buffer(stfbi->visual, &stfb->Base.ColorReadBuffer, > - &stfb->Base._ColorReadBufferIndex); > - > stfb->iface = stfbi; > stfb->iface_stamp = p_atomic_read(&stfbi->stamp) - 1; > > @@ -776,16 +722,6 @@ st_api_make_current(struct st_api *stapi, struct > st_context_iface *stctxi, > if (stread != stdraw) > st_framebuffer_validate(stread, st); > > - /* modify the draw/read buffers of the context */ > - if (stdraw->iface) { > - st_visual_to_default_buffer(stdraw->iface->visual, > - &st->ctx->Color.DrawBuffer[0], NULL); > - } > - if (stread->iface) { > - st_visual_to_default_buffer(stread->iface->visual, > - &st->ctx->Pixel.ReadBuffer, NULL); > - } > - > ret = _mesa_make_current(st->ctx, &stdraw->Base, &stread->Base); > > st->draw_stamp = stdraw->stamp - 1; > -- > 1.7.7.3 > -- o...@lunarg.com _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev