Re: [Mesa-dev] [PATCH] Implement HW accelerated GL_SELECT
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
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
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
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
--- 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
--- 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
--- 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
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
--- 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,