r300-gallium, radeon-winsys: Reorganize r300_winsys header, break ABI.
[mesa.git] / src / gallium / winsys / drm / radeon / core / radeon_r300.c
index e9b96b1ee93d856be476fc1af9e855e181300f4b..929e4842ccfafe75c24e79645359b024ff8968ab 100644 (file)
 
 #include "radeon_r300.h"
 
-static boolean radeon_r300_check_cs(struct radeon_cs* cs, int size)
+static boolean radeon_r300_check_cs(struct r300_winsys* winsys, int size)
 {
     /* XXX check size here, lazy ass! */
+    /* XXX also validate buffers */
     return TRUE;
 }
 
-static void radeon_r300_write_cs_reloc(struct radeon_cs* cs,
-                                    struct pipe_buffer* pbuffer,
-                                    uint32_t rd,
-                                    uint32_t wd,
-                                    uint32_t flags)
+static void radeon_r300_begin_cs(struct r300_winsys* winsys,
+                                 int size,
+                                 const char* file,
+                                 const char* function,
+                                 int line)
 {
-    radeon_cs_write_reloc(cs, ((struct radeon_pipe_buffer*)pbuffer)->bo, rd, wd, flags);
+    radeon_cs_begin(winsys->cs, size, file, function, line);
 }
 
-static void radeon_r300_flush_cs(struct radeon_cs* cs)
+static void radeon_r300_write_cs_dword(struct r300_winsys* winsys,
+                                       uint32_t dword)
 {
-    radeon_cs_emit(cs);
-    radeon_cs_erase(cs);
+    radeon_cs_write_dword(winsys->cs, dword);
+}
+
+static void radeon_r300_write_cs_reloc(struct r300_winsys* winsys,
+                                       struct pipe_buffer* pbuffer,
+                                       uint32_t rd,
+                                       uint32_t wd,
+                                       uint32_t flags)
+{
+    radeon_cs_write_reloc(winsys->cs,
+            ((struct radeon_pipe_buffer*)pbuffer)->bo, rd, wd, flags);
+}
+
+static void radeon_r300_end_cs(struct r300_winsys* winsys,
+                               const char* file,
+                               const char* function,
+                               int line)
+{
+    radeon_cs_end(winsys->cs, file, function, line);
+}
+
+static void radeon_r300_flush_cs(struct r300_winsys* winsys)
+{
+    int retval = 0;
+
+    retval = radeon_cs_emit(winsys->cs);
+    if (retval) {
+        debug_printf("radeon: Bad CS, dumping...\n");
+        radeon_cs_print(winsys->cs, stderr);
+    }
+    radeon_cs_erase(winsys->cs);
 }
 
 /* Helper function to do the ioctls needed for setup and init. */
 static void do_ioctls(struct r300_winsys* winsys, int fd)
 {
     drm_radeon_getparam_t gp;
-    uint32_t target;
+    int target;
     int retval;
 
-    /* XXX is this cast safe? */
-    gp.value = (int*)⌖
+    gp.value = ⌖
 
-    /* First, get PCI ID */
-    gp.param = RADEON_PARAM_DEVICE_ID;
+    /* First, get the number of pixel pipes */
+    gp.param = RADEON_PARAM_NUM_GB_PIPES;
     retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp));
     if (retval) {
-        fprintf(stderr, "%s: Failed to get PCI ID, error number %d",
+        fprintf(stderr, "%s: Failed to get GB pipe count, error number %d\n",
                 __FUNCTION__, retval);
         exit(1);
     }
-    winsys->pci_id = target;
+    winsys->gb_pipes = target;
 
-    /* Then, get the number of pixel pipes */
-    gp.param = RADEON_PARAM_NUM_GB_PIPES;
+    /* Then, get PCI ID */
+    gp.param = RADEON_PARAM_DEVICE_ID;
     retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp));
     if (retval) {
-        fprintf(stderr, "%s: Failed to get GB pipe count, error number %d",
+        fprintf(stderr, "%s: Failed to get PCI ID, error number %d\n",
                 __FUNCTION__, retval);
         exit(1);
     }
-    winsys->gb_pipes = target;
-
+    winsys->pci_id = target;
 }
 
-struct r300_winsys* radeon_create_r300_winsys(int fd, struct pipe_winsys* old_winsys)
+struct r300_winsys*
+radeon_create_r300_winsys(int fd, struct radeon_winsys* old_winsys)
 {
     struct r300_winsys* winsys = CALLOC_STRUCT(r300_winsys);
+    struct radeon_cs_manager* csm;
+
+    if (winsys == NULL) {
+        return NULL;
+    }
 
     do_ioctls(winsys, fd);
 
-    struct radeon_bo_manager* bom = radeon_bo_manager_gem_ctor(fd);
-    struct radeon_cs_manager* csm = radeon_cs_manager_gem_ctor(fd);
+    csm = radeon_cs_manager_gem_ctor(fd);
 
-    winsys->radeon_winsys = bom;
     winsys->cs = radeon_cs_create(csm, 1024 * 64 / 4);
 
     winsys->check_cs = radeon_r300_check_cs;
-    winsys->begin_cs = radeon_cs_begin;
-    winsys->write_cs_dword = radeon_cs_write_dword;
+    winsys->begin_cs = radeon_r300_begin_cs;
+    winsys->write_cs_dword = radeon_r300_write_cs_dword;
     winsys->write_cs_reloc = radeon_r300_write_cs_reloc;
-    winsys->end_cs = radeon_cs_end;
+    winsys->end_cs = radeon_r300_end_cs;
     winsys->flush_cs = radeon_r300_flush_cs;
 
-    winsys->base = *old_winsys;
+    memcpy(winsys, old_winsys, sizeof(struct radeon_winsys));
 
     return winsys;
 }