meta: Add flag MESA_META_SELECT_FEEDBACK
authorChad Versace <chad@chad-versace.us>
Fri, 7 Oct 2011 22:07:00 +0000 (15:07 -0700)
committerChad Versace <chad@chad-versace.us>
Tue, 18 Oct 2011 18:42:53 +0000 (11:42 -0700)
If this flag is set, then _mesa_meta_begin/end will save/restore the state of
GL_SELECT and GL_FEEDBACK render modes.

Intel's future buffer resolve meta-ops will require this, since buffer resolves
may occur when the GL_RENDER_MODE is GL_SELECT.

Reviewed-by: Brian Paul <brianp@vmware.com>
Signed-off-by: Chad Versace <chad@chad-versace.us>
src/mesa/drivers/common/meta.c
src/mesa/drivers/common/meta.h

index 36bd295ec3ff30085b110a0b453fb70a678c1f92..6958ddf9c292582ce355cc761b5732c54cd6410e 100644 (file)
@@ -44,6 +44,7 @@
 #include "main/depth.h"
 #include "main/enable.h"
 #include "main/fbobject.h"
+#include "main/feedback.h"
 #include "main/formats.h"
 #include "main/image.h"
 #include "main/macros.h"
@@ -172,6 +173,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 +614,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 +910,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;
+      }
+   }
+
    /* misc */
    if (save->Lighting) {
       _mesa_set_enable(ctx, GL_LIGHTING, GL_TRUE);
index 7ec56838831acfe23d97fef7a61ce3a73d50d65d..e0435a822f51d1c34cd1159c5311d02ebefe274e 100644 (file)
@@ -54,6 +54,7 @@
 #define MESA_META_CLAMP_VERTEX_COLOR    0x10000
 #define MESA_META_CONDITIONAL_RENDER    0x20000
 #define MESA_META_CLIP                  0x40000
+#define MESA_META_SELECT_FEEDBACK       0x80000
 /**\}*/
 
 extern void