Mesa (master): svga: compute need_swvfetch in svga_create_vertex_elements_state()

Brian Paul brianp at kemper.freedesktop.org
Thu Apr 17 18:36:19 UTC 2014


Module: Mesa
Branch: master
Commit: cb34575e19e10b94e90ffb730b962e6930b47a19
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=cb34575e19e10b94e90ffb730b962e6930b47a19

Author: Brian Paul <brianp at vmware.com>
Date:   Thu Apr 17 11:27:53 2014 -0700

svga: compute need_swvfetch in svga_create_vertex_elements_state()

This saves us doing it at state validation time.

Reviewed-by: Matthew McClure <mcclurem at vmware.com>

---

 src/gallium/drivers/svga/svga_context.h          |    1 +
 src/gallium/drivers/svga/svga_pipe_vertex.c      |    6 ++++++
 src/gallium/drivers/svga/svga_state_need_swtnl.c |   15 ++-------------
 3 files changed, 9 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/svga/svga_context.h b/src/gallium/drivers/svga/svga_context.h
index 4ff0ed7..a75f2a8 100644
--- a/src/gallium/drivers/svga/svga_context.h
+++ b/src/gallium/drivers/svga/svga_context.h
@@ -203,6 +203,7 @@ struct svga_velems_state {
    SVGA3dDeclType decl_type[PIPE_MAX_ATTRIBS]; /**< vertex attrib formats */
    unsigned adjust_attrib_range; /* bitmask of attrs needing range adjustment */
    unsigned adjust_attrib_w_1;   /* bitmask of attrs needing w = 1 */
+   boolean need_swvfetch;
 };
 
 /* Use to calculate differences between state emitted to hardware and
diff --git a/src/gallium/drivers/svga/svga_pipe_vertex.c b/src/gallium/drivers/svga/svga_pipe_vertex.c
index f951c0d..faf77f3 100644
--- a/src/gallium/drivers/svga/svga_pipe_vertex.c
+++ b/src/gallium/drivers/svga/svga_pipe_vertex.c
@@ -161,6 +161,7 @@ svga_create_vertex_elements_state(struct pipe_context *pipe,
       velems->count = count;
       memcpy(velems->velem, attribs, sizeof(*attribs) * count);
 
+      velems->need_swvfetch = FALSE;
       velems->adjust_attrib_range = 0x0;
       velems->adjust_attrib_w_1 = 0x0;
 
@@ -168,6 +169,11 @@ svga_create_vertex_elements_state(struct pipe_context *pipe,
       for (i = 0; i < count; i++) {
          enum pipe_format f = attribs[i].src_format;
          velems->decl_type[i] = translate_vertex_format(f);
+         if (velems->decl_type[i] == SVGA3D_DECLTYPE_MAX) {
+            /* Unsupported format - use software fetch */
+            velems->need_swvfetch = TRUE;
+            break;
+         }
 
          if (attrib_needs_range_adjustment(f)) {
             velems->adjust_attrib_range |= (1 << i);
diff --git a/src/gallium/drivers/svga/svga_state_need_swtnl.c b/src/gallium/drivers/svga/svga_state_need_swtnl.c
index c89e003..cac39d6 100644
--- a/src/gallium/drivers/svga/svga_state_need_swtnl.c
+++ b/src/gallium/drivers/svga/svga_state_need_swtnl.c
@@ -34,24 +34,13 @@
 static enum pipe_error
 update_need_swvfetch(struct svga_context *svga, unsigned dirty)
 {
-   unsigned i;
-   boolean need_swvfetch = FALSE;
-
    if (!svga->curr.velems) {
       /* No vertex elements bound. */
       return PIPE_OK;
    }
 
-   for (i = 0; i < svga->curr.velems->count; i++) {
-      if (svga->curr.velems->decl_type[i] == SVGA3D_DECLTYPE_MAX) {
-         /* Unsupported format - use software fetch */
-         need_swvfetch = TRUE;
-         break;
-      }
-   }
-
-   if (need_swvfetch != svga->state.sw.need_swvfetch) {
-      svga->state.sw.need_swvfetch = need_swvfetch;
+   if (svga->state.sw.need_swvfetch != svga->curr.velems->need_swvfetch) {
+      svga->state.sw.need_swvfetch = svga->curr.velems->need_swvfetch;
       svga->dirty |= SVGA_NEW_NEED_SWVFETCH;
    }
 




More information about the mesa-commit mailing list