Re: [Mesa-dev] [PATCH] Implement HW accelerated GL_SELECT

2011-08-25 Thread Alex Deucher
On Wed, Aug 24, 2011 at 10:35 AM, Micael kam1k...@gmail.com wrote:
 Any more feedback regarding this?
 I now don't have much time to work on it again, but I may find some, so
 knowing what's left to do would be nice...

Does anyone want to see this in a separate branch first, or should it
just go into master?

Alex


 On Thu, Aug 4, 2011 at 2:59 PM, Micael Dias kam1k...@gmail.com wrote:

 ---
  src/mesa/SConscript                          |    1 +
  src/mesa/main/fbobject.c                     |   16 +-
  src/mesa/main/fbobject.h                     |    6 +
  src/mesa/sources.mak                         |    1 +
  src/mesa/state_tracker/st_cb_feedback.c      |   21 +-
  src/mesa/state_tracker/st_context.h          |   10 +
  src/mesa/state_tracker/st_draw.h             |   17 +
  src/mesa/state_tracker/st_draw_select_emul.c |  490
 ++
  8 files changed, 549 insertions(+), 13 deletions(-)
  create mode 100644 src/mesa/state_tracker/st_draw_select_emul.c

 diff --git a/src/mesa/SConscript b/src/mesa/SConscript
 index 24e2155..288b162 100644
 --- a/src/mesa/SConscript
 +++ b/src/mesa/SConscript
 @@ -262,6 +262,7 @@ statetracker_sources = [
     'state_tracker/st_debug.c',
     'state_tracker/st_draw.c',
     'state_tracker/st_draw_feedback.c',
 +    'state_tracker/st_draw_select_emul.c',
     'state_tracker/st_extensions.c',
     'state_tracker/st_format.c',
     'state_tracker/st_gen_mipmap.c',
 diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
 index 82eb7fb..1aea62b 100644
 --- a/src/mesa/main/fbobject.c
 +++ b/src/mesa/main/fbobject.c
 @@ -1560,8 +1560,8 @@ _mesa_IsFramebufferEXT(GLuint framebuffer)
  * (render to texture).  Call ctx-Driver.RenderTexture() for such
  * attachments.
  */
 -static void
 -check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer
 *fb)
 +void
 +_mesa_check_begin_texture_render(struct gl_context *ctx, struct
 gl_framebuffer *fb)
  {
    GLuint i;
    ASSERT(ctx-Driver.RenderTexture);
 @@ -1583,8 +1583,8 @@ check_begin_texture_render(struct gl_context *ctx,
 struct gl_framebuffer *fb)
  * If so, call ctx-Driver.FinishRenderTexture() for each texture to
  * notify the device driver that the texture image may have changed.
  */
 -static void
 -check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer
 *fb)
 +void
 +_mesa_check_end_texture_render(struct gl_context *ctx, struct
 gl_framebuffer *fb)
  {
    if (is_winsys_fbo(fb))
       return; /* can't render to texture with winsys framebuffers */
 @@ -1713,7 +1713,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint
 framebuffer)
       FLUSH_VERTICES(ctx, _NEW_BUFFERS);

       /* check if old readbuffer was render-to-texture */
 -      check_end_texture_render(ctx, oldReadFb);
 +      _mesa_check_end_texture_render(ctx, oldReadFb);

       _mesa_reference_framebuffer(ctx-ReadBuffer, newReadFb);
    }
 @@ -1723,13 +1723,13 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint
 framebuffer)

       /* check if old read/draw buffers were render-to-texture */
       if (!bindReadBuf)
 -         check_end_texture_render(ctx, oldReadFb);
 +         _mesa_check_end_texture_render(ctx, oldReadFb);

       if (oldDrawFb != oldReadFb)
 -         check_end_texture_render(ctx, oldDrawFb);
 +         _mesa_check_end_texture_render(ctx, oldDrawFb);

       /* check if newly bound framebuffer has any texture attachments */
 -      check_begin_texture_render(ctx, newDrawFb);
 +      _mesa_check_begin_texture_render(ctx, newDrawFb);

       _mesa_reference_framebuffer(ctx-DrawBuffer, newDrawFb);
    }
 diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
 index 7eb2005..ca6251c 100644
 --- a/src/mesa/main/fbobject.h
 +++ b/src/mesa/main/fbobject.h
 @@ -101,6 +101,12 @@ _mesa_is_legal_color_format(const struct gl_context
 *ctx, GLenum baseFormat);
  extern GLenum
  _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat);

 +extern void
 +_mesa_check_begin_texture_render(struct gl_context *ctx, struct
 gl_framebuffer *fb);
 +
 +extern void
 +_mesa_check_end_texture_render(struct gl_context *ctx, struct
 gl_framebuffer *fb);
 +
  extern GLboolean GLAPIENTRY
  _mesa_IsRenderbufferEXT(GLuint renderbuffer);

 diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak
 index 4b2ec08..9af4079 100644
 --- a/src/mesa/sources.mak
 +++ b/src/mesa/sources.mak
 @@ -229,6 +229,7 @@ STATETRACKER_SOURCES = \
        state_tracker/st_debug.c \
        state_tracker/st_draw.c \
        state_tracker/st_draw_feedback.c \
 +       state_tracker/st_draw_select_emul.c \
        state_tracker/st_extensions.c \
        state_tracker/st_format.c \
        state_tracker/st_gen_mipmap.c \
 diff --git a/src/mesa/state_tracker/st_cb_feedback.c
 b/src/mesa/state_tracker/st_cb_feedback.c
 index 9b85a39..c96c97c 100644
 --- a/src/mesa/state_tracker/st_cb_feedback.c
 +++ b/src/mesa/state_tracker/st_cb_feedback.c
 @@ -276,17 +276,28 @@ st_RenderMode(struct gl_context *ctx, GLenum newMode
 )
  {

Re: [Mesa-dev] [PATCH] Implement HW accelerated GL_SELECT

2011-08-25 Thread Brian Paul

On 08/25/2011 09:17 AM, Alex Deucher wrote:

On Wed, Aug 24, 2011 at 10:35 AM, Micaelkam1k...@gmail.com  wrote:

Any more feedback regarding this?
I now don't have much time to work on it again, but I may find some, so
knowing what's left to do would be nice...


Does anyone want to see this in a separate branch first, or should it
just go into master?


I'd like to see it go into a branch first so I can more easily play 
with it a bit.


-Brian
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] Implement HW accelerated GL_SELECT

2011-08-25 Thread Alex Deucher
On Thu, Aug 25, 2011 at 11:34 AM, Brian Paul bri...@vmware.com wrote:
 On 08/25/2011 09:17 AM, Alex Deucher wrote:

 On Wed, Aug 24, 2011 at 10:35 AM, Micaelkam1k...@gmail.com  wrote:

 Any more feedback regarding this?
 I now don't have much time to work on it again, but I may find some, so
 knowing what's left to do would be nice...

 Does anyone want to see this in a separate branch first, or should it
 just go into master?

 I'd like to see it go into a branch first so I can more easily play with it
 a bit.


Pushed to the hw_gl_select branch:
http://cgit.freedesktop.org/mesa/mesa/log/?h=hw_gl_select

Alex

 -Brian

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] Implement HW accelerated GL_SELECT

2011-08-24 Thread Micael
Any more feedback regarding this?

I now don't have much time to work on it again, but I may find some, so
knowing what's left to do would be nice...

On Thu, Aug 4, 2011 at 2:59 PM, Micael Dias kam1k...@gmail.com wrote:

 ---
  src/mesa/SConscript  |1 +
  src/mesa/main/fbobject.c |   16 +-
  src/mesa/main/fbobject.h |6 +
  src/mesa/sources.mak |1 +
  src/mesa/state_tracker/st_cb_feedback.c  |   21 +-
  src/mesa/state_tracker/st_context.h  |   10 +
  src/mesa/state_tracker/st_draw.h |   17 +
  src/mesa/state_tracker/st_draw_select_emul.c |  490
 ++
  8 files changed, 549 insertions(+), 13 deletions(-)
  create mode 100644 src/mesa/state_tracker/st_draw_select_emul.c

 diff --git a/src/mesa/SConscript b/src/mesa/SConscript
 index 24e2155..288b162 100644
 --- a/src/mesa/SConscript
 +++ b/src/mesa/SConscript
 @@ -262,6 +262,7 @@ statetracker_sources = [
 'state_tracker/st_debug.c',
 'state_tracker/st_draw.c',
 'state_tracker/st_draw_feedback.c',
 +'state_tracker/st_draw_select_emul.c',
 'state_tracker/st_extensions.c',
 'state_tracker/st_format.c',
 'state_tracker/st_gen_mipmap.c',
 diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
 index 82eb7fb..1aea62b 100644
 --- a/src/mesa/main/fbobject.c
 +++ b/src/mesa/main/fbobject.c
 @@ -1560,8 +1560,8 @@ _mesa_IsFramebufferEXT(GLuint framebuffer)
  * (render to texture).  Call ctx-Driver.RenderTexture() for such
  * attachments.
  */
 -static void
 -check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer
 *fb)
 +void
 +_mesa_check_begin_texture_render(struct gl_context *ctx, struct
 gl_framebuffer *fb)
  {
GLuint i;
ASSERT(ctx-Driver.RenderTexture);
 @@ -1583,8 +1583,8 @@ check_begin_texture_render(struct gl_context *ctx,
 struct gl_framebuffer *fb)
  * If so, call ctx-Driver.FinishRenderTexture() for each texture to
  * notify the device driver that the texture image may have changed.
  */
 -static void
 -check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer
 *fb)
 +void
 +_mesa_check_end_texture_render(struct gl_context *ctx, struct
 gl_framebuffer *fb)
  {
if (is_winsys_fbo(fb))
   return; /* can't render to texture with winsys framebuffers */
 @@ -1713,7 +1713,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint
 framebuffer)
   FLUSH_VERTICES(ctx, _NEW_BUFFERS);

   /* check if old readbuffer was render-to-texture */
 -  check_end_texture_render(ctx, oldReadFb);
 +  _mesa_check_end_texture_render(ctx, oldReadFb);

   _mesa_reference_framebuffer(ctx-ReadBuffer, newReadFb);
}
 @@ -1723,13 +1723,13 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint
 framebuffer)

   /* check if old read/draw buffers were render-to-texture */
   if (!bindReadBuf)
 - check_end_texture_render(ctx, oldReadFb);
 + _mesa_check_end_texture_render(ctx, oldReadFb);

   if (oldDrawFb != oldReadFb)
 - check_end_texture_render(ctx, oldDrawFb);
 + _mesa_check_end_texture_render(ctx, oldDrawFb);

   /* check if newly bound framebuffer has any texture attachments */
 -  check_begin_texture_render(ctx, newDrawFb);
 +  _mesa_check_begin_texture_render(ctx, newDrawFb);

   _mesa_reference_framebuffer(ctx-DrawBuffer, newDrawFb);
}
 diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
 index 7eb2005..ca6251c 100644
 --- a/src/mesa/main/fbobject.h
 +++ b/src/mesa/main/fbobject.h
 @@ -101,6 +101,12 @@ _mesa_is_legal_color_format(const struct gl_context
 *ctx, GLenum baseFormat);
  extern GLenum
  _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat);

 +extern void
 +_mesa_check_begin_texture_render(struct gl_context *ctx, struct
 gl_framebuffer *fb);
 +
 +extern void
 +_mesa_check_end_texture_render(struct gl_context *ctx, struct
 gl_framebuffer *fb);
 +
  extern GLboolean GLAPIENTRY
  _mesa_IsRenderbufferEXT(GLuint renderbuffer);

 diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak
 index 4b2ec08..9af4079 100644
 --- a/src/mesa/sources.mak
 +++ b/src/mesa/sources.mak
 @@ -229,6 +229,7 @@ STATETRACKER_SOURCES = \
state_tracker/st_debug.c \
state_tracker/st_draw.c \
state_tracker/st_draw_feedback.c \
 +   state_tracker/st_draw_select_emul.c \
state_tracker/st_extensions.c \
state_tracker/st_format.c \
state_tracker/st_gen_mipmap.c \
 diff --git a/src/mesa/state_tracker/st_cb_feedback.c
 b/src/mesa/state_tracker/st_cb_feedback.c
 index 9b85a39..c96c97c 100644
 --- a/src/mesa/state_tracker/st_cb_feedback.c
 +++ b/src/mesa/state_tracker/st_cb_feedback.c
 @@ -276,17 +276,28 @@ st_RenderMode(struct gl_context *ctx, GLenum newMode
 )
  {
struct st_context *st = st_context(ctx);
struct draw_context *draw = st-draw;
 +   bool hw_acc_path = _mesa_getenv(MESA_HW_SELECT) 
 

[Mesa-dev] [PATCH] Implement HW accelerated GL_SELECT

2011-08-04 Thread Micael Dias
---
 src/mesa/SConscript  |1 +
 src/mesa/main/fbobject.c |   16 +-
 src/mesa/main/fbobject.h |6 +
 src/mesa/sources.mak |1 +
 src/mesa/state_tracker/st_cb_feedback.c  |   21 +-
 src/mesa/state_tracker/st_context.h  |   10 +
 src/mesa/state_tracker/st_draw.h |   17 +
 src/mesa/state_tracker/st_draw_select_emul.c |  468 ++
 8 files changed, 527 insertions(+), 13 deletions(-)
 create mode 100644 src/mesa/state_tracker/st_draw_select_emul.c

diff --git a/src/mesa/SConscript b/src/mesa/SConscript
index 24e2155..288b162 100644
--- a/src/mesa/SConscript
+++ b/src/mesa/SConscript
@@ -262,6 +262,7 @@ statetracker_sources = [
 'state_tracker/st_debug.c',
 'state_tracker/st_draw.c',
 'state_tracker/st_draw_feedback.c',
+'state_tracker/st_draw_select_emul.c',
 'state_tracker/st_extensions.c',
 'state_tracker/st_format.c',
 'state_tracker/st_gen_mipmap.c',
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 82eb7fb..1aea62b 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -1560,8 +1560,8 @@ _mesa_IsFramebufferEXT(GLuint framebuffer)
  * (render to texture).  Call ctx-Driver.RenderTexture() for such
  * attachments.
  */
-static void
-check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer *fb)
+void
+_mesa_check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer 
*fb)
 {
GLuint i;
ASSERT(ctx-Driver.RenderTexture);
@@ -1583,8 +1583,8 @@ check_begin_texture_render(struct gl_context *ctx, struct 
gl_framebuffer *fb)
  * If so, call ctx-Driver.FinishRenderTexture() for each texture to
  * notify the device driver that the texture image may have changed.
  */
-static void
-check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer *fb)
+void
+_mesa_check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer 
*fb)
 {
if (is_winsys_fbo(fb))
   return; /* can't render to texture with winsys framebuffers */
@@ -1713,7 +1713,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint 
framebuffer)
   FLUSH_VERTICES(ctx, _NEW_BUFFERS);
 
   /* check if old readbuffer was render-to-texture */
-  check_end_texture_render(ctx, oldReadFb);
+  _mesa_check_end_texture_render(ctx, oldReadFb);
 
   _mesa_reference_framebuffer(ctx-ReadBuffer, newReadFb);
}
@@ -1723,13 +1723,13 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint 
framebuffer)
 
   /* check if old read/draw buffers were render-to-texture */
   if (!bindReadBuf)
- check_end_texture_render(ctx, oldReadFb);
+ _mesa_check_end_texture_render(ctx, oldReadFb);
 
   if (oldDrawFb != oldReadFb)
- check_end_texture_render(ctx, oldDrawFb);
+ _mesa_check_end_texture_render(ctx, oldDrawFb);
 
   /* check if newly bound framebuffer has any texture attachments */
-  check_begin_texture_render(ctx, newDrawFb);
+  _mesa_check_begin_texture_render(ctx, newDrawFb);
 
   _mesa_reference_framebuffer(ctx-DrawBuffer, newDrawFb);
}
diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
index 7eb2005..ca6251c 100644
--- a/src/mesa/main/fbobject.h
+++ b/src/mesa/main/fbobject.h
@@ -101,6 +101,12 @@ _mesa_is_legal_color_format(const struct gl_context *ctx, 
GLenum baseFormat);
 extern GLenum
 _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat);
 
+extern void
+_mesa_check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer 
*fb);
+
+extern void
+_mesa_check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer 
*fb);
+
 extern GLboolean GLAPIENTRY
 _mesa_IsRenderbufferEXT(GLuint renderbuffer);
 
diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak
index 4b2ec08..9af4079 100644
--- a/src/mesa/sources.mak
+++ b/src/mesa/sources.mak
@@ -229,6 +229,7 @@ STATETRACKER_SOURCES = \
state_tracker/st_debug.c \
state_tracker/st_draw.c \
state_tracker/st_draw_feedback.c \
+   state_tracker/st_draw_select_emul.c \
state_tracker/st_extensions.c \
state_tracker/st_format.c \
state_tracker/st_gen_mipmap.c \
diff --git a/src/mesa/state_tracker/st_cb_feedback.c 
b/src/mesa/state_tracker/st_cb_feedback.c
index 9b85a39..c96c97c 100644
--- a/src/mesa/state_tracker/st_cb_feedback.c
+++ b/src/mesa/state_tracker/st_cb_feedback.c
@@ -276,17 +276,28 @@ st_RenderMode(struct gl_context *ctx, GLenum newMode )
 {
struct st_context *st = st_context(ctx);
struct draw_context *draw = st-draw;
+   bool hw_acc_path = _mesa_getenv(MESA_HW_SELECT)  
!st-select_emul.hw_unsupported;
 
if (newMode == GL_RENDER) {
   /* restore normal VBO draw function */
   vbo_set_draw_func(ctx, st_draw_vbo);
}
else if (newMode == GL_SELECT) {
-  if (!st-selection_stage)
- st-selection_stage = draw_glselect_stage(ctx, draw);
-  

[Mesa-dev] [PATCH] Implement HW accelerated GL_SELECT

2011-08-04 Thread Micael Dias
---
 src/mesa/SConscript  |1 +
 src/mesa/main/fbobject.c |   16 +-
 src/mesa/main/fbobject.h |6 +
 src/mesa/sources.mak |1 +
 src/mesa/state_tracker/st_cb_feedback.c  |   21 +-
 src/mesa/state_tracker/st_context.h  |   10 +
 src/mesa/state_tracker/st_draw.h |   17 +
 src/mesa/state_tracker/st_draw_select_emul.c |  490 ++
 8 files changed, 549 insertions(+), 13 deletions(-)
 create mode 100644 src/mesa/state_tracker/st_draw_select_emul.c

diff --git a/src/mesa/SConscript b/src/mesa/SConscript
index 24e2155..288b162 100644
--- a/src/mesa/SConscript
+++ b/src/mesa/SConscript
@@ -262,6 +262,7 @@ statetracker_sources = [
 'state_tracker/st_debug.c',
 'state_tracker/st_draw.c',
 'state_tracker/st_draw_feedback.c',
+'state_tracker/st_draw_select_emul.c',
 'state_tracker/st_extensions.c',
 'state_tracker/st_format.c',
 'state_tracker/st_gen_mipmap.c',
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 82eb7fb..1aea62b 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -1560,8 +1560,8 @@ _mesa_IsFramebufferEXT(GLuint framebuffer)
  * (render to texture).  Call ctx-Driver.RenderTexture() for such
  * attachments.
  */
-static void
-check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer *fb)
+void
+_mesa_check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer 
*fb)
 {
GLuint i;
ASSERT(ctx-Driver.RenderTexture);
@@ -1583,8 +1583,8 @@ check_begin_texture_render(struct gl_context *ctx, struct 
gl_framebuffer *fb)
  * If so, call ctx-Driver.FinishRenderTexture() for each texture to
  * notify the device driver that the texture image may have changed.
  */
-static void
-check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer *fb)
+void
+_mesa_check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer 
*fb)
 {
if (is_winsys_fbo(fb))
   return; /* can't render to texture with winsys framebuffers */
@@ -1713,7 +1713,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint 
framebuffer)
   FLUSH_VERTICES(ctx, _NEW_BUFFERS);
 
   /* check if old readbuffer was render-to-texture */
-  check_end_texture_render(ctx, oldReadFb);
+  _mesa_check_end_texture_render(ctx, oldReadFb);
 
   _mesa_reference_framebuffer(ctx-ReadBuffer, newReadFb);
}
@@ -1723,13 +1723,13 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint 
framebuffer)
 
   /* check if old read/draw buffers were render-to-texture */
   if (!bindReadBuf)
- check_end_texture_render(ctx, oldReadFb);
+ _mesa_check_end_texture_render(ctx, oldReadFb);
 
   if (oldDrawFb != oldReadFb)
- check_end_texture_render(ctx, oldDrawFb);
+ _mesa_check_end_texture_render(ctx, oldDrawFb);
 
   /* check if newly bound framebuffer has any texture attachments */
-  check_begin_texture_render(ctx, newDrawFb);
+  _mesa_check_begin_texture_render(ctx, newDrawFb);
 
   _mesa_reference_framebuffer(ctx-DrawBuffer, newDrawFb);
}
diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
index 7eb2005..ca6251c 100644
--- a/src/mesa/main/fbobject.h
+++ b/src/mesa/main/fbobject.h
@@ -101,6 +101,12 @@ _mesa_is_legal_color_format(const struct gl_context *ctx, 
GLenum baseFormat);
 extern GLenum
 _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat);
 
+extern void
+_mesa_check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer 
*fb);
+
+extern void
+_mesa_check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer 
*fb);
+
 extern GLboolean GLAPIENTRY
 _mesa_IsRenderbufferEXT(GLuint renderbuffer);
 
diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak
index 4b2ec08..9af4079 100644
--- a/src/mesa/sources.mak
+++ b/src/mesa/sources.mak
@@ -229,6 +229,7 @@ STATETRACKER_SOURCES = \
state_tracker/st_debug.c \
state_tracker/st_draw.c \
state_tracker/st_draw_feedback.c \
+   state_tracker/st_draw_select_emul.c \
state_tracker/st_extensions.c \
state_tracker/st_format.c \
state_tracker/st_gen_mipmap.c \
diff --git a/src/mesa/state_tracker/st_cb_feedback.c 
b/src/mesa/state_tracker/st_cb_feedback.c
index 9b85a39..c96c97c 100644
--- a/src/mesa/state_tracker/st_cb_feedback.c
+++ b/src/mesa/state_tracker/st_cb_feedback.c
@@ -276,17 +276,28 @@ st_RenderMode(struct gl_context *ctx, GLenum newMode )
 {
struct st_context *st = st_context(ctx);
struct draw_context *draw = st-draw;
+   bool hw_acc_path = _mesa_getenv(MESA_HW_SELECT)  
!st-select_emul.hw_unsupported;
 
if (newMode == GL_RENDER) {
   /* restore normal VBO draw function */
   vbo_set_draw_func(ctx, st_draw_vbo);
}
else if (newMode == GL_SELECT) {
-  if (!st-selection_stage)
- st-selection_stage = draw_glselect_stage(ctx, draw);
-  

[Mesa-dev] [PATCH] Implement HW accelerated GL_SELECT

2011-08-02 Thread Micael Dias
---
 src/mesa/main/mtypes.h   |7 +
 src/mesa/state_tracker/st_cb_feedback.c  |   21 +-
 src/mesa/state_tracker/st_draw.h |   17 +
 src/mesa/state_tracker/st_draw_select_emul.c |  463 ++
 src/mesa/SConscript  |1 +
 src/mesa/sources.mak |1 +
 6 files changed, 505 insertions(+), 5 deletions(-)
 create mode 100644 src/mesa/state_tracker/st_draw_select_emul.c

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index b881183..10222d8 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1721,6 +1721,13 @@ struct gl_selection
GLboolean HitFlag;  /** hit flag */
GLfloat HitMinZ;/** minimum hit depth */
GLfloat HitMaxZ;/** maximum hit depth */
+   struct gl_selection_emul /* data related to hw accelerated GL_SELECT */
+   {
+  GLboolean hw_unsupported;
+  struct gl_framebuffer *fbo;
+  GLuint renderBuffer_depth;
+  GLuint renderBuffer_color;
+   } emul;
 };
 
 
diff --git a/src/mesa/state_tracker/st_cb_feedback.c 
b/src/mesa/state_tracker/st_cb_feedback.c
index 9b85a39..9382895 100644
--- a/src/mesa/state_tracker/st_cb_feedback.c
+++ b/src/mesa/state_tracker/st_cb_feedback.c
@@ -276,17 +276,28 @@ st_RenderMode(struct gl_context *ctx, GLenum newMode )
 {
struct st_context *st = st_context(ctx);
struct draw_context *draw = st-draw;
+   bool hw_acc_path = _mesa_getenv(MESA_HW_SELECT)  
!ctx-Select.emul.hw_unsupported;
 
if (newMode == GL_RENDER) {
   /* restore normal VBO draw function */
   vbo_set_draw_func(ctx, st_draw_vbo);
}
else if (newMode == GL_SELECT) {
-  if (!st-selection_stage)
- st-selection_stage = draw_glselect_stage(ctx, draw);
-  draw_set_rasterize_stage(draw, st-selection_stage);
-  /* Plug in new vbo draw function */
-  vbo_set_draw_func(ctx, st_feedback_draw_vbo);
+  if (hw_acc_path) {
+ if (st_select_emul_begin(ctx)) {
+vbo_set_draw_func(ctx, st_select_draw_func);
+ }
+ else {
+hw_acc_path = false;
+ }
+  }
+  if (!hw_acc_path) {
+ if (!st-selection_stage)
+st-selection_stage = draw_glselect_stage(ctx, draw);
+ draw_set_rasterize_stage(draw, st-selection_stage);
+ /* Plug in new vbo draw function */
+ vbo_set_draw_func(ctx, st_feedback_draw_vbo);
+  }
}
else {
   if (!st-feedback_stage)
diff --git a/src/mesa/state_tracker/st_draw.h b/src/mesa/state_tracker/st_draw.h
index a7b50ce..d27e321 100644
--- a/src/mesa/state_tracker/st_draw.h
+++ b/src/mesa/state_tracker/st_draw.h
@@ -87,5 +87,22 @@ pointer_to_offset(const void *ptr)
return (unsigned) (((unsigned long) ptr)  0xUL);
 }
 
+/* Functions used by the hw accelerated GL_SELECT emulator
+ */
+extern bool
+st_select_emul_begin(struct gl_context *ctx);
+
+extern void
+st_select_emul_end(struct gl_context *ctx);
+
+extern void
+st_select_draw_func(struct gl_context *ctx,
+const struct gl_client_array **arrays,
+const struct _mesa_prim *prims,
+GLuint nr_prims,
+const struct _mesa_index_buffer *ib,
+GLboolean index_bounds_valid,
+GLuint min_index,
+GLuint max_index);
 
 #endif
diff --git a/src/mesa/state_tracker/st_draw_select_emul.c 
b/src/mesa/state_tracker/st_draw_select_emul.c
new file mode 100644
index 000..78065dd
--- /dev/null
+++ b/src/mesa/state_tracker/st_draw_select_emul.c
@@ -0,0 +1,463 @@
+/**
+ * 
+ * Copyright .
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * Software), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **/
+
+#include main/imports.h
+#include main/image.h
+#include 

Re: [Mesa-dev] [PATCH] Implement HW accelerated GL_SELECT

2011-08-02 Thread Alex Deucher
On Tue, Aug 2, 2011 at 9:37 AM, Micael Dias kam1k...@gmail.com wrote:
 ---

Might want to mention the relevant bug and Pierre's prior patches for
future reference in case anyone wants to implement it for non-gallium
drivers.  It would probably be useful to come up with a piglit test
for this, although I'm not sure how easy it would be to test GL_SELECT
in an automated way.

  src/mesa/main/mtypes.h                       |    7 +
  src/mesa/state_tracker/st_cb_feedback.c      |   21 +-
  src/mesa/state_tracker/st_draw.h             |   17 +
  src/mesa/state_tracker/st_draw_select_emul.c |  463 
 ++
  src/mesa/SConscript                          |    1 +
  src/mesa/sources.mak                         |    1 +
  6 files changed, 505 insertions(+), 5 deletions(-)
  create mode 100644 src/mesa/state_tracker/st_draw_select_emul.c

 diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
 index b881183..10222d8 100644
 --- a/src/mesa/main/mtypes.h
 +++ b/src/mesa/main/mtypes.h
 @@ -1721,6 +1721,13 @@ struct gl_selection
    GLboolean HitFlag;  /** hit flag */
    GLfloat HitMinZ;    /** minimum hit depth */
    GLfloat HitMaxZ;    /** maximum hit depth */
 +   struct gl_selection_emul /* data related to hw accelerated GL_SELECT */
 +   {
 +      GLboolean hw_unsupported;
 +      struct gl_framebuffer *fbo;
 +      GLuint renderBuffer_depth;
 +      GLuint renderBuffer_color;
 +   } emul;
  };


 diff --git a/src/mesa/state_tracker/st_cb_feedback.c 
 b/src/mesa/state_tracker/st_cb_feedback.c
 index 9b85a39..9382895 100644
 --- a/src/mesa/state_tracker/st_cb_feedback.c
 +++ b/src/mesa/state_tracker/st_cb_feedback.c
 @@ -276,17 +276,28 @@ st_RenderMode(struct gl_context *ctx, GLenum newMode )
  {
    struct st_context *st = st_context(ctx);
    struct draw_context *draw = st-draw;
 +   bool hw_acc_path = _mesa_getenv(MESA_HW_SELECT)  
 !ctx-Select.emul.hw_unsupported;

    if (newMode == GL_RENDER) {
       /* restore normal VBO draw function */
       vbo_set_draw_func(ctx, st_draw_vbo);
    }
    else if (newMode == GL_SELECT) {
 -      if (!st-selection_stage)
 -         st-selection_stage = draw_glselect_stage(ctx, draw);
 -      draw_set_rasterize_stage(draw, st-selection_stage);
 -      /* Plug in new vbo draw function */
 -      vbo_set_draw_func(ctx, st_feedback_draw_vbo);
 +      if (hw_acc_path) {
 +         if (st_select_emul_begin(ctx)) {
 +            vbo_set_draw_func(ctx, st_select_draw_func);
 +         }
 +         else {
 +            hw_acc_path = false;
 +         }
 +      }
 +      if (!hw_acc_path) {
 +         if (!st-selection_stage)
 +            st-selection_stage = draw_glselect_stage(ctx, draw);
 +         draw_set_rasterize_stage(draw, st-selection_stage);
 +         /* Plug in new vbo draw function */
 +         vbo_set_draw_func(ctx, st_feedback_draw_vbo);
 +      }
    }
    else {
       if (!st-feedback_stage)
 diff --git a/src/mesa/state_tracker/st_draw.h 
 b/src/mesa/state_tracker/st_draw.h
 index a7b50ce..d27e321 100644
 --- a/src/mesa/state_tracker/st_draw.h
 +++ b/src/mesa/state_tracker/st_draw.h
 @@ -87,5 +87,22 @@ pointer_to_offset(const void *ptr)
    return (unsigned) (((unsigned long) ptr)  0xUL);
  }

 +/* Functions used by the hw accelerated GL_SELECT emulator
 + */
 +extern bool
 +st_select_emul_begin(struct gl_context *ctx);
 +
 +extern void
 +st_select_emul_end(struct gl_context *ctx);
 +
 +extern void
 +st_select_draw_func(struct gl_context *ctx,
 +            const struct gl_client_array **arrays,
 +            const struct _mesa_prim *prims,
 +            GLuint nr_prims,
 +            const struct _mesa_index_buffer *ib,
 +            GLboolean index_bounds_valid,
 +            GLuint min_index,
 +            GLuint max_index);

  #endif
 diff --git a/src/mesa/state_tracker/st_draw_select_emul.c 
 b/src/mesa/state_tracker/st_draw_select_emul.c
 new file mode 100644
 index 000..78065dd
 --- /dev/null
 +++ b/src/mesa/state_tracker/st_draw_select_emul.c
 @@ -0,0 +1,463 @@
 +/**
 + *
 + * Copyright .

Fix up the copyright.

 + * All Rights Reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a
 + * copy of this software and associated documentation files (the
 + * Software), to deal in the Software without restriction, including
 + * without limitation the rights to use, copy, modify, merge, publish,
 + * distribute, sub license, and/or sell copies of the Software, and to
 + * permit persons to whom the Software is furnished to do so, subject to
 + * the following conditions:
 + *
 + * The above copyright notice and this permission notice (including the
 + * next paragraph) shall be included in all copies or substantial portions
 + * of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS
 + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 + * 

[Mesa-dev] [PATCH] Implement HW accelerated GL_SELECT

2011-08-02 Thread Micael Dias
---
 src/mesa/SConscript  |1 +
 src/mesa/main/mtypes.h   |7 +
 src/mesa/sources.mak |1 +
 src/mesa/state_tracker/st_cb_feedback.c  |   21 +-
 src/mesa/state_tracker/st_draw.h |   17 +
 src/mesa/state_tracker/st_draw_select_emul.c |  475 ++
 6 files changed, 517 insertions(+), 5 deletions(-)
 create mode 100644 src/mesa/state_tracker/st_draw_select_emul.c

diff --git a/src/mesa/SConscript b/src/mesa/SConscript
index 24e2155..288b162 100644
--- a/src/mesa/SConscript
+++ b/src/mesa/SConscript
@@ -262,6 +262,7 @@ statetracker_sources = [
 'state_tracker/st_debug.c',
 'state_tracker/st_draw.c',
 'state_tracker/st_draw_feedback.c',
+'state_tracker/st_draw_select_emul.c',
 'state_tracker/st_extensions.c',
 'state_tracker/st_format.c',
 'state_tracker/st_gen_mipmap.c',
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index b881183..10222d8 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1721,6 +1721,13 @@ struct gl_selection
GLboolean HitFlag;  /** hit flag */
GLfloat HitMinZ;/** minimum hit depth */
GLfloat HitMaxZ;/** maximum hit depth */
+   struct gl_selection_emul /* data related to hw accelerated GL_SELECT */
+   {
+  GLboolean hw_unsupported;
+  struct gl_framebuffer *fbo;
+  GLuint renderBuffer_depth;
+  GLuint renderBuffer_color;
+   } emul;
 };
 
 
diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak
index 4b2ec08..9af4079 100644
--- a/src/mesa/sources.mak
+++ b/src/mesa/sources.mak
@@ -229,6 +229,7 @@ STATETRACKER_SOURCES = \
state_tracker/st_debug.c \
state_tracker/st_draw.c \
state_tracker/st_draw_feedback.c \
+   state_tracker/st_draw_select_emul.c \
state_tracker/st_extensions.c \
state_tracker/st_format.c \
state_tracker/st_gen_mipmap.c \
diff --git a/src/mesa/state_tracker/st_cb_feedback.c 
b/src/mesa/state_tracker/st_cb_feedback.c
index 9b85a39..9382895 100644
--- a/src/mesa/state_tracker/st_cb_feedback.c
+++ b/src/mesa/state_tracker/st_cb_feedback.c
@@ -276,17 +276,28 @@ st_RenderMode(struct gl_context *ctx, GLenum newMode )
 {
struct st_context *st = st_context(ctx);
struct draw_context *draw = st-draw;
+   bool hw_acc_path = _mesa_getenv(MESA_HW_SELECT)  
!ctx-Select.emul.hw_unsupported;
 
if (newMode == GL_RENDER) {
   /* restore normal VBO draw function */
   vbo_set_draw_func(ctx, st_draw_vbo);
}
else if (newMode == GL_SELECT) {
-  if (!st-selection_stage)
- st-selection_stage = draw_glselect_stage(ctx, draw);
-  draw_set_rasterize_stage(draw, st-selection_stage);
-  /* Plug in new vbo draw function */
-  vbo_set_draw_func(ctx, st_feedback_draw_vbo);
+  if (hw_acc_path) {
+ if (st_select_emul_begin(ctx)) {
+vbo_set_draw_func(ctx, st_select_draw_func);
+ }
+ else {
+hw_acc_path = false;
+ }
+  }
+  if (!hw_acc_path) {
+ if (!st-selection_stage)
+st-selection_stage = draw_glselect_stage(ctx, draw);
+ draw_set_rasterize_stage(draw, st-selection_stage);
+ /* Plug in new vbo draw function */
+ vbo_set_draw_func(ctx, st_feedback_draw_vbo);
+  }
}
else {
   if (!st-feedback_stage)
diff --git a/src/mesa/state_tracker/st_draw.h b/src/mesa/state_tracker/st_draw.h
index a7b50ce..d27e321 100644
--- a/src/mesa/state_tracker/st_draw.h
+++ b/src/mesa/state_tracker/st_draw.h
@@ -87,5 +87,22 @@ pointer_to_offset(const void *ptr)
return (unsigned) (((unsigned long) ptr)  0xUL);
 }
 
+/* Functions used by the hw accelerated GL_SELECT emulator
+ */
+extern bool
+st_select_emul_begin(struct gl_context *ctx);
+
+extern void
+st_select_emul_end(struct gl_context *ctx);
+
+extern void
+st_select_draw_func(struct gl_context *ctx,
+const struct gl_client_array **arrays,
+const struct _mesa_prim *prims,
+GLuint nr_prims,
+const struct _mesa_index_buffer *ib,
+GLboolean index_bounds_valid,
+GLuint min_index,
+GLuint max_index);
 
 #endif
diff --git a/src/mesa/state_tracker/st_draw_select_emul.c 
b/src/mesa/state_tracker/st_draw_select_emul.c
new file mode 100644
index 000..ea54f22
--- /dev/null
+++ b/src/mesa/state_tracker/st_draw_select_emul.c
@@ -0,0 +1,475 @@
+/**
+ * 
+ * Copyright 2011 Micael Dias kam1kaz3 (at) gmail (dot) com.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * Software), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software,