r300, amd: Make everything build. (Not necessarily work, mind you.)
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Mon, 12 Jan 2009 09:40:50 +0000 (01:40 -0800)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Mon, 2 Feb 2009 07:30:22 +0000 (23:30 -0800)
Lots of structural work, especially in getting the two parts to talk nicely.

Todo:
- Get damn blitter working.
- Add CS flush.
- Reverse order of above two items.

12 files changed:
configs/default
src/gallium/drivers/r300/r300_blit.c
src/gallium/drivers/r300/r300_context.c
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_cs.h
src/gallium/drivers/r300/r300_screen.c
src/gallium/drivers/r300/r300_winsys.h [new file with mode: 0644]
src/gallium/winsys/drm/amd/Makefile
src/gallium/winsys/drm/amd/amd_context.c
src/gallium/winsys/drm/amd/amd_context.h
src/gallium/winsys/drm/amd/amd_r300.c [new file with mode: 0644]
src/gallium/winsys/drm/amd/amd_r300.h [new file with mode: 0644]

index 40f3a2a02dc6ae1783a469f353be605057195eaa..333f0fe985623d0b4a2f8f73bc0adb7be9d82725 100644 (file)
@@ -91,7 +91,7 @@ EGL_DRIVERS_DIRS = demo
 # Gallium directories and 
 GALLIUM_AUXILIARY_DIRS = draw translate cso_cache pipebuffer tgsi sct rtasm util
 GALLIUM_AUXILIARIES = $(foreach DIR,$(GALLIUM_AUXILIARY_DIRS),$(TOP)/src/gallium/auxiliary/$(DIR)/lib$(DIR).a)
-GALLIUM_DRIVER_DIRS = softpipe i915simple i965simple nv04 nv10 nv20 nv30 nv40 nv50 failover trace
+GALLIUM_DRIVER_DIRS = softpipe i915simple i965simple nv04 nv10 nv20 nv30 nv40 nv50 failover r300
 GALLIUM_DRIVERS = $(foreach DIR,$(GALLIUM_DRIVER_DIRS),$(TOP)/src/gallium/drivers/$(DIR)/lib$(DIR).a)
 GALLIUM_WINSYS_DIRS = xlib egl_xlib
 
index c404a667b105548e08544178d91b1a56de079a74..b8ddf6677f645d4360202e9296fe609c37d4213e 100644 (file)
@@ -79,7 +79,7 @@ int r300_fill_blit(struct r300_context* r300,
     OUT_CS_REG(RADEON_DP_CNTL,
                   RADEON_DST_X_LEFT_TO_RIGHT | RADEON_DST_Y_TOP_TO_BOTTOM);
     OUT_CS_REG(RADEON_DST_PITCH_OFFSET, 0x0);
-    /* XXX fix this shit -> OUT_RELOC(dst, 0, RADEON_GEM_DOMAIN_VRAM) */
+    OUT_CS_RELOC(dst_buffer, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
 
     /* Do the actual paint. */
     OUT_CS_REG(RADEON_DST_Y_X, (y << 16) | x);
index 4050faa74a2ff9a528ab7d18e64f7cfcef614d88..b9a9c2e21c2f696a14df3cfb235b03c88f322d7c 100644 (file)
@@ -32,16 +32,16 @@ static void r300_destroy_context(struct pipe_context* context) {
 
 struct pipe_context* r300_create_context(struct pipe_screen* screen,
                                          struct pipe_winsys* winsys,
-                                         struct amd_winsys* amd_winsys)
+                                         struct r300_winsys* r300_winsys)
 {
     struct r300_context* r300 = CALLOC_STRUCT(r300_context);
 
     if (!r300)
         return NULL;
 
-    r300->winsys = amd_winsys;
+    r300->winsys = r300_winsys;
     r300->context.winsys = winsys;
-    r300->context.screen = screen;
+    r300->context.screen = r300_create_screen(winsys, 0x0);
 
     r300->context.destroy = r300_destroy_context;
 
index 8393198200654478984972adad93e11f17b77339..119d46af589431160b33cb89aba637a46829ac1a 100644 (file)
@@ -31,15 +31,10 @@ struct r300_context {
     /* Parent class */
     struct pipe_context context;
 
-    struct amd_winsys* winsys;
+    /* The interface to the windowing system, etc. */
+    struct r300_winsys* winsys;
+    /* Draw module. Used mostly for SW TCL. */
     struct draw_context* draw;
-
-    /* CS object. This is very much like Intel's batchbuffer.
-     * Fill it full of dwords and relocs and then submit.
-     * Repeat as needed. */
-    /* Note: Unlike Mesa's version of this, we don't keep a copy of the CSM
-     * that was used to create this CS. Is this a good idea? */
-    struct radeon_cs* cs;
 };
 
 /* Convenience cast wrapper. */
@@ -52,6 +47,6 @@ void r300_init_surface_functions(struct r300_context* r300);
 
 struct pipe_context* r300_create_context(struct pipe_screen* screen,
                                          struct pipe_winsys* winsys,
-                                         struct amd_winsys* amd_winsys);
+                                         struct r300_winsys* r300_winsys);
 
 #endif /* R300_CONTEXT_H */
\ No newline at end of file
index ebd5324119a5e668cc01d2eb991934e6c9c98644..1422842e0ce3a85b447323282a8747d138839ad7 100644 (file)
 #ifndef R300_CS_H
 #define R300_CS_H
 
-#include "radeon_cs.h"
 #include "radeon_reg.h"
 
+#include "r300_winsys.h"
+
 /* Yes, I know macros are ugly. However, they are much prettier than the code
  * that they neatly hide away, and don't have the cost of function setup,so
  * we're going to use them. */
 
 #define MAX_CS_SIZE 64 * 1024 / 4
 
+/* XXX stolen from radeon_drm.h */
+#define RADEON_GEM_DOMAIN_CPU  0x1
+#define RADEON_GEM_DOMAIN_GTT  0x2
+#define RADEON_GEM_DOMAIN_VRAM 0x4
+
 #define CP_PACKET0(register, count) \
     (RADEON_CP_PACKET0 | ((count) << 16) | ((register) >> 2))
 
 #define CS_LOCALS(context) \
-    struct radeon_cs* cs = context->cs
+    struct r300_winsys* cs_winsys = context->winsys; \
+    struct radeon_cs* cs = cs_winsys->cs
 
 
-#define CHECK_CS(size) do { \
-    if ((cs->cdw + (size) + 128) > MAX_CS_SIZE || radeon_cs_need_flush(cs)) { \
-        /* XXX flush the CS */ \
-    } } while (0)
+#define CHECK_CS(size) \
+    cs_winsys->check_cs(cs, (size))
 
-/* XXX radeon_cs_begin is currently unimplemented on the backend, but let's
- * be future-proof, yeah? */
 #define BEGIN_CS(size) do { \
     CHECK_CS(size); \
-    radeon_cs_begin(cs, (size), __FILE__, __FUNCTION__, __LINE__); \
+    cs_winsys->begin_cs(cs, (size), __FILE__, __FUNCTION__, __LINE__); \
 } while (0)
 
 #define OUT_CS(value) \
-    radeon_cs_write_dword(cs, value)
+    cs_winsys->write_cs_dword(cs, value)
 
 #define OUT_CS_REG(register, value) do { \
     OUT_CS(CP_PACKET0(register, 0)); \
     OUT_CS(value); } while (0)
 
 #define OUT_CS_RELOC(bo, offset, rd, wd, flags) do { \
-    radeon_cs_write_dword(cs, offset); \
-    radeon_cs_write_reloc(cs, bo, rd, wd, flags); \
+    OUT_CS(offset); \
+    cs_winsys->write_cs_reloc(cs, bo, rd, wd, flags); \
 } while (0)
 
-/* XXX more future-proofing */
 #define END_CS \
-    radeon_cs_end(cs, __FILE__, __FUNCTION__, __LINE__)
+    cs_winsys->end_cs(cs, __FILE__, __FUNCTION__, __LINE__)
 
 #endif /* R300_CS_H */
\ No newline at end of file
index 37a74b3c0adef7ffb0f517639aa2a22235743655..dacde27888ca63b450ae869dc951052d64f7a7ca 100644 (file)
@@ -144,13 +144,13 @@ struct pipe_screen* r300_create_screen(struct pipe_winsys* winsys, uint pci_id)
     if (!r300screen)
         return NULL;
 
-    /* XXX break this into its own function? */
+    /* XXX break this into its own function?
     switch (pci_id) {
         default:
             debug_printf("%s: unknown PCI ID 0x%x, cannot create screen!\n",
                          __FUNCTION__, pci_id);
             return NULL;
-    }
+    } */
 
     r300screen->pci_id = pci_id;
     r300screen->screen.winsys = winsys;
diff --git a/src/gallium/drivers/r300/r300_winsys.h b/src/gallium/drivers/r300/r300_winsys.h
new file mode 100644 (file)
index 0000000..7048a9c
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#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. */
+
+#include "pipe/p_defines.h"
+#include "pipe/p_state.h"
+
+struct radeon_cs;
+
+struct r300_winsys {
+
+    /* CS object. This is very much like Intel's batchbuffer.
+     * Fill it full of dwords and relocs and then submit.
+     * Repeat as needed. */
+    /* Note: Unlike Mesa's version of this, we don't keep a copy of the CSM
+     * that was used to create this CS. Is this a good idea? */
+    /* Note: The pipe driver doesn't know how to use this. This is purely
+     * for the winsys. */
+    struct radeon_cs* cs;
+
+    /* Check to see if there's room for commands. */
+    boolean (*check_cs)(struct radeon_cs* cs, int size);
+
+    /* Start a command emit. */
+    void (*begin_cs)(struct radeon_cs* cs,
+           int size,
+           const char* file,
+           const char* function,
+           int line);
+
+    /* Write a dword to the command buffer. */
+    /* XXX is this an okay name for this handle? */
+    void (*write_cs_dword)(struct radeon_cs* cs, uint32_t dword);
+
+    /* Write a relocated dword to the command buffer. */
+    void (*write_cs_reloc)(struct radeon_cs* cs,
+           struct pipe_buffer* bo,
+           uint32_t rd,
+           uint32_t wd,
+           uint32_t flags);
+
+    /* Finish a command emit. */
+    void (*end_cs)(struct radeon_cs* cs,
+           const char* file,
+           const char* function,
+           int line);
+
+};
+
+struct pipe_context* r300_create_context(struct pipe_screen* screen,
+                                         struct pipe_winsys* winsys,
+                                         struct r300_winsys* r300_winsys);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* R300_WINSYS_H */
\ No newline at end of file
index 0f23e3446c2b0df153556256547671c3c9c81298..fb778734044dd6ba8d08578eaec703156d0c715a 100644 (file)
@@ -7,11 +7,13 @@ LIBNAME = amd_dri.so
 MINIGLX_SOURCES =
 
 PIPE_DRIVERS = \
-       $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a
+       $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+       $(TOP)/src/gallium/drivers/r300/libr300.a
 
 DRIVER_SOURCES = \
        amd_buffer.c \
        amd_context.c \
+       amd_r300.c \
        amd_screen.c \
        amd_winsys_softpipe.c
 
@@ -21,6 +23,8 @@ C_SOURCES = \
 
 ASM_SOURCES = 
 
+DRIVER_DEFINES = -I../../../drivers/r300
+
 include ../Makefile.template
 
 DRI_LIB_DEPS += -ldrm_radeon
index 632caec6a73871908d4b3bb942c161c4fe9b6a2b..7784964867f7a9168d4e5504f612546aaa9e1f52 100644 (file)
@@ -243,12 +243,10 @@ GLboolean amd_context_create(const __GLcontextModes *visual,
     }
 
     if (GL_TRUE) {
-        /* XXX second arg should be PCI ID, but damned if I know why */
-        amd_context->pipe_screen = r300_create_screen(amd_context->pipe_winsys,
-                                                      0x0);
-        pipe = r300_create_context(amd_context->pipe_screen,
+        fprintf(stderr, "Creating r300 context...");
+        pipe = r300_create_context(NULL,
                                    amd_context->pipe_winsys,
-                                   (struct amd_pipe_winsys*)amd_context->pipe_winsys);
+                                   amd_create_r300_winsys(amd_context->drm_fd));
     } else {
         pipe = amd_create_softpipe(amd_context);
     }
index 54a831f15a41c2ad4e653aa4d573c68388efd6c8..12557c40c417b78fd26bdfe576d7268d56e281dc 100644 (file)
@@ -35,6 +35,8 @@
 #include "state_tracker/st_context.h"
 #include "amd_screen.h"
 
+#include "amd_r300.h"
+
 struct amd_framebuffer {
     struct st_framebuffer   *st_framebuffer;
     unsigned                attachments;
diff --git a/src/gallium/winsys/drm/amd/amd_r300.c b/src/gallium/winsys/drm/amd/amd_r300.c
new file mode 100644 (file)
index 0000000..0bc0a84
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#include "amd_r300.h"
+
+static boolean amd_r300_check_cs(struct radeon_cs* cs, int size)
+{
+    /* XXX check size here, lazy ass! */
+    return TRUE;
+}
+
+static void amd_r300_write_cs_reloc(struct radeon_cs* cs,
+                                    struct pipe_buffer* pbuffer,
+                                    uint32_t rd,
+                                    uint32_t wd,
+                                    uint32_t flags)
+{
+    radeon_cs_write_reloc(cs, ((struct amd_pipe_buffer*)pbuffer)->bo, rd, wd, flags);
+}
+
+struct r300_winsys* amd_create_r300_winsys(int fd)
+{
+    struct r300_winsys* winsys = calloc(1, sizeof(struct r300_winsys));
+
+    struct radeon_cs_manager* csm = radeon_cs_manager_gem_ctor(fd);
+
+    winsys->cs = radeon_cs_create(csm, 1024 * 64 / 4);
+
+    winsys->check_cs = amd_r300_check_cs;
+    winsys->begin_cs = radeon_cs_begin;
+    winsys->write_cs_dword = radeon_cs_write_dword;
+    winsys->write_cs_reloc = amd_r300_write_cs_reloc;
+    winsys->end_cs = radeon_cs_end;
+
+    return winsys;
+}
\ No newline at end of file
diff --git a/src/gallium/winsys/drm/amd/amd_r300.h b/src/gallium/winsys/drm/amd/amd_r300.h
new file mode 100644 (file)
index 0000000..ef26945
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#include "radeon_cs.h"
+
+#include "r300_winsys.h"
+
+#include "amd_buffer.h"
+
+struct r300_winsys* amd_create_r300_winsys(int fd);