On 10/07/2011 04:23 PM, Brian Paul wrote: > On 10/07/2011 04:55 PM, Chad Versace wrote: >> If this flag is set, then _mesa_meta_begin will save/restore the state of >> GL_SELECT and GL_FEEDBACK render modes. >> >> Intel's futue resolve meta-ops will require this, since buffer resolves >> may occur when the GL_RENDER_MODE is GL_SELECT. >> >> Signed-off-by: Chad Versace<c...@chad-versace.us> >> --- >> src/mesa/drivers/common/meta.c | 26 ++++++++++++++++++++++++++ >> src/mesa/drivers/common/meta.h | 1 + >> 2 files changed, 27 insertions(+), 0 deletions(-) >> >> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c >> index 5b73dcd..fc25f92 100644 >> --- a/src/mesa/drivers/common/meta.c >> +++ b/src/mesa/drivers/common/meta.c >> @@ -172,6 +172,11 @@ struct save_state >> struct gl_query_object *CondRenderQuery; >> GLenum CondRenderMode; >> >> + /** MESA_META_SELECT_FEEDBACK */ >> + GLenum RenderMode; >> + struct gl_selection Select; >> + struct gl_feedback Feedback; >> + >> /** Miscellaneous (always disabled) */ >> GLboolean Lighting; >> }; >> @@ -608,6 +613,17 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield >> state) >> _mesa_EndConditionalRender(); >> } >> >> + if (state& MESA_META_SELECT_FEEDBACK) { >> + save->RenderMode = ctx->RenderMode; >> + if (ctx->RenderMode == GL_SELECT) { >> + save->Select = ctx->Select; /* struct copy */ >> + _mesa_RenderMode(GL_RENDER); >> + } else if (ctx->RenderMode == GL_FEEDBACK) { >> + save->Feedback = ctx->Feedback; /* struct copy */ >> + _mesa_RenderMode(GL_RENDER); >> + } >> + } >> + >> /* misc */ >> { >> save->Lighting = ctx->Light.Enabled; >> @@ -893,6 +909,16 @@ _mesa_meta_end(struct gl_context *ctx) >> save->CondRenderMode); >> } >> >> + if (state& MESA_META_SELECT_FEEDBACK) { >> + if (save->RenderMode == GL_SELECT) { >> + ctx->Select = save->Select; >> + _mesa_RenderMode(GL_SELECT); >> + } else if (save->RenderMode == GL_FEEDBACK) { >> + ctx->Feedback = save->Feedback; >> + _mesa_RenderMode(GL_FEEDBACK); >> + } >> + } > > You might need to switch the order of calling _mesa_RenderMode() and > assigning the ctx->Feedback/Select state. That is: > > _mesa_RenderMode(GL_FEEDBACK); > ctx->Feedback = save->Feedback;
My intuition also thought this was the correct order. But a Piglit test proved my intuition wrong. > > I presume that after _mesa_meta_end() is called, we want the > selection/feedback state to be just as it was before _mesa_meta_begin() was > called, right? Right. > When _mesa_RenderMode() is called it mucks with various ctx->Select or > ctx->Feedback fields. So we need to assign/restore the old > ctx->Select/Feedback state _after_ that if we want to restore things just as > they were. > > What do you think? > > -Brian _mesa_RenderMode clobbers and checks the state like this: current mode new mode clobbers asserts -------------------------------------------------------------- RENDER * nothing SELECT * ctx.Select FEEDBACK * ctx.Feedback.Count * RENDER nothing * SELECT ctx.Select.BufferSize > 0 * FEEDBACK ctx.Feedback.BufferSize > 0 So in meta_begin, we need to save the state before calling glRenderMode in order to prevent the state from getting clobbered. And in meta_end, we need to restore the state before calling glRenderMode in order to prevent the assertions from failing. -- Chad Versace c...@chad-versace.us _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev