summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorCorbin Simpson <[email protected]>2009-01-12 01:40:50 -0800
committerCorbin Simpson <[email protected]>2009-02-01 23:30:22 -0800
commitfbeeb6675733f5b2da36d40b0142dadf8cc953b4 (patch)
treeaadefefde5fa45534c6b6c13faf2ef6fbc29c0d6 /src/gallium/drivers
parent0c59004fe3cc9f691c73da2b4a9321c7682410f4 (diff)
r300, amd: Make everything build. (Not necessarily work, mind you.)
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.
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/r300/r300_blit.c2
-rw-r--r--src/gallium/drivers/r300/r300_context.c6
-rw-r--r--src/gallium/drivers/r300/r300_context.h13
-rw-r--r--src/gallium/drivers/r300/r300_cs.h30
-rw-r--r--src/gallium/drivers/r300/r300_screen.c4
-rw-r--r--src/gallium/drivers/r300/r300_winsys.h87
6 files changed, 113 insertions, 29 deletions
diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c
index c404a667b10..b8ddf6677f6 100644
--- a/src/gallium/drivers/r300/r300_blit.c
+++ b/src/gallium/drivers/r300/r300_blit.c
@@ -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);
diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c
index 4050faa74a2..b9a9c2e21c2 100644
--- a/src/gallium/drivers/r300/r300_context.c
+++ b/src/gallium/drivers/r300/r300_context.c
@@ -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;
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index 83931982006..119d46af589 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -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
diff --git a/src/gallium/drivers/r300/r300_cs.h b/src/gallium/drivers/r300/r300_cs.h
index ebd5324119a..1422842e0ce 100644
--- a/src/gallium/drivers/r300/r300_cs.h
+++ b/src/gallium/drivers/r300/r300_cs.h
@@ -23,48 +23,50 @@
#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
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
index 37a74b3c0ad..dacde27888c 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -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
index 00000000000..7048a9c88d5
--- /dev/null
+++ b/src/gallium/drivers/r300/r300_winsys.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2008 Corbin Simpson <[email protected]>
+ *
+ * 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