Merge branch '7.8'
[mesa.git] / src / gallium / drivers / r300 / r300_winsys.h
index f18ad75a47d8c6ef6ad1f60a08216407b29229d4..e5183a8239c9d74d9d585177abe74df344845645 100644 (file)
 #ifndef R300_WINSYS_H
 #define R300_WINSYS_H
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* The public interface header for the r300 pipe driver.
  * Any winsys hosting this pipe needs to implement r300_winsys and then
- * call r300_create_context to start things. */
+ * call r300_create_screen to start things. */
 
 #include "pipe/p_defines.h"
 #include "pipe/p_state.h"
-#include "pipe/internal/p_winsys_screen.h"
 
-struct r300_winsys {
-    /* Parent class */
-    struct pipe_winsys base;
+struct r300_winsys_screen;
+
+/* Creates a new r300 screen. */
+struct pipe_screen* r300_create_screen(struct r300_winsys_screen *rws);
 
-    /* Opaque Radeon-specific winsys object. */
-    void* radeon_winsys;
+struct r300_winsys_buffer;
 
-    /* PCI ID */
-    uint32_t pci_id;
 
-    /* GB pipe count */
-    uint32_t gb_pipes;
+boolean r300_get_texture_buffer(struct pipe_screen* screen,
+                                struct pipe_texture* texture,
+                                struct r300_winsys_buffer** buffer,
+                                unsigned *stride);
 
-    /* GART size. */
-    uint32_t gart_size;
+enum r300_value_id {
+    R300_VID_PCI_ID,
+    R300_VID_GB_PIPES,
+    R300_VID_Z_PIPES,
+};
 
-    /* VRAM size. */
-    uint32_t vram_size;
+#define R300_USAGE_FLAG_DONT_SYNC (1 << 17)
+
+struct r300_winsys_screen {
+    void (*destroy)(struct r300_winsys_screen *ws);
+    
+    /**
+     * Buffer management. Buffer attributes are mostly fixed over its lifetime.
+     *
+     * Remember that gallium gets to choose the interface it needs, and the
+     * window systems must then implement that interface (rather than the
+     * other way around...).
+     *
+     * usage is a bitmask of R300_WINSYS_BUFFER_USAGE_PIXEL/VERTEX/INDEX/CONSTANT. This
+     * usage argument is only an optimization hint, not a guarantee, therefore
+     * proper behavior must be observed in all circumstances.
+     *
+     * alignment indicates the client's alignment requirements, eg for
+     * SSE instructions.
+     */
+    struct r300_winsys_buffer *(*buffer_create)(struct r300_winsys_screen *ws,
+                                               unsigned alignment,
+                                               unsigned usage,
+                                               unsigned size);
+    
+    /**
+     * Map the entire data store of a buffer object into the client's address.
+     * flags is bitmask of R300_WINSYS_BUFFER_USAGE_CPU_READ/WRITE flags.
+     */
+    void *(*buffer_map)( struct r300_winsys_screen *ws,
+                        struct r300_winsys_buffer *buf,
+                        unsigned usage);
+
+    void (*buffer_unmap)( struct r300_winsys_screen *ws,
+                         struct r300_winsys_buffer *buf );
+
+    void (*buffer_destroy)( struct r300_winsys_buffer *buf );
+
+
+    void (*buffer_reference)(struct r300_winsys_screen *rws,
+                            struct r300_winsys_buffer **pdst,
+                            struct r300_winsys_buffer *src);
+
+    boolean (*buffer_references)(struct r300_winsys_buffer *a,
+                                struct r300_winsys_buffer *b);
+
+    void (*buffer_flush_range)(struct r300_winsys_screen *rws,
+                              struct r300_winsys_buffer *buf,
+                              unsigned offset,
+                              unsigned length);
 
     /* Add a pipe_buffer to the list of buffer objects to validate. */
-    boolean (*add_buffer)(struct r300_winsyswinsys,
-                          struct pipe_buffer* pbuffer,
+    boolean (*add_buffer)(struct r300_winsys_screen *winsys,
+                          struct r300_winsys_buffer *buf,
                           uint32_t rd,
                           uint32_t wd);
 
+
     /* Revalidate all currently setup pipe_buffers.
      * Returns TRUE if a flush is required. */
-    boolean (*validate)(struct r300_winsys* winsys);
+    boolean (*validate)(struct r300_winsys_screen* winsys);
 
     /* Check to see if there's room for commands. */
-    boolean (*check_cs)(struct r300_winsys* winsys, int size);
+    boolean (*check_cs)(struct r300_winsys_screen* winsys, int size);
 
     /* Start a command emit. */
-    void (*begin_cs)(struct r300_winsys* winsys,
+    void (*begin_cs)(struct r300_winsys_screen* winsys,
                      int size,
                      const char* file,
                      const char* function,
                      int line);
 
     /* Write a dword to the command buffer. */
-    void (*write_cs_dword)(struct r300_winsys* winsys, uint32_t dword);
+    void (*write_cs_dword)(struct r300_winsys_screen* winsys, uint32_t dword);
 
     /* Write a relocated dword to the command buffer. */
-    void (*write_cs_reloc)(struct r300_winsyswinsys,
-                           struct pipe_buffer* bo,
+    void (*write_cs_reloc)(struct r300_winsys_screen *winsys,
+                           struct r300_winsys_buffer *buf,
                            uint32_t rd,
                            uint32_t wd,
                            uint32_t flags);
 
     /* Finish a command emit. */
-    void (*end_cs)(struct r300_winsys* winsys,
+    void (*end_cs)(struct r300_winsys_screen* winsys,
                    const char* file,
                    const char* function,
                    int line);
 
     /* Flush the CS. */
-    void (*flush_cs)(struct r300_winsys* winsys);
-};
+    void (*flush_cs)(struct r300_winsys_screen* winsys);
+
+    /* winsys flush - callback from winsys when flush required */
+    void (*set_flush_cb)(struct r300_winsys_screen *winsys,
+                        void (*flush_cb)(void *), void *data);
 
-struct pipe_context* r300_create_context(struct pipe_screen* screen,
-                                         struct r300_winsys* r300_winsys);
+    void (*reset_bos)(struct r300_winsys_screen *winsys);
 
-boolean r300_get_texture_buffer(struct pipe_texture* texture,
-                                struct pipe_buffer** buffer,
-                                unsigned* stride);
+    void (*buffer_set_tiling)(struct r300_winsys_screen *winsys,
+                              struct r300_winsys_buffer *buffer,
+                              uint32_t pitch,
+                              boolean microtiled,
+                              boolean macrotiled);
+
+    uint32_t (*get_value)(struct r300_winsys_screen *winsys,
+                         enum r300_value_id vid);
+
+    struct r300_winsys_buffer *(*buffer_from_handle)(struct r300_winsys_screen *winsys,
+                                                    struct pipe_screen *screen,
+                                                    struct winsys_handle *whandle,
+                                                    unsigned *stride);
+    boolean (*buffer_get_handle)(struct r300_winsys_screen *winsys,
+                                struct r300_winsys_buffer *buffer,
+                                unsigned stride,
+                                struct winsys_handle *whandle);
+
+    boolean (*is_buffer_referenced)(struct r300_winsys_screen *winsys,
+                                    struct r300_winsys_buffer *buffer);
+
+  
+};
 
-#ifdef __cplusplus
-}
-#endif
+struct r300_winsys_screen *
+r300_winsys_screen(struct pipe_screen *screen);
 
 #endif /* R300_WINSYS_H */