On Mon, 2016-09-26 at 08:42 -0700, Eric Anholt wrote:
> Timothy Arceri <timothy.arc...@collabora.com> writes:
> 
> > 
> > On Sun, 2016-09-25 at 13:26 -0700, Eric Anholt wrote:
> > > 
> > > Timothy Arceri <timothy.arc...@collabora.com> writes:
> > > > 
> > > > +static void
> > > > +test_put_key_and_get_key(void)
> > > > +{
> > > > +   struct program_cache *cache;
> > > > +   bool result;
> > > > +
> > > > +   uint8_t key_a[20] =
> > > > {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
> > > > +                        10, 11, 12, 13, 14, 15, 16, 17, 18,
> > > > 19};
> > > > +   uint8_t key_b[20] = { 20, 21, 22, 23, 24, 25, 26, 27, 28,
> > > > 29,
> > > > +                        30, 33, 32, 33, 34, 35, 36, 37, 38,
> > > > 39};
> > > > +   uint8_t key_a_collide[20] =
> > > > +                        { 0,  1, 42, 43, 44, 45, 46, 47, 48,
> > > > 49,
> > > > +                        50, 55, 52, 53, 54, 55, 56, 57, 58,
> > > > 59};
> > > > +
> > > > +   cache = cache_create();
> > > > +
> > > > +   /* First test that cache_has_key returns false before
> > > > cache_put_key */
> > > > +   result = cache_has_key(cache, key_a);
> > > > +   expect_equal(result, 0, "cache_has_key before key added");
> > > > +
> > > > +   /* Then a couple of tests of cache_put_key followed by
> > > > cache_has_key */
> > > > +   cache_put_key(cache, key_a);
> > > > +   result = cache_has_key(cache, key_a);
> > > > +   expect_equal(result, 1, "cache_has_key after key added");
> > > > +
> > > > +   cache_put_key(cache, key_b);
> > > > +   result = cache_has_key(cache, key_b);
> > > > +   expect_equal(result, 1, "2nd cache_has_key after key
> > > > added");
> > > > +
> > > > +   /* Test that a key with the same two bytes as an existing
> > > > key
> > > > +    * forces an eviction.
> > > > +    */
> > > > +   cache_put_key(cache, key_a_collide);
> > > > +   result = cache_has_key(cache, key_a_collide);
> > > > +   expect_equal(result, 1, "put_key of a colliding key lands
> > > > in
> > > > the cache");
> > > > +
> > > > +   result = cache_has_key(cache, key_a);
> > > > +   expect_equal(result, 0, "put_key of a colliding key evicts
> > > > from
> > > > the cache");
> > > > +
> > > > +   /* And finally test that we can re-add the original key to
> > > > re-
> > > > evict
> > > > +    * the colliding key.
> > > > +    */
> > > > +   cache_put_key(cache, key_a);
> > > > +   result = cache_has_key(cache, key_a);
> > > > +   expect_equal(result, 1, "put_key of original key lands
> > > > again");
> > > > +
> > > > +   result = cache_has_key(cache, key_a_collide);
> > > > +   expect_equal(result, 0, "put_key of oiginal key evicts the
> > > > colliding key");
> > > 
> > > "original"
> > > 
> > > I haven't yet figured out what the purpose of
> > > cache_put_key()/cache_has_key() are.  I suppose I'll find out
> > > later
> > > in
> > > the series.
> > 
> > Since we cache a program rather than individual shaders we set a
> > cache
> > key for each shader and opportunistically skip compiling it next
> > time
> > we see the shader.
> > 
> > If we happen to be using the shader to create a program we haven't
> > seen
> > before we end up having to fall back to compiling the shader
> > later. 
> 
> That works out better than just always skipping shader compile until
> link time and you find that you need it?

Good question. I haven't really done any profiling, this is the way
Carl and Kristian come up with doing it before I came along. For the
initial implementation I've been focusing on correctness rather than
speed. I'd really like to leave performance tweaks until after we land
something thats working.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to