On 10/07/2011 04:45 PM, Chad Versace wrote: > 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.
Silly me. My brain was tied in a knot. I see your point now. The second hunk should be changed to this: @@ -893,6 +909,16 @@ _mesa_meta_end(struct gl_context *ctx) save->CondRenderMode); } + if (state& MESA_META_SELECT_FEEDBACK) { + if (save->RenderMode == GL_SELECT) { + _mesa_RenderMode(GL_SELECT); + ctx->Select = save->Select; + } else if (save->RenderMode == GL_FEEDBACK) { + _mesa_RenderMode(GL_FEEDBACK); + ctx->Feedback = save->Feedback; + } + } -- Chad Versace c...@chad-versace.us _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev