llvmpipe: Get jit_context/jit_function across the rasterizer.
authorJosé Fonseca <jfonseca@vmware.com>
Fri, 9 Oct 2009 14:52:18 +0000 (15:52 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 9 Oct 2009 14:53:53 +0000 (15:53 +0100)
src/gallium/drivers/llvmpipe/lp_rast.c
src/gallium/drivers/llvmpipe/lp_rast.h
src/gallium/drivers/llvmpipe/lp_rast_priv.h
src/gallium/drivers/llvmpipe/lp_setup.c
src/gallium/drivers/llvmpipe/lp_setup_context.h
src/gallium/drivers/llvmpipe/lp_setup_tri.c
src/gallium/drivers/llvmpipe/lp_state_fs.c

index 977f35c46cdc26b6da65bcacbea413c70915d4cd..cba50c80491c8d2ba3875a6a55676e3cb93e02e2 100644 (file)
@@ -188,14 +188,6 @@ void lp_rast_load_zstencil( struct lp_rasterizer *rast,
 
 /* Within a tile:
  */
-void lp_rast_set_state( struct lp_rasterizer *rast,
-                        const union lp_rast_cmd_arg arg )
-{
-   RAST_DEBUG("%s\n", __FUNCTION__);
-
-   rast->shader_state = arg.set_state;
-}
-
 
 void lp_rast_shade_tile( struct lp_rasterizer *rast,
                          const union lp_rast_cmd_arg arg )
@@ -219,7 +211,7 @@ void lp_rast_shade_quads( struct lp_rasterizer *rast,
                           unsigned x, unsigned y,
                           const unsigned *masks)
 {
-   const struct lp_rast_state *state = rast->shader_state;
+   const struct lp_rast_state *state = inputs->state;
    struct lp_rast_tile *tile = &rast->tile;
    void *color;
    void *depth;
@@ -249,17 +241,17 @@ void lp_rast_shade_quads( struct lp_rasterizer *rast,
 
    assert(lp_check_alignment(depth, 16));
    assert(lp_check_alignment(color, 16));
-   assert(lp_check_alignment(state->jc.blend_color, 16));
+   assert(lp_check_alignment(state->jit_context.blend_color, 16));
 
    /* run shader */
-   state->shader( &state->jc,
-                  x, y,
-                  inputs->a0,
-                  inputs->dadx,
-                  inputs->dady,
-                  &mask[0][0],
-                  color,
-                  depth);
+   state->jit_function( &state->jit_context,
+                        x, y,
+                        inputs->a0,
+                        inputs->dadx,
+                        inputs->dady,
+                        &mask[0][0],
+                        color,
+                        depth);
 
 }
 
index 9dfdf25cda467a91a3dca9081191106800af00e6..f371b709df315c5bedba7e685138c9be4528cc21 100644 (file)
@@ -45,12 +45,12 @@ struct pipe_screen;
 struct lp_rast_state {
    /* State for the shader:
     */
-   struct lp_jit_context jc;
+   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:
     */
-   lp_jit_frag_func shader;
+   lp_jit_frag_func jit_function;
 
 };
 
index eae8138aaf1509031306f7446581f5444b69556e..11e8e78e7982abc97042c0a9add89bca8ad6a527 100644 (file)
@@ -74,8 +74,6 @@ struct lp_rasterizer {
       unsigned clear_depth;
       char clear_stencil;
    } state;
-
-   const struct lp_rast_state *shader_state;
 };
 
 
index 03c54798dca03cf5c5521e62fbda094bac96d205..428d2d00850d22c9403cd8b17d2e315cb2cfd2fa 100644 (file)
@@ -415,7 +415,7 @@ lp_setup_set_fs( struct setup_context *setup,
    SETUP_DEBUG("%s\n", __FUNCTION__);
    /* FIXME: reference count */
 
-   setup->fs.jit_function = fs->current->jit_function;
+   setup->fs.current.jit_function = fs ? fs->current->jit_function : NULL;
 }
 
 void
@@ -431,9 +431,9 @@ lp_setup_set_fs_constants(struct setup_context *setup,
    dummy = NULL;
    pipe_buffer_reference(&dummy, buffer);
 
-   setup->fs.jit_context.constants = data;
+   setup->fs.current.jit_context.constants = data;
 
-   setup->fs.jit_context_dirty = TRUE;
+   setup->fs.dirty = TRUE;
 }
 
 
@@ -443,9 +443,9 @@ lp_setup_set_alpha_ref_value( struct setup_context *setup,
 {
    SETUP_DEBUG("%s\n", __FUNCTION__);
 
-   if(setup->fs.jit_context.alpha_ref_value != alpha_ref_value) {
-      setup->fs.jit_context.alpha_ref_value = alpha_ref_value;
-      setup->fs.jit_context_dirty = TRUE;
+   if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) {
+      setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value;
+      setup->fs.dirty = TRUE;
    }
 }
 
@@ -457,16 +457,16 @@ lp_setup_set_blend_color( struct setup_context *setup,
 
    SETUP_DEBUG("%s\n", __FUNCTION__);
 
-   if(!setup->fs.jit_context.blend_color)
-      setup->fs.jit_context.blend_color = align_malloc(4 * 16, 16);
+   if(!setup->fs.current.jit_context.blend_color)
+      setup->fs.current.jit_context.blend_color = align_malloc(4 * 16, 16);
 
    for (i = 0; i < 4; ++i) {
       uint8_t c = float_to_ubyte(blend_color->color[i]);
       for (j = 0; j < 16; ++j)
-         setup->fs.jit_context.blend_color[i*4 + j] = c;
+         setup->fs.current.jit_context.blend_color[i*4 + j] = c;
    }
 
-   setup->fs.jit_context_dirty = TRUE;
+   setup->fs.dirty = TRUE;
 }
 
 void
@@ -490,7 +490,8 @@ lp_setup_set_sampler_textures( struct setup_context *setup,
 
       if(tex) {
          struct llvmpipe_texture *lp_tex = llvmpipe_texture(tex);
-         struct lp_jit_texture *jit_tex = &setup->fs.jit_context.textures[i];
+         struct lp_jit_texture *jit_tex;
+         jit_tex = &setup->fs.current.jit_context.textures[i];
          jit_tex->width = tex->width[0];
          jit_tex->height = tex->height[0];
          jit_tex->stride = lp_tex->stride[0];
@@ -502,7 +503,7 @@ lp_setup_set_sampler_textures( struct setup_context *setup,
       }
    }
 
-   setup->fs.jit_context_dirty = TRUE;
+   setup->fs.dirty = TRUE;
 }
 
 boolean
@@ -519,22 +520,28 @@ lp_setup_update_shader_state( struct setup_context *setup )
 {
    SETUP_DEBUG("%s\n", __FUNCTION__);
 
-   if(setup->fs.jit_context_dirty) {
-      if(!setup->fs.last_jc ||
-         memcmp(setup->fs.last_jc, &setup->fs.jit_context, sizeof *setup->fs.last_jc)) {
-         struct lp_jit_context *jc;
-
-         jc = get_data(&setup->data, sizeof *jc);
-         if(jc) {
-            memcpy(jc, &setup->fs.jit_context, sizeof *jc);
-            setup->fs.last_jc = jc;
+   assert(setup->fs.current.jit_function);
+
+   if(setup->fs.dirty) {
+      if(!setup->fs.stored ||
+         memcmp(setup->fs.stored,
+                &setup->fs.current,
+                sizeof setup->fs.current) != 0) {
+         struct lp_rast_state *stored;
+
+         stored = get_data(&setup->data, sizeof *stored);
+         if(stored) {
+            memcpy(stored,
+                   &setup->fs.current,
+                   sizeof setup->fs.current);
+            setup->fs.stored = stored;
          }
       }
 
-      setup->fs.jit_context_dirty = FALSE;
+      setup->fs.dirty = FALSE;
    }
 
-   assert(setup->fs.last_jc);
+   assert(setup->fs.stored);
 }
 
 
index 747e90fe202b52963d89477a97a6a24acb9f66da..c15a59e4d1ef84bbfe2fd3edce71da8a9c270c1d 100644 (file)
@@ -110,12 +110,9 @@ struct setup_context {
       struct lp_shader_input input[PIPE_MAX_ATTRIBS];
       unsigned nr_inputs;
 
-      struct lp_jit_context jit_context;
-      lp_jit_frag_func jit_function;
-
-      boolean jit_context_dirty;
-
-      const struct lp_jit_context *last_jc;
+      const struct lp_rast_state *stored;
+      struct lp_rast_state current;
+      boolean dirty;
    } fs;
 
    void (*point)( struct setup_context *,
index 857fb6a9f880f3dfb9f784ad4e5a5c163f658f42..78e53292ece67702c95e9a8d4647e6b15dfa200a 100644 (file)
@@ -272,6 +272,8 @@ do_triangle_ccw(struct setup_context *setup,
    float c1, c2, c3;
    int minx, maxx, miny, maxy;
 
+   tri->inputs.state = setup->fs.stored;
+
    tri->dx12 = x1 - x2;
    tri->dx23 = x2 - x3;
    tri->dx31 = x3 - x1;
index a12581a4868aa7b3d99a83f90ab8d2f3f030ec06..0541d36580c8e163dacd282b21972b3a6ce06410 100644 (file)
@@ -84,6 +84,7 @@
 #include "lp_screen.h"
 #include "lp_context.h"
 #include "lp_buffer.h"
+#include "lp_setup.h"
 #include "lp_state.h"
 #include "lp_tex_sample.h"
 #include "lp_debug.h"
@@ -765,4 +766,6 @@ llvmpipe_update_fs(struct llvmpipe_context *lp)
       variant = generate_fragment(lp, shader, &key);
 
    shader->current = variant;
+
+   lp_setup_set_fs(lp->setup, shader);
 }