nouveau: replace vtxbuf/idxbuf caps with BO_ flags in nouveau_screen and fix uncached...
[mesa.git] / src / gallium / drivers / nouveau / nouveau_screen.h
index f4a7a2bc234cce2715eb29f14a2034330a317ef0..747fd15acdd0d23918cb2f6ea86a04538b490691 100644 (file)
@@ -6,20 +6,10 @@ struct nouveau_screen {
        struct nouveau_device *device;
        struct nouveau_channel *channel;
 
-        /**
-         * Create a new texture object, using the given template info, but on top of
-         * existing memory.
-         * 
-         * It is assumed that the buffer data is layed out according to the expected
-         * by the hardware. NULL will be returned if any inconsistency is found.  
-         */
-        struct pipe_texture * (*texture_blanket)(struct pipe_screen *,
-                                                 const struct pipe_texture *templat,
-                                                 const unsigned *stride,
-                                                 struct pipe_buffer *buffer);
-
-       int (*pre_pipebuffer_map_callback) (struct pipe_screen *pscreen,
-               struct pipe_buffer *pb, unsigned usage);
+       /* note that OpenGL doesn't distinguish between these, so
+        * these almost always should be set to the same value */
+       unsigned vertex_buffer_flags;
+       unsigned index_buffer_flags;
 };
 
 static inline struct nouveau_screen *
@@ -28,24 +18,63 @@ nouveau_screen(struct pipe_screen *pscreen)
        return (struct nouveau_screen *)pscreen;
 }
 
-static inline struct nouveau_bo *
-nouveau_bo(struct pipe_buffer *pb)
-{
-       return pb ? *(struct nouveau_bo **)(pb + 1) : NULL;
-}
+
+
+/* Not really sure if this is needed, or whether the individual
+ * drivers are happy to talk to the bo functions themselves.  In a way
+ * this is what we'd expect from a regular winsys interface.
+ */
+struct nouveau_bo *
+nouveau_screen_bo_new(struct pipe_screen *pscreen, unsigned alignment,
+                     unsigned usage, unsigned bind, unsigned size);
+struct nouveau_bo *
+nouveau_screen_bo_user(struct pipe_screen *pscreen, void *ptr, unsigned bytes);
+void *
+nouveau_screen_bo_map(struct pipe_screen *pscreen,
+                     struct nouveau_bo *pb,
+                     unsigned usage);
+void *
+nouveau_screen_bo_map_range(struct pipe_screen *pscreen, struct nouveau_bo *bo,
+                           unsigned offset, unsigned length, unsigned usage);
+void
+nouveau_screen_bo_map_flush_range(struct pipe_screen *pscreen, struct nouveau_bo *bo,
+                                 unsigned offset, unsigned length);
+void
+nouveau_screen_bo_unmap(struct pipe_screen *pscreen, struct nouveau_bo *bo);
+void
+nouveau_screen_bo_release(struct pipe_screen *pscreen, struct nouveau_bo *bo);
+
+boolean
+nouveau_screen_bo_get_handle(struct pipe_screen *pscreen,
+                            struct nouveau_bo *bo,
+                            unsigned stride,
+                            struct winsys_handle *whandle);
+struct nouveau_bo *
+nouveau_screen_bo_from_handle(struct pipe_screen *pscreen,
+                             struct winsys_handle *whandle,
+                             unsigned *out_stride);
+
+unsigned int
+nouveau_reference_flags(struct nouveau_bo *bo);
+
+
 
 int nouveau_screen_init(struct nouveau_screen *, struct nouveau_device *);
 void nouveau_screen_fini(struct nouveau_screen *);
 
-struct nouveau_miptree {
-       struct pipe_texture base;
-       struct nouveau_bo *bo;
-};
 
-static inline struct nouveau_miptree *
-nouveau_miptree(struct pipe_texture *pt)
+
+
+static __inline__ unsigned
+RING_3D(unsigned mthd, unsigned size)
+{
+       return (7 << 13) | (size << 18) | mthd;
+}
+
+static __inline__ unsigned
+RING_3D_NI(unsigned mthd, unsigned size)
 {
-       return (struct nouveau_miptree *)pt;
+       return 0x40000000 | (7 << 13) | (size << 18) | mthd;
 }
 
 #endif