Mesa (master): llvmpipe: Pass the fs variant to the rasterizer.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Sun May 30 09:30:13 UTC 2010


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

Author: José Fonseca <jfonseca at vmware.com>
Date:   Wed May 26 15:11:17 2010 +0100

llvmpipe: Pass the fs variant to the rasterizer.

---

 src/gallium/drivers/llvmpipe/lp_rast.c      |    6 +-
 src/gallium/drivers/llvmpipe/lp_rast.h      |    8 +--
 src/gallium/drivers/llvmpipe/lp_rast_priv.h |    3 +-
 src/gallium/drivers/llvmpipe/lp_setup.c     |   14 ++---
 src/gallium/drivers/llvmpipe/lp_setup.h     |    8 +--
 src/gallium/drivers/llvmpipe/lp_setup_tri.c |    3 +-
 src/gallium/drivers/llvmpipe/lp_state.h     |   54 +---------------
 src/gallium/drivers/llvmpipe/lp_state_fs.c  |    5 +-
 src/gallium/drivers/llvmpipe/lp_state_fs.h  |   93 +++++++++++++++++++++++++++
 9 files changed, 113 insertions(+), 81 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c
index 6bb868b..891a405 100644
--- a/src/gallium/drivers/llvmpipe/lp_rast.c
+++ b/src/gallium/drivers/llvmpipe/lp_rast.c
@@ -413,6 +413,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task,
    struct lp_rasterizer *rast = task->rast;
    const struct lp_rast_state *state = task->current_state;
    const struct lp_rast_shader_inputs *inputs = arg.shade_tile;
+   struct lp_fragment_shader_variant *variant = state->variant;
    const unsigned tile_x = task->x, tile_y = task->y;
    unsigned x, y;
 
@@ -434,7 +435,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task,
          depth = lp_rast_get_depth_block_pointer(rast, tile_x + x, tile_y + y);
 
          /* run shader on 4x4 block */
-         state->jit_function[RAST_WHOLE]( &state->jit_context,
+         variant->jit_function[RAST_WHOLE]( &state->jit_context,
                                           tile_x + x, tile_y + y,
                                           inputs->facing,
                                           inputs->a0,
@@ -461,6 +462,7 @@ void lp_rast_shade_quads( struct lp_rasterizer_task *task,
                           int32_t c1, int32_t c2, int32_t c3)
 {
    const struct lp_rast_state *state = task->current_state;
+   struct lp_fragment_shader_variant *variant = state->variant;
    struct lp_rasterizer *rast = task->rast;
    uint8_t *color[PIPE_MAX_COLOR_BUFS];
    void *depth;
@@ -492,7 +494,7 @@ void lp_rast_shade_quads( struct lp_rasterizer_task *task,
    assert(lp_check_alignment(inputs->step[2], 16));
 
    /* run shader on 4x4 block */
-   state->jit_function[RAST_EDGE_TEST]( &state->jit_context,
+   variant->jit_function[RAST_EDGE_TEST]( &state->jit_context,
                                         x, y,
                                         inputs->facing,
                                         inputs->a0,
diff --git a/src/gallium/drivers/llvmpipe/lp_rast.h b/src/gallium/drivers/llvmpipe/lp_rast.h
index 881f475..ff0e3cf 100644
--- a/src/gallium/drivers/llvmpipe/lp_rast.h
+++ b/src/gallium/drivers/llvmpipe/lp_rast.h
@@ -66,13 +66,9 @@ struct lp_rast_state {
    struct lp_jit_context jit_context;
    
    /* The shader itself.  Probably we also need to pass a pointer to
-    * the tile color/z/stencil data somehow:
-    * jit_function[0] skips the triangle in/out test code
-    * jit_function[1] does triangle in/out testing
+    * the tile color/z/stencil data somehow
      */
-   lp_jit_frag_func jit_function[2];
-
-   boolean opaque;
+   struct lp_fragment_shader_variant *variant;
 };
 
 
diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
index efc013f..9c2d445 100644
--- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h
+++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
@@ -205,6 +205,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task,
 {
    struct lp_rasterizer *rast = task->rast;
    const struct lp_rast_state *state = task->current_state;
+   struct lp_fragment_shader_variant *variant = state->variant;
    uint8_t *color[PIPE_MAX_COLOR_BUFS];
    void *depth;
    unsigned i;
@@ -216,7 +217,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task,
    depth = lp_rast_get_depth_block_pointer(rast, x, y);
 
    /* run shader on 4x4 block */
-   state->jit_function[RAST_WHOLE]( &state->jit_context,
+   variant->jit_function[RAST_WHOLE]( &state->jit_context,
                                     x, y,
                                     inputs->facing,
                                     inputs->a0,
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index 656e6cc..bdb40a2 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -415,18 +415,14 @@ lp_setup_set_fs_inputs( struct lp_setup_context *setup,
 }
 
 void
-lp_setup_set_fs_functions( struct lp_setup_context *setup,
-                           lp_jit_frag_func jit_function0,
-                           lp_jit_frag_func jit_function1,
-                           boolean opaque )
+lp_setup_set_fs_variant( struct lp_setup_context *setup,
+                         struct lp_fragment_shader_variant *variant)
 {
    LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__,
-          cast_lp_jit_frag_func_to_voidptr(jit_function0));
+          variant);
    /* FIXME: reference count */
 
-   setup->fs.current.jit_function[0] = jit_function0;
-   setup->fs.current.jit_function[1] = jit_function1;
-   setup->fs.current.opaque = opaque;
+   setup->fs.current.variant = variant;
    setup->dirty |= LP_SETUP_NEW_FS;
 }
 
@@ -625,7 +621,7 @@ lp_setup_update_state( struct lp_setup_context *setup )
 
    scene = lp_setup_get_current_scene(setup);
 
-   assert(setup->fs.current.jit_function);
+   assert(setup->fs.current.variant);
 
    /* Some of the 'draw' pipeline stages may have changed some driver state.
     * Make sure we've processed those state changes before anything else.
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.h b/src/gallium/drivers/llvmpipe/lp_setup.h
index 10db03b..719cf98 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.h
+++ b/src/gallium/drivers/llvmpipe/lp_setup.h
@@ -58,7 +58,7 @@ struct pipe_surface;
 struct pipe_blend_color;
 struct pipe_screen;
 struct pipe_framebuffer_state;
-struct lp_fragment_shader;
+struct lp_fragment_shader_variant;
 struct lp_jit_context;
 struct llvmpipe_query;
 
@@ -100,10 +100,8 @@ lp_setup_set_fs_inputs( struct lp_setup_context *setup,
                         unsigned nr );
 
 void
-lp_setup_set_fs_functions( struct lp_setup_context *setup,
-                           lp_jit_frag_func jit_function0,
-                           lp_jit_frag_func jit_function1,
-                           boolean opaque );
+lp_setup_set_fs_variant( struct lp_setup_context *setup,
+                         struct lp_fragment_shader_variant *variant );
 
 void
 lp_setup_set_fs_constants(struct lp_setup_context *setup,
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
index 34d7125..0fc4dd6 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
@@ -34,6 +34,7 @@
 #include "lp_perf.h"
 #include "lp_setup_context.h"
 #include "lp_rast.h"
+#include "lp_state_fs.h"
 
 #define NUM_CHANNELS 4
 
@@ -579,7 +580,7 @@ do_triangle_ccw(struct lp_setup_context *setup,
                /* triangle covers the whole tile- shade whole tile */
                LP_COUNT(nr_fully_covered_64);
 	       in = TRUE;
-	       if(setup->fs.current.opaque) {
+	       if (setup->fs.current.variant->opaque) {
 	          lp_scene_bin_reset( scene, x, y );
 	          lp_scene_bin_command( scene, x, y,
 	                                lp_rast_set_state,
diff --git a/src/gallium/drivers/llvmpipe/lp_state.h b/src/gallium/drivers/llvmpipe/lp_state.h
index bae5de0..c268f96 100644
--- a/src/gallium/drivers/llvmpipe/lp_state.h
+++ b/src/gallium/drivers/llvmpipe/lp_state.h
@@ -32,10 +32,9 @@
 #define LP_STATE_H
 
 #include "pipe/p_state.h"
-#include "tgsi/tgsi_scan.h"
 #include "lp_jit.h"
+#include "lp_state_fs.h"
 #include "gallivm/lp_bld.h"
-#include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */
 
 
 #define LP_NEW_VIEWPORT      0x1
@@ -60,57 +59,6 @@ struct vertex_info;
 struct pipe_context;
 struct llvmpipe_context;
 
-struct lp_fragment_shader;
-
-
-/** Indexes into jit_function[] array */
-#define RAST_WHOLE 0
-#define RAST_EDGE_TEST 1
-
-
-struct lp_fragment_shader_variant_key
-{
-   struct pipe_depth_state depth;
-   struct pipe_stencil_state stencil[2];
-   struct pipe_alpha_state alpha;
-   struct pipe_blend_state blend;
-   enum pipe_format zsbuf_format;
-   unsigned nr_cbufs:8;
-   unsigned flatshade:1;
-   unsigned scissor:1;
-   unsigned occlusion_count:1;
-
-   struct {
-      ubyte colormask;
-   } cbuf_blend[PIPE_MAX_COLOR_BUFS];
-   
-   struct lp_sampler_static_state sampler[PIPE_MAX_SAMPLERS];
-};
-
-
-struct lp_fragment_shader_variant
-{
-   struct lp_fragment_shader_variant_key key;
-
-   boolean opaque;
-
-   LLVMValueRef function[2];
-
-   lp_jit_frag_func jit_function[2];
-
-   struct lp_fragment_shader_variant *next;
-};
-
-
-/** Subclass of pipe_shader_state */
-struct lp_fragment_shader
-{
-   struct pipe_shader_state base;
-
-   struct tgsi_shader_info info;
-
-   struct lp_fragment_shader_variant *variants;
-};
 
 
 /** Subclass of pipe_shader_state */
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
index 9ef78e6..a7e7451 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
@@ -1260,10 +1260,7 @@ llvmpipe_update_fs(struct llvmpipe_context *lp)
       LP_COUNT_ADD(nr_llvm_compiles, 2);  /* emit vs. omit in/out test */
    }
 
-   lp_setup_set_fs_functions(lp->setup, 
-                             variant->jit_function[RAST_WHOLE],
-                             variant->jit_function[RAST_EDGE_TEST],
-                             variant->opaque);
+   lp_setup_set_fs_variant(lp->setup, variant);
 }
 
 
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.h b/src/gallium/drivers/llvmpipe/lp_state_fs.h
new file mode 100644
index 0000000..1d9279e
--- /dev/null
+++ b/src/gallium/drivers/llvmpipe/lp_state_fs.h
@@ -0,0 +1,93 @@
+/**************************************************************************
+ *
+ * Copyright 2010 VMware, Inc.
+ * 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 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
+ * THE COPYRIGHT HOLDERS, AUTHORS 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.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ **************************************************************************/
+
+
+#ifndef LP_STATE_FS_H_
+#define LP_STATE_FS_H_
+
+
+#include "pipe/p_compiler.h"
+#include "pipe/p_state.h"
+#include "tgsi/tgsi_scan.h" /* for tgsi_shader_info */
+#include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */
+
+
+struct tgsi_token;
+struct lp_fragment_shader;
+
+
+/** Indexes into jit_function[] array */
+#define RAST_WHOLE 0
+#define RAST_EDGE_TEST 1
+
+
+struct lp_fragment_shader_variant_key
+{
+   struct pipe_depth_state depth;
+   struct pipe_stencil_state stencil[2];
+   struct pipe_alpha_state alpha;
+   struct pipe_blend_state blend;
+   enum pipe_format zsbuf_format;
+   unsigned nr_cbufs:8;
+   unsigned flatshade:1;
+   unsigned scissor:1;
+   unsigned occlusion_count:1;
+
+   struct {
+      ubyte colormask;
+   } cbuf_blend[PIPE_MAX_COLOR_BUFS];
+
+   struct lp_sampler_static_state sampler[PIPE_MAX_SAMPLERS];
+};
+
+
+struct lp_fragment_shader_variant
+{
+   struct lp_fragment_shader_variant_key key;
+
+   boolean opaque;
+
+   LLVMValueRef function[2];
+
+   lp_jit_frag_func jit_function[2];
+
+   struct lp_fragment_shader_variant *next;
+};
+
+
+/** Subclass of pipe_shader_state */
+struct lp_fragment_shader
+{
+   struct pipe_shader_state base;
+
+   struct tgsi_shader_info info;
+
+   struct lp_fragment_shader_variant *variants;
+};
+
+
+#endif /* LP_STATE_FS_H_ */




More information about the mesa-commit mailing list