gallium-r300: Initial commit.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Tue, 6 Jan 2009 07:55:00 +0000 (23:55 -0800)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Mon, 2 Feb 2009 07:30:19 +0000 (23:30 -0800)
Or should it be r300-gallium? Meh, whatever.

src/gallium/drivers/r300/r300_context.c [new file with mode: 0644]
src/gallium/drivers/r300/r300_context.h [new file with mode: 0644]
src/gallium/drivers/r300/r300_screen.c [new file with mode: 0644]
src/gallium/drivers/r300/r300_state.c [new file with mode: 0644]

diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c
new file mode 100644 (file)
index 0000000..a2ed027
--- /dev/null
@@ -0,0 +1,27 @@
+#include "r300_context.h"
+
+static void r300_destroy_context(struct pipe_context* pipe) {
+    struct r300_context* context = r300_context(pipe);
+
+    draw_destroy(context->draw);
+
+    FREE(context);
+}
+
+struct pipe_context* r300_create_context(struct pipe_screen* screen,
+                                         struct pipe_winsys* winsys,
+                                         struct amd_winsys* amd_winsys)
+{
+    struct r300_context* context = CALLOC_STRUCT(r300_context);
+
+    if (!context)
+        return NULL;
+
+    context->winsys = amd_winsys;
+    context->pipe.winsys = winsys;
+    context->pipe.screen = screen;
+
+    context->pipe.destroy = r300_destroy_context;
+
+    return &context->pipe;
+}
\ No newline at end of file
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
new file mode 100644 (file)
index 0000000..cd4b56c
--- /dev/null
@@ -0,0 +1,4 @@
+/* Convenience cast wrapper. */
+static struct r300_context* r300_context(struct pipe_context* pipe) {
+    return (struct r300_context*)pipe;
+}
\ No newline at end of file
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
new file mode 100644 (file)
index 0000000..a1f056b
--- /dev/null
@@ -0,0 +1,119 @@
+/* XXX put a copyright here */
+
+/* I know my style's weird, get used to it */
+
+static const char* r300_get_vendor(struct pipe_screen* pscreen) {
+    return "X.Org R300 Project";
+}
+
+static const char* r300_get_name(struct pipe_screen* pscreen) {
+    /* XXX lazy */
+    return "unknown";
+}
+
+static int r300_get_param(struct pipe_screen* pscreen, int param) {
+    switch (param) {
+        /* Cases marked "IN THEORY" are possible on the hardware,
+         * but haven't been implemented yet. */
+        case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
+            /* XXX I'm told this goes up to 16 */
+            return 8;
+        case PIPE_CAP_NPOT_TEXTURES:
+            /* IN THEORY */
+            return 0;
+        case PIPE_CAP_S3TC:
+            /* IN THEORY */
+            return 0;
+        case PIPE_CAP_TWO_SIDED_STENCIL:
+            /* IN THEORY */
+            return 0;
+        case PIPE_CAP_ANISOTROPIC_FILTER:
+            /* IN THEORY */
+            return 0;
+        case PIPE_CAP_POINT_SPRITE:
+            /* IN THEORY */
+            return 0;
+        case PIPE_CAP_OCCLUSION_QUERY:
+            /* IN THEORY */
+            return 0;
+        case PIPE_CAP_TEXTURE_SHADOW_MAP:
+            /* IN THEORY */
+            return 0;
+        case PIPE_CAP_GLSL:
+            /* IN THEORY */
+            return 0;
+        case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+            /* 12 == 2048x2048
+             * R500 can do 4096x4096 */
+            return 12;
+        case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
+            /* XXX educated guess */
+            return 8;
+        case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
+            /* XXX educated guess */
+            return 11;
+        case PIPE_CAP_MAX_RENDER_TARGETS:
+            /* XXX 4 eventually */
+            return 1;
+        default:
+            return 0;
+    }
+}
+
+static float r300_get_paramf(struct pipe_screen* pscreen, float param) {
+    switch (param) {
+        case PIPE_CAP_MAX_LINE_WIDTH:
+        case PIPE_CAP_MAX_LINE_WIDTH_AA:
+            /* XXX look this up, lazy ass! */
+            return 0.0;
+        case PIPE_CAP_MAX_POINT_WIDTH:
+        case PIPE_CAP_MAX_POINT_WIDTH_AA:
+            /* XXX see above */
+            return 255.0;
+        case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
+            return 16.0;
+        case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
+            /* XXX again... */
+            return 16.0;
+        default:
+            return 0.0;
+    }
+}
+
+static boolean r300_is_format_supported(struct pipe_screen* pscreen,
+                                        enum pipe_format format, uint type)
+{
+    return FALSE;
+}
+
+static r300_destroy_screen(struct pipe_screen* pscreen) {
+    FREE(pscreen);
+}
+
+struct pipe_screen* r300_create_screen(struct pipe_winsys* winsys, uint pci_id) {
+    struct r300_screen* r300screen = CALLOC_STRUCT(r300_screen);
+
+    if (!r300screen)
+        return NULL;
+
+    /* 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;
+    r300screen->screen.destroy = r300_destroy_screen;
+    r300screen->screen.get_name = r300_get_name;
+    r300screen->screen.get_vendor = r300_get_vendor;
+    r300screen->screen.get_param = r300_get_param;
+    r300screen->screen.get_paramf = r300_get_paramf;
+    r300screen->screen.is_format_supported = r300_is_format_supported;
+    r300screen->screen.surface_map = r300_surface_map;
+    r300screen->screen.surface_unmap = r300_surface_unmap;
+
+    return &r300screen->screen;
+}
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
new file mode 100644 (file)
index 0000000..18b3d55
--- /dev/null
@@ -0,0 +1,22 @@
+#include "r300_context.h"
+
+static void* r300_create_vs_state(struct pipe_context* pipe,
+                                  struct pipe_shader_state* state)
+{
+    struct r300_context* context = r300_context(pipe);
+    /* XXX handing this off to Draw for now */
+    return draw_create_vertex_shader(context->draw, state);
+}
+
+static void r300_bind_vs_state(struct pipe_context* pipe, void* state) {
+    struct r300_context* context = r300_context(pipe);
+    /* XXX handing this off to Draw for now */
+    draw_bind_vertex_shader(context->draw, (struct draw_vertex_shader*)state);
+}
+
+static void r300_delete_vs_state(struct pipe_context* pipe, void* state)
+{
+    struct r300_context* context = r300_context(pipe);
+    /* XXX handing this off to Draw for now */
+    draw_delete_vertex_shader(context->draw, (struct draw_vertex_shader*)state);
+}
\ No newline at end of file