egl: Add a simple cache for driver probe.
authorChia-I Wu <olvaffe@gmail.com>
Wed, 20 Jan 2010 06:35:50 +0000 (14:35 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 20 Jan 2010 09:44:12 +0000 (17:44 +0800)
In current design, multiple drivers will probe the same display and the
best driver is determined.  The cache can be used by the drivers to
store and share the probed data.

src/egl/main/egldriver.c
src/egl/main/egldriver.h

index ef1c366b302c631a01d6932a006b0be3453f8dab..0574f83f45037e4867ca020946065e90df2078a8 100644 (file)
@@ -113,6 +113,13 @@ library_suffix(void)
 #endif
 
 
+#define NUM_PROBE_CACHE_SLOTS 8
+static struct {
+   EGLint keys[NUM_PROBE_CACHE_SLOTS];
+   const void *values[NUM_PROBE_CACHE_SLOTS];
+} _eglProbeCache;
+
+
 /**
  * Open the named driver and find its bootstrap function: _eglMain().
  */
@@ -569,3 +576,44 @@ _eglFindAPIs(void)
 
    return mask;
 }
+
+
+/**
+ * Set the probe cache at the given key.
+ *
+ * A key, instead of a _EGLDriver, is used to allow the probe cache to be share
+ * by multiple drivers.
+ */
+void
+_eglSetProbeCache(EGLint key, const void *val)
+{
+   EGLint idx;
+
+   for (idx = 0; idx < NUM_PROBE_CACHE_SLOTS; idx++) {
+      if (!_eglProbeCache.keys[idx] || _eglProbeCache.keys[idx] == key)
+         break;
+   }
+   assert(key > 0);
+   assert(idx < NUM_PROBE_CACHE_SLOTS);
+
+   _eglProbeCache.keys[idx] = key;
+   _eglProbeCache.values[idx] = val;
+}
+
+
+/**
+ * Return the probe cache at the given key.
+ */
+const void *
+_eglGetProbeCache(EGLint key)
+{
+   EGLint idx;
+
+   for (idx = 0; idx < NUM_PROBE_CACHE_SLOTS; idx++) {
+      if (!_eglProbeCache.keys[idx] || _eglProbeCache.keys[idx] == key)
+         break;
+   }
+
+   return (idx < NUM_PROBE_CACHE_SLOTS && _eglProbeCache.keys[idx] == key) ?
+      _eglProbeCache.values[idx] : NULL;
+}
index 808b1c3fb708505770565a68729771459e27bd2b..d9d61297c1822b22f10db801018bee8ed8cdbd49 100644 (file)
@@ -66,4 +66,12 @@ PUBLIC EGLint
 _eglFindAPIs(void);
 
 
+PUBLIC void
+_eglSetProbeCache(EGLint key, const void *val);
+
+
+PUBLIC const void *
+_eglGetProbeCache(EGLint key);
+
+
 #endif /* EGLDRIVER_INCLUDED */