exa: add basic code to cache vertex and fragment shaders
authorZack Rusin <zackr@vmware.com>
Tue, 25 Aug 2009 18:01:58 +0000 (14:01 -0400)
committerZack Rusin <zackr@vmware.com>
Tue, 25 Aug 2009 18:01:58 +0000 (14:01 -0400)
src/gallium/state_trackers/xorg/xorg_exa_tgsi.c
src/gallium/state_trackers/xorg/xorg_exa_tgsi.h

index 9896d067b2400ae994e48c5170eb4af456c80fa9..231077a7530a3644b247d30d24d15e79e08fb788 100644 (file)
 #include "tgsi/tgsi_ureg.h"
 
 #include "cso_cache/cso_context.h"
+#include "cso_cache/cso_hash.h"
 
-#define UNSUPPORTED_OP 0
+struct xorg_shaders {
+   struct exa_context *exa;
 
-struct shader_id {
-   int op : 8;
-   int mask : 1;
-   int component_alpha : 1;
-   int is_fill : 1;
+   struct cso_hash *vs_hash;
+   struct cso_hash *fs_hash;
 };
 
 /* SAMP[0]  = dst
@@ -57,40 +56,19 @@ src_in_mask(struct ureg_program *ureg,
             ureg_scalar(mask, TGSI_SWIZZLE_W));
 }
 
-static INLINE
-struct shader_id shader_state(int op,
-                              PicturePtr src_picture,
-                              PicturePtr mask_picture,
-                              PicturePtr dst_picture)
-{
-   struct shader_id sid;
-
-   sid.op = op;
-   sid.mask = (mask_picture != 0);
-   sid.component_alpha = (mask_picture->componentAlpha);
-   sid.is_fill = (src_picture->pSourcePict != 0);
-   if (sid.is_fill) {
-      sid.is_fill =
-         (src_picture->pSourcePict->type == SourcePictTypeSolidFill);
-   }
-
-   return sid;
-}
-
-struct xorg_shader xorg_shader_construct(struct exa_context *exa,
-                                         int op,
-                                         PicturePtr src_picture,
-                                         PicturePtr mask_picture,
-                                         PicturePtr dst_picture)
+static struct xorg_shader
+xorg_shader_construct(struct exa_context *exa,
+                      int op,
+                      PicturePtr src_picture,
+                      PicturePtr mask_picture,
+                      PicturePtr dst_picture)
 {
+   struct xorg_shader shader = {0};
+#if 0
    struct ureg_program *ureg;
    struct ureg_src dst_sampler, src_sampler, mask_sampler;
    struct ureg_src dst_pos, src_pos, mask_pos;
    struct ureg_src src, mask;
-   struct shader_id sid = shader_state(op, src_picture,
-                                       mask_picture,
-                                       dst_picture);
-   struct xorg_shader shader = {0};
 
    ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
    if (ureg == NULL)
@@ -133,5 +111,54 @@ struct xorg_shader xorg_shader_construct(struct exa_context *exa,
 
    ureg_END(ureg);
 
+#endif
+   return shader;
+}
+
+struct xorg_shaders * xorg_shaders_create(struct exa_context *exa)
+{
+   struct xorg_shaders *sc = CALLOC_STRUCT(xorg_shaders);
+
+   sc->exa = exa;
+   sc->vs_hash = cso_hash_create();
+   sc->fs_hash = cso_hash_create();
+
+   return sc;
+}
+
+static void
+cache_destroy(struct cso_context *cso,
+              struct cso_hash *hash,
+              unsigned processor)
+{
+   struct cso_hash_iter iter = cso_hash_first_node(hash);
+   while (!cso_hash_iter_is_null(iter)) {
+      void *shader = (void *)cso_hash_iter_data(iter);
+      if (processor == PIPE_SHADER_FRAGMENT) {
+         cso_delete_fragment_shader(cso, shader);
+      } else if (processor == PIPE_SHADER_VERTEX) {
+         cso_delete_vertex_shader(cso, shader);
+      }
+      iter = cso_hash_erase(hash, iter);
+   }
+   cso_hash_delete(hash);
+}
+
+void xorg_shaders_destroy(struct xorg_shaders *sc)
+{
+   cache_destroy(sc->exa->cso, sc->vs_hash,
+                 PIPE_SHADER_VERTEX);
+   cache_destroy(sc->exa->cso, sc->fs_hash,
+                 PIPE_SHADER_FRAGMENT);
+
+   free(sc);
+}
+
+struct xorg_shader xorg_shaders_get(struct xorg_shaders *sc,
+                                    unsigned vs_traits,
+                                    unsigned fs_traits)
+{
+   struct xorg_shader shader = {0};
+
    return shader;
 }
index b7245c8e89e8b88d216e032bb8245d26ba829db5..f87f035267254f2781fb6affcc10ccd97405011d 100644 (file)
@@ -3,15 +3,32 @@
 
 #include "xorg_exa.h"
 
+enum xorg_vs_traits {
+   VS_COMPOSITE        = 1 << 0,
+   VS_FILL             = 1 << 1
+   /*VS_TRANSFORM      = 1 << 2*/
+};
+
+enum xorg_fs_traits {
+   FS_COMPOSITE        = 1 << 0,
+   FS_MASK             = 1 << 1,
+   FS_FILL             = 1 << 2,
+   FS_LINEAR_GRADIENT  = 1 << 3,
+   FS_RADIAL_GRADIENT  = 1 << 4
+};
+
 struct xorg_shader {
    void *fs;
    void *vs;
 };
 
-struct xorg_shader xorg_shader_construct(struct exa_context *exa,
-                                         int op,
-                                         PicturePtr src_picture,
-                                         PicturePtr mask_picture,
-                                         PicturePtr dst_picture);
+struct xorg_shaders;
+
+struct xorg_shaders *xorg_shaders_create(struct exa_context *exa);
+void xorg_shaders_destroy(struct xorg_shaders *shaders);
+
+struct xorg_shader xorg_shaders_get(struct xorg_shaders *shaders,
+                                    unsigned vs_traits,
+                                    unsigned fs_traits);
 
 #endif