svga/winsys: implement GBS support
[mesa.git] / src / gallium / winsys / svga / drm / vmw_screen.h
index bdc1c7ba3de590d1760fdc46b353559390f333ba..f9da3693c581c9d5a842e3939921a80038655407 100644 (file)
 #include "pipe/p_state.h"
 
 #include "svga_winsys.h"
+#include "pipebuffer/pb_buffer_fenced.h"
 
 
 #define VMW_GMR_POOL_SIZE (16*1024*1024)
 #define VMW_QUERY_POOL_SIZE (8192)
+#define VMW_DEBUG_FLUSH_STACK 10
+
 /*
  * Something big, but arbitrary. The kernel reports an error if it can't
  * handle this, and the svga driver will resort to multiple partial
 struct pb_manager;
 struct vmw_region;
 
+struct vmw_cap_3d {
+   boolean has_cap;
+   SVGA3dDevCapResult result;
+};
 
 struct vmw_winsys_screen
 {
@@ -63,7 +70,10 @@ struct vmw_winsys_screen
    struct {
       int drm_fd;
       uint32_t hwversion;
-      uint32_t *buffer;
+      uint32_t num_cap_3d;
+      struct vmw_cap_3d *cap_3d;
+      uint64_t max_mob_memory;
+      uint64_t max_surface_memory;
    } ioctl;
 
    struct {
@@ -72,10 +82,21 @@ struct vmw_winsys_screen
       struct pb_manager *gmr_fenced;
       struct pb_manager *gmr_slab;
       struct pb_manager *gmr_slab_fenced;
-      struct pb_manager *query;
       struct pb_manager *query_mm;
       struct pb_manager *query_fenced;
+      struct pb_manager *mob_fenced;
+      struct pb_manager *mob_cache;
+      struct pb_manager *mob_shader_slab;
+      struct pb_manager *mob_shader_slab_fenced;
    } pools;
+
+   struct pb_fence_ops *fence_ops;
+
+   /*
+    * Screen instances
+    */
+   dev_t device;
+   int open_count;
 };
 
 
@@ -86,6 +107,9 @@ vmw_winsys_screen(struct svga_winsys_screen *base)
 }
 
 /*  */
+uint32_t
+vmw_region_size(struct vmw_region *region);
+
 uint32
 vmw_ioctl_context_create(struct vmw_winsys_screen *vws);
 
@@ -100,6 +124,23 @@ vmw_ioctl_surface_create(struct vmw_winsys_screen *vws,
                               SVGA3dSize size,
                               uint32 numFaces,
                               uint32 numMipLevels);
+uint32
+vmw_ioctl_gb_surface_create(struct vmw_winsys_screen *vws,
+                           SVGA3dSurfaceFlags flags,
+                           SVGA3dSurfaceFormat format,
+                           SVGA3dSize size,
+                           uint32 numFaces,
+                           uint32 numMipLevels,
+                            uint32 buffer_handle,
+                           struct vmw_region **p_region);
+
+int
+vmw_ioctl_gb_surface_ref(struct vmw_winsys_screen *vws,
+                         uint32_t handle,
+                         SVGA3dSurfaceFlags *flags,
+                         SVGA3dSurfaceFormat *format,
+                         uint32_t *numMipLevels,
+                         struct vmw_region **p_region);
 
 void
 vmw_ioctl_surface_destroy(struct vmw_winsys_screen *vws,
@@ -140,12 +181,28 @@ void
 vmw_ioctl_fence_unref(struct vmw_winsys_screen *vws,
                      uint32_t handle);
 
+uint32
+vmw_ioctl_shader_create(struct vmw_winsys_screen *vws,
+                       SVGA3dShaderType type,
+                       uint32 code_len);
+void
+vmw_ioctl_shader_destroy(struct vmw_winsys_screen *vws, uint32 shid);
 
+int
+vmw_ioctl_syncforcpu(struct vmw_region *region,
+                     boolean dont_block,
+                     boolean readonly,
+                     boolean allow_cs);
+void
+vmw_ioctl_releasefromcpu(struct vmw_region *region,
+                         boolean readonly,
+                         boolean allow_cs);
 /* Initialize parts of vmw_winsys_screen at startup:
  */
 boolean vmw_ioctl_init(struct vmw_winsys_screen *vws);
 boolean vmw_pools_init(struct vmw_winsys_screen *vws);
 boolean vmw_query_pools_init(struct vmw_winsys_screen *vws);
+boolean vmw_mob_pools_init(struct vmw_winsys_screen *vws);
 boolean vmw_winsys_screen_init_svga(struct vmw_winsys_screen *vws);
 
 void vmw_ioctl_cleanup(struct vmw_winsys_screen *vws);
@@ -156,4 +213,13 @@ void vmw_winsys_destroy(struct vmw_winsys_screen *sws);
 void vmw_winsys_screen_set_throttling(struct pipe_screen *screen,
                                      uint32_t throttle_us);
 
+struct pb_manager *
+simple_fenced_bufmgr_create(struct pb_manager *provider,
+                           struct pb_fence_ops *ops);
+void
+vmw_fences_signal(struct pb_fence_ops *fence_ops,
+                  uint32_t signaled,
+                  uint32_t emitted,
+                  boolean has_emitted);
+
 #endif /* VMW_SCREEN_H_ */