svga: add switch cases for PIPE_SHADER_CAP_DOUBLES
[mesa.git] / src / gallium / drivers / svga / svga_resource_texture.h
index b3a1a6d52f5530ba89d7cca32875503a2dbd897b..1ff42fabab9d86a8d55b3d85741c622e7a093f28 100644 (file)
@@ -30,6 +30,7 @@
 #include "pipe/p_compiler.h"
 #include "pipe/p_state.h"
 #include "util/u_inlines.h"
+#include "util/u_memory.h"
 #include "util/u_transfer.h"
 #include "svga_screen_cache.h"
 
@@ -77,6 +78,9 @@ struct svga_texture
    struct svga_winsys_surface *handle;
 
    unsigned size;  /**< Approximate size in bytes */
+
+   /** array indexed by cube face or 3D/array slice, one bit per mipmap level */
+   ushort *rendered_to;
 };
 
 
@@ -97,6 +101,8 @@ struct svga_transfer
    /* Temporary malloc buffer when we can't allocate a hardware buffer
     * big enough */
    void *swbuf;
+
+   boolean use_direct_map;
 };
 
 
@@ -116,6 +122,87 @@ svga_transfer(struct pipe_transfer *transfer)
 }
 
 
+/**
+ * Increment the age of a view into a texture
+ * This is used to track updates to textures when we draw into
+ * them via a surface.
+ */
+static INLINE void
+svga_age_texture_view(struct svga_texture *tex, unsigned level)
+{
+   assert(level < Elements(tex->view_age));
+   tex->view_age[level] = ++(tex->age);
+}
+
+
+/**
+ * Mark the given texture face/level as being defined.
+ */
+static INLINE void
+svga_define_texture_level(struct svga_texture *tex,
+                          unsigned face,unsigned level)
+{
+   assert(face < Elements(tex->defined));
+   assert(level < Elements(tex->defined[0]));
+   tex->defined[face][level] = TRUE;
+}
+
+
+static INLINE bool
+svga_is_texture_level_defined(const struct svga_texture *tex,
+                              unsigned face, unsigned level)
+{
+   assert(face < Elements(tex->defined));
+   assert(level < Elements(tex->defined[0]));
+   return tex->defined[face][level];
+}
+
+
+/** For debugging, check that face and level are legal */
+static inline void
+check_face_level(const struct svga_texture *tex,
+                 unsigned face, unsigned level)
+{
+   if (tex->b.b.target == PIPE_TEXTURE_CUBE) {
+      assert(face < 6);
+   }
+   else if (tex->b.b.target == PIPE_TEXTURE_3D) {
+      assert(face < tex->b.b.depth0);
+   }
+   else {
+      assert(face < tex->b.b.array_size);
+   }
+
+   assert(level < 8 * sizeof(tex->rendered_to[0]));
+}
+
+
+static INLINE void
+svga_set_texture_rendered_to(struct svga_texture *tex,
+                             unsigned face, unsigned level)
+{
+   check_face_level(tex, face, level);
+   tex->rendered_to[face] |= 1 << level;
+}
+
+
+static INLINE void
+svga_clear_texture_rendered_to(struct svga_texture *tex,
+                               unsigned face, unsigned level)
+{
+   check_face_level(tex, face, level);
+   tex->rendered_to[face] &= ~(1 << level);
+}
+
+
+static INLINE boolean
+svga_was_texture_rendered_to(const struct svga_texture *tex,
+                             unsigned face, unsigned level)
+{
+   check_face_level(tex, face, level);
+   return !!(tex->rendered_to[face] & (1 << level));
+}
+
 
 struct pipe_resource *
 svga_texture_create(struct pipe_screen *screen,