summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/drm/radeon
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/winsys/drm/radeon')
-rw-r--r--src/gallium/winsys/drm/radeon/Makefile36
-rw-r--r--src/gallium/winsys/drm/radeon/core/Makefile18
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_buffer.c (renamed from src/gallium/winsys/drm/radeon/radeon_buffer.c)106
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_buffer.h (renamed from src/gallium/winsys/drm/radeon/radeon_buffer.h)25
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_drm.c122
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_drm.h (renamed from src/gallium/winsys/drm/radeon/radeon_context.h)63
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_r300.c (renamed from src/gallium/winsys/drm/radeon/radeon_r300.c)7
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_r300.h (renamed from src/gallium/winsys/drm/radeon/radeon_r300.h)3
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_winsys_softpipe.c (renamed from src/gallium/winsys/drm/radeon/radeon_winsys_softpipe.c)26
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_winsys_softpipe.h (renamed from src/gallium/winsys/drm/radeon/radeon_winsys_softpipe.h)11
-rw-r--r--src/gallium/winsys/drm/radeon/dri2/Makefile25
-rw-r--r--src/gallium/winsys/drm/radeon/egl/Makefile25
-rw-r--r--src/gallium/winsys/drm/radeon/radeon_context.c306
-rw-r--r--src/gallium/winsys/drm/radeon/radeon_screen.c288
-rw-r--r--src/gallium/winsys/drm/radeon/radeon_screen.h41
-rw-r--r--src/gallium/winsys/drm/radeon/xorg/Makefile42
-rw-r--r--src/gallium/winsys/drm/radeon/xorg/radeon_xorg.c157
17 files changed, 525 insertions, 776 deletions
diff --git a/src/gallium/winsys/drm/radeon/Makefile b/src/gallium/winsys/drm/radeon/Makefile
index dca1e3233a..bacdf3de28 100644
--- a/src/gallium/winsys/drm/radeon/Makefile
+++ b/src/gallium/winsys/drm/radeon/Makefile
@@ -1,32 +1,12 @@
-
+# src/gallium/winsys/drm/radeon/Makefile
TOP = ../../../../..
include $(TOP)/configs/current
-LIBNAME = radeon_dri.so
-
-MINIGLX_SOURCES =
-
-PIPE_DRIVERS = \
- $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
- $(TOP)/src/gallium/drivers/r300/libr300.a
-
-DRIVER_SOURCES = \
- radeon_buffer.c \
- radeon_context.c \
- radeon_r300.c \
- radeon_screen.c \
- radeon_winsys_softpipe.c
-
-C_SOURCES = \
- $(COMMON_GALLIUM_SOURCES) \
- $(DRIVER_SOURCES)
-
-ASM_SOURCES =
-
-DRIVER_DEFINES = -I../../../drivers/r300
-
-include ../Makefile.template
-
-DRI_LIB_DEPS += -ldrm_radeon
+SUBDIRS = core $(GALLIUM_STATE_TRACKERS_DIRS)
-symlinks:
+default install clean:
+ @for dir in $(SUBDIRS) ; do \
+ if [ -d $$dir ] ; then \
+ (cd $$dir && $(MAKE) $@) || exit 1; \
+ fi \
+ done
diff --git a/src/gallium/winsys/drm/radeon/core/Makefile b/src/gallium/winsys/drm/radeon/core/Makefile
new file mode 100644
index 0000000000..42a6f4abc2
--- /dev/null
+++ b/src/gallium/winsys/drm/radeon/core/Makefile
@@ -0,0 +1,18 @@
+
+TOP = ../../../../../..
+include $(TOP)/configs/current
+
+LIBNAME = radeonwinsys
+
+C_SOURCES = \
+ radeon_buffer.c \
+ radeon_drm.c \
+ radeon_r300.c \
+ radeon_winsys_softpipe.c
+
+LIBRARY_INCLUDES = -I$(TOP)/src/gallium/drivers/r300 \
+ $(shell pkg-config libdrm --cflags-only-I)
+
+include ../../../../Makefile.template
+
+symlinks:
diff --git a/src/gallium/winsys/drm/radeon/radeon_buffer.c b/src/gallium/winsys/drm/radeon/core/radeon_buffer.c
index 259a505c0a..9dca510c81 100644
--- a/src/gallium/winsys/drm/radeon/radeon_buffer.c
+++ b/src/gallium/winsys/drm/radeon/core/radeon_buffer.c
@@ -1,5 +1,6 @@
/*
* Copyright © 2008 Jérôme Glisse
+ * 2009 Corbin Simpson
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
@@ -26,37 +27,31 @@
/*
* Authors:
* Jérôme Glisse <glisse@freedesktop.org>
+ * Corbin Simpson <MostAwesomeDude@gmail.com>
*/
-#include <stdio.h>
-#include "dri_util.h"
-#include "state_tracker/st_public.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_inlines.h"
+
#include "radeon_buffer.h"
-#include "radeon_screen.h"
-#include "radeon_context.h"
-#include "radeon_bo.h"
-#include "radeon_drm.h"
static const char *radeon_get_name(struct pipe_winsys *ws)
{
- return "RADEON/DRI2";
+ return "Radeon/GEM+KMS";
}
static struct pipe_buffer *radeon_buffer_create(struct pipe_winsys *ws,
- unsigned alignment,
- unsigned usage,
- unsigned size)
+ unsigned alignment,
+ unsigned usage,
+ unsigned size)
{
- struct radeon_pipe_winsys *radeon_ws = (struct radeon_pipe_winsys *)ws;
+ struct radeon_winsys *radeon_ws = (struct radeon_winsys *)ws;
struct radeon_pipe_buffer *radeon_buffer;
uint32_t domain;
- radeon_buffer = calloc(1, sizeof(*radeon_buffer));
+ radeon_buffer = CALLOC_STRUCT(radeon_pipe_buffer);
if (radeon_buffer == NULL) {
return NULL;
}
- radeon_buffer->base.refcount = 1;
+
+ pipe_reference_init(&radeon_buffer->base.reference, 1);
radeon_buffer->base.alignment = alignment;
radeon_buffer->base.usage = usage;
radeon_buffer->base.size = size;
@@ -69,21 +64,21 @@ static struct pipe_buffer *radeon_buffer_create(struct pipe_winsys *ws,
if (usage & PIPE_BUFFER_USAGE_VERTEX) {
domain |= RADEON_GEM_DOMAIN_GTT;
}
-
if (usage & PIPE_BUFFER_USAGE_INDEX) {
domain |= RADEON_GEM_DOMAIN_GTT;
}
- radeon_buffer->bo = radeon_bo_open(radeon_ws->radeon_screen->bom, 0,
- size, alignment, domain, 0);
+
+ radeon_buffer->bo = radeon_bo_open(radeon_ws->bom, 0, size, alignment,
+ domain, 0);
if (radeon_buffer->bo == NULL) {
- free(radeon_buffer);
+ FREE(radeon_buffer);
}
return &radeon_buffer->base;
}
static struct pipe_buffer *radeon_buffer_user_create(struct pipe_winsys *ws,
- void *ptr,
- unsigned bytes)
+ void *ptr,
+ unsigned bytes)
{
struct radeon_pipe_buffer *radeon_buffer;
@@ -97,7 +92,7 @@ static struct pipe_buffer *radeon_buffer_user_create(struct pipe_winsys *ws,
return &radeon_buffer->base;
}
-static void radeon_buffer_del(struct pipe_winsys *ws, struct pipe_buffer *buffer)
+static void radeon_buffer_del(struct pipe_buffer *buffer)
{
struct radeon_pipe_buffer *radeon_buffer = (struct radeon_pipe_buffer*)buffer;
@@ -106,15 +101,20 @@ static void radeon_buffer_del(struct pipe_winsys *ws, struct pipe_buffer *buffer
}
static void *radeon_buffer_map(struct pipe_winsys *ws,
- struct pipe_buffer *buffer,
- unsigned flags)
+ struct pipe_buffer *buffer,
+ unsigned flags)
{
struct radeon_pipe_buffer *radeon_buffer = (struct radeon_pipe_buffer*)buffer;
int write = 0;
+ if (flags & PIPE_BUFFER_USAGE_DONTBLOCK) {
+ /* XXX Remove this when radeon_bo_map supports DONTBLOCK */
+ return NULL;
+ }
if (flags & PIPE_BUFFER_USAGE_CPU_WRITE) {
write = 1;
}
+
if (radeon_bo_map(radeon_buffer->bo, write))
return NULL;
return radeon_buffer->bo->ptr;
@@ -128,59 +128,62 @@ static void radeon_buffer_unmap(struct pipe_winsys *ws, struct pipe_buffer *buff
}
static void radeon_fence_reference(struct pipe_winsys *ws,
- struct pipe_fence_handle **ptr,
- struct pipe_fence_handle *pfence)
+ struct pipe_fence_handle **ptr,
+ struct pipe_fence_handle *pfence)
{
}
static int radeon_fence_signalled(struct pipe_winsys *ws,
- struct pipe_fence_handle *pfence,
- unsigned flag)
+ struct pipe_fence_handle *pfence,
+ unsigned flag)
{
return 1;
}
static int radeon_fence_finish(struct pipe_winsys *ws,
- struct pipe_fence_handle *pfence,
- unsigned flag)
+ struct pipe_fence_handle *pfence,
+ unsigned flag)
{
return 0;
}
static void radeon_flush_frontbuffer(struct pipe_winsys *pipe_winsys,
- struct pipe_surface *pipe_surface,
- void *context_private)
+ struct pipe_surface *pipe_surface,
+ void *context_private)
{
/* TODO: call dri2CopyRegion */
}
-struct pipe_winsys *radeon_pipe_winsys(struct radeon_screen *radeon_screen)
+struct radeon_winsys* radeon_pipe_winsys(int fd)
{
- struct radeon_pipe_winsys *radeon_ws;
+ struct radeon_winsys* radeon_ws;
+ struct radeon_bo_manager* bom;
- radeon_ws = calloc(1, sizeof(struct radeon_pipe_winsys));
+ radeon_ws = CALLOC_STRUCT(radeon_winsys);
if (radeon_ws == NULL) {
return NULL;
}
- radeon_ws->radeon_screen = radeon_screen;
- radeon_ws->winsys.flush_frontbuffer = radeon_flush_frontbuffer;
+ bom = radeon_bo_manager_gem_ctor(fd);
+ radeon_ws->bom = bom;
- radeon_ws->winsys.buffer_create = radeon_buffer_create;
- radeon_ws->winsys.buffer_destroy = radeon_buffer_del;
- radeon_ws->winsys.user_buffer_create = radeon_buffer_user_create;
- radeon_ws->winsys.buffer_map = radeon_buffer_map;
- radeon_ws->winsys.buffer_unmap = radeon_buffer_unmap;
+ radeon_ws->base.flush_frontbuffer = radeon_flush_frontbuffer;
- radeon_ws->winsys.fence_reference = radeon_fence_reference;
- radeon_ws->winsys.fence_signalled = radeon_fence_signalled;
- radeon_ws->winsys.fence_finish = radeon_fence_finish;
+ radeon_ws->base.buffer_create = radeon_buffer_create;
+ radeon_ws->base.buffer_destroy = radeon_buffer_del;
+ radeon_ws->base.user_buffer_create = radeon_buffer_user_create;
+ radeon_ws->base.buffer_map = radeon_buffer_map;
+ radeon_ws->base.buffer_unmap = radeon_buffer_unmap;
- radeon_ws->winsys.get_name = radeon_get_name;
+ radeon_ws->base.fence_reference = radeon_fence_reference;
+ radeon_ws->base.fence_signalled = radeon_fence_signalled;
+ radeon_ws->base.fence_finish = radeon_fence_finish;
- return &radeon_ws->winsys;
-}
+ radeon_ws->base.get_name = radeon_get_name;
+ return radeon_ws;
+}
+#if 0
static struct pipe_buffer *radeon_buffer_from_handle(struct radeon_screen *radeon_screen,
uint32_t handle)
{
@@ -196,7 +199,7 @@ static struct pipe_buffer *radeon_buffer_from_handle(struct radeon_screen *radeo
radeon_bo_unref(bo);
return NULL;
}
- radeon_buffer->base.refcount = 1;
+ pipe_reference_init(&radeon_buffer->base.reference, 1);
radeon_buffer->base.usage = PIPE_BUFFER_USAGE_PIXEL;
radeon_buffer->bo = bo;
return &radeon_buffer->base;
@@ -231,9 +234,10 @@ struct pipe_surface *radeon_surface_from_handle(struct radeon_context *radeon_co
pt = pipe_screen->texture_blanket(pipe_screen, &tmpl, &pitch, pb);
if (pt == NULL) {
- pipe_buffer_reference(pipe_screen, &pb, NULL);
+ pipe_buffer_reference(&pb, NULL);
}
ps = pipe_screen->get_tex_surface(pipe_screen, pt, 0, 0, 0,
PIPE_BUFFER_USAGE_GPU_WRITE);
return ps;
}
+#endif
diff --git a/src/gallium/winsys/drm/radeon/radeon_buffer.h b/src/gallium/winsys/drm/radeon/core/radeon_buffer.h
index c626c20229..40ad0fc8d1 100644
--- a/src/gallium/winsys/drm/radeon/radeon_buffer.h
+++ b/src/gallium/winsys/drm/radeon/core/radeon_buffer.h
@@ -30,22 +30,35 @@
#ifndef RADEON_BUFFER_H
#define RADEON_BUFFER_H
+#include <stdio.h>
+
#include "pipe/internal/p_winsys_screen.h"
-#include "radeon_screen.h"
-#include "radeon_context.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_inlines.h"
+
+//#include "state_tracker/st_public.h"
+
+#include "util/u_memory.h"
+
#include "radeon_bo.h"
+#include "radeon_drm.h"
+
struct radeon_pipe_buffer {
struct pipe_buffer base;
struct radeon_bo *bo;
};
-struct radeon_pipe_winsys {
- struct pipe_winsys winsys;
- struct radeon_screen *radeon_screen;
+struct radeon_winsys {
+ /* Parent class. */
+ struct pipe_winsys base;
+
+ /* Radeon BO manager.
+ * This corresponds to void* radeon_winsys in r300_winsys. */
+ struct radeon_bo_manager* bom;
};
-struct pipe_winsys *radeon_pipe_winsys(struct radeon_screen *radeon_screen);
+struct radeon_winsys* radeon_pipe_winsys(int fb);
struct pipe_surface *radeon_surface_from_handle(struct radeon_context *radeon_context,
uint32_t handle,
enum pipe_format format,
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_drm.c b/src/gallium/winsys/drm/radeon/core/radeon_drm.c
new file mode 100644
index 0000000000..3446654e28
--- /dev/null
+++ b/src/gallium/winsys/drm/radeon/core/radeon_drm.c
@@ -0,0 +1,122 @@
+/*
+ * Copyright © 2009 Corbin Simpson
+ * All Rights Reserved.
+ *
+ * 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 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 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 COPYRIGHT HOLDERS, AUTHORS
+ * AND/OR ITS 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.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ */
+/*
+ * Authors:
+ * Corbin Simpson <MostAwesomeDude@gmail.com>
+ */
+
+#include "radeon_drm.h"
+
+/* Create a pipe_screen. */
+struct pipe_screen* radeon_create_screen(int drmFB, int pciID)
+{
+ struct radeon_winsys* winsys = radeon_pipe_winsys(drmFB);
+
+ if (getenv("RADEON_SOFTPIPE")) {
+ return softpipe_create_screen((struct pipe_winsys*)winsys);
+ } else {
+ struct r300_winsys* r300 = radeon_create_r300_winsys(drmFB, winsys);
+ FREE(winsys);
+ return r300_create_screen(r300);
+ }
+}
+
+/* Create a pipe_context. */
+struct pipe_context* radeon_create_context(struct pipe_screen* screen)
+{
+ if (getenv("RADEON_SOFTPIPE")) {
+ return radeon_create_softpipe(screen->winsys);
+ } else {
+ return r300_create_context(screen, screen->winsys);
+ }
+}
+
+boolean radeon_buffer_from_texture(struct pipe_texture* texture,
+ struct pipe_buffer** buffer,
+ unsigned* stride)
+{
+ return FALSE;
+}
+
+/* Create a buffer from a handle. */
+/* XXX what's up with name? */
+struct pipe_buffer* radeon_buffer_from_handle(struct pipe_screen* screen,
+ const char* name,
+ unsigned handle)
+{
+ struct radeon_bo_manager* bom =
+ ((struct radeon_winsys*)screen->winsys)->bom;
+ struct radeon_pipe_buffer* radeon_buffer;
+ struct radeon_bo* bo = NULL;
+
+ bo = radeon_bo_open(bom, handle, 0, 0, 0, 0);
+ if (bo == NULL) {
+ return NULL;
+ }
+
+ radeon_buffer = CALLOC_STRUCT(radeon_pipe_buffer);
+ if (radeon_buffer == NULL) {
+ radeon_bo_unref(bo);
+ return NULL;
+ }
+
+ pipe_reference_init(&radeon_buffer->base.reference, 1);
+ radeon_buffer->base.screen = screen;
+ radeon_buffer->base.usage = PIPE_BUFFER_USAGE_PIXEL;
+ radeon_buffer->bo = bo;
+ return &radeon_buffer->base;
+}
+
+boolean radeon_handle_from_buffer(struct pipe_screen* screen,
+ struct pipe_buffer* buffer,
+ unsigned* handle)
+{
+ struct radeon_pipe_buffer* radeon_buffer =
+ (struct radeon_pipe_buffer*)buffer;
+ *handle = radeon_buffer->bo->handle;
+ return TRUE;
+}
+
+boolean radeon_global_handle_from_buffer(struct pipe_screen* screen,
+ struct pipe_buffer* buffer,
+ unsigned* handle)
+{
+ /* XXX WTF is the difference here? global? */
+ struct radeon_pipe_buffer* radeon_buffer =
+ (struct radeon_pipe_buffer*)buffer;
+ *handle = radeon_buffer->bo->handle;
+ return TRUE;
+}
+
+struct drm_api drm_api_hooks = {
+ .create_screen = radeon_create_screen,
+ .create_context = radeon_create_context,
+ /* XXX fix this */
+ .buffer_from_texture = r300_get_texture_buffer,
+ .buffer_from_handle = radeon_buffer_from_handle,
+ .handle_from_buffer = radeon_handle_from_buffer,
+ .global_handle_from_buffer = radeon_global_handle_from_buffer,
+};
diff --git a/src/gallium/winsys/drm/radeon/radeon_context.h b/src/gallium/winsys/drm/radeon/core/radeon_drm.h
index d7222b4469..ca2d98ed1a 100644
--- a/src/gallium/winsys/drm/radeon/radeon_context.h
+++ b/src/gallium/winsys/drm/radeon/core/radeon_drm.h
@@ -1,5 +1,5 @@
/*
- * Copyright © 2008 Jérôme Glisse
+ * Copyright © 2009 Corbin Simpson
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
@@ -25,46 +25,39 @@
*/
/*
* Authors:
- * Jérôme Glisse <glisse@freedesktop.org>
+ * Corbin Simpson <MostAwesomeDude@gmail.com>
*/
-#ifndef RADEON_CONTEXT_H
-#define RADEON_CONTEXT_H
+#ifndef RADEON_DRM_H
+#define RADEON_DRM_H
-#include "dri_util.h"
-#include "state_tracker/st_public.h"
-#include "state_tracker/st_context.h"
-#include "radeon_screen.h"
+#include "pipe/p_screen.h"
+#include "util/u_memory.h"
+
+#include "state_tracker/drm_api.h"
+
+#include "radeon_buffer.h"
#include "radeon_r300.h"
+#include "radeon_winsys_softpipe.h"
+
+struct pipe_screen* radeon_create_screen(int drmFB, int pciID);
+
+struct pipe_context* radeon_create_context(struct pipe_screen* screen);
+
+boolean radeon_buffer_from_texture(struct pipe_texture* texture,
+ struct pipe_buffer** buffer,
+ unsigned* stride);
-struct radeon_framebuffer {
- struct st_framebuffer *st_framebuffer;
- unsigned attachments;
-};
+struct pipe_buffer* radeon_buffer_from_handle(struct pipe_screen* screen,
+ const char* name,
+ unsigned handle);
-struct radeon_context {
- /* st */
- struct st_context *st_context;
- /* pipe */
- struct pipe_screen *pipe_screen;
- struct pipe_winsys *pipe_winsys;
- /* DRI */
- __DRIscreenPrivate *dri_screen;
- __DRIdrawablePrivate *dri_drawable;
- __DRIdrawablePrivate *dri_readable;
- /* DRM */
- int drm_fd;
- /* RADEON */
- struct radeon_screen *radeon_screen;
-};
+boolean radeon_handle_from_buffer(struct pipe_screen* screen,
+ struct pipe_buffer* buffer,
+ unsigned* handle);
-GLboolean radeon_context_create(const __GLcontextModes*,
- __DRIcontextPrivate*,
- void*);
-void radeon_context_destroy(__DRIcontextPrivate*);
-GLboolean radeon_context_bind(__DRIcontextPrivate*,
- __DRIdrawablePrivate*,
- __DRIdrawablePrivate*);
-GLboolean radeon_context_unbind(__DRIcontextPrivate*);
+boolean radeon_global_handle_from_buffer(struct pipe_screen* screen,
+ struct pipe_buffer* buffer,
+ unsigned* handle);
#endif
diff --git a/src/gallium/winsys/drm/radeon/radeon_r300.c b/src/gallium/winsys/drm/radeon/core/radeon_r300.c
index 8fe2375e34..c7b6813014 100644
--- a/src/gallium/winsys/drm/radeon/radeon_r300.c
+++ b/src/gallium/winsys/drm/radeon/core/radeon_r300.c
@@ -75,9 +75,10 @@ static void do_ioctls(struct r300_winsys* winsys, int fd)
}
-struct r300_winsys* radeon_create_r300_winsys(int fd)
+struct r300_winsys*
+radeon_create_r300_winsys(int fd, struct radeon_winsys* old_winsys)
{
- struct r300_winsys* winsys = calloc(1, sizeof(struct r300_winsys));
+ struct r300_winsys* winsys = CALLOC_STRUCT(r300_winsys);
do_ioctls(winsys, fd);
@@ -92,5 +93,7 @@ struct r300_winsys* radeon_create_r300_winsys(int fd)
winsys->end_cs = radeon_cs_end;
winsys->flush_cs = radeon_r300_flush_cs;
+ memcpy(winsys, old_winsys, sizeof(struct radeon_winsys));
+
return winsys;
}
diff --git a/src/gallium/winsys/drm/radeon/radeon_r300.h b/src/gallium/winsys/drm/radeon/core/radeon_r300.h
index 8ed95a3a9b..5c373cd084 100644
--- a/src/gallium/winsys/drm/radeon/radeon_r300.h
+++ b/src/gallium/winsys/drm/radeon/core/radeon_r300.h
@@ -31,4 +31,5 @@
#include "radeon_buffer.h"
-struct r300_winsys* radeon_create_r300_winsys(int fd);
+struct r300_winsys*
+radeon_create_r300_winsys(int fd, struct radeon_winsys* old_winsys);
diff --git a/src/gallium/winsys/drm/radeon/radeon_winsys_softpipe.c b/src/gallium/winsys/drm/radeon/core/radeon_winsys_softpipe.c
index 8402e1fa5a..226e16674c 100644
--- a/src/gallium/winsys/drm/radeon/radeon_winsys_softpipe.c
+++ b/src/gallium/winsys/drm/radeon/core/radeon_winsys_softpipe.c
@@ -28,12 +28,7 @@
/*
* Authors: Keith Whitwell <keithw-at-tungstengraphics-dot-com>
*/
-#include <stdio.h>
-#include "imports.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_format.h"
-#include "softpipe/sp_winsys.h"
-#include "radeon_context.h"
+
#include "radeon_winsys_softpipe.h"
struct radeon_softpipe_winsys {
@@ -57,21 +52,20 @@ static boolean radeon_is_format_supported(struct softpipe_winsys *sws, uint form
return FALSE;
}
-struct pipe_context *radeon_create_softpipe(struct radeon_context *radeon_context)
+struct pipe_context *radeon_create_softpipe(struct pipe_winsys* winsys)
{
- struct radeon_softpipe_winsys *radeon_sp_ws;
+ struct softpipe_winsys *sp_winsys;
struct pipe_screen *pipe_screen;
- pipe_screen = softpipe_create_screen(radeon_context->pipe_winsys);
+ pipe_screen = softpipe_create_screen(winsys);
- radeon_sp_ws = CALLOC_STRUCT(radeon_softpipe_winsys);
- if (radeon_sp_ws == NULL) {
+ sp_winsys = CALLOC_STRUCT(softpipe_winsys);
+ if (sp_winsys == NULL) {
return NULL;
}
- radeon_context->pipe_screen = pipe_screen;
- radeon_sp_ws->radeon_context = radeon_context;
- radeon_sp_ws->sp_winsys.is_format_supported = radeon_is_format_supported;
+
+ sp_winsys->is_format_supported = radeon_is_format_supported;
return softpipe_create(pipe_screen,
- radeon_context->pipe_winsys,
- &radeon_sp_ws->sp_winsys);
+ winsys,
+ sp_winsys);
}
diff --git a/src/gallium/winsys/drm/radeon/radeon_winsys_softpipe.h b/src/gallium/winsys/drm/radeon/core/radeon_winsys_softpipe.h
index 519eab769c..04740e41a5 100644
--- a/src/gallium/winsys/drm/radeon/radeon_winsys_softpipe.h
+++ b/src/gallium/winsys/drm/radeon/core/radeon_winsys_softpipe.h
@@ -30,8 +30,15 @@
#ifndef RADEON_WINSYS_SOFTPIPE_H
#define RADEON_WINSYS_SOFTPIPE_H
-#include "radeon_context.h"
+#include <stdio.h>
-struct pipe_context *radeon_create_softpipe(struct radeon_context *radeon_context);
+#include "pipe/p_defines.h"
+#include "pipe/p_format.h"
+
+#include "softpipe/sp_winsys.h"
+
+#include "util/u_memory.h"
+
+struct pipe_context *radeon_create_softpipe(struct pipe_winsys* winsys);
#endif
diff --git a/src/gallium/winsys/drm/radeon/dri2/Makefile b/src/gallium/winsys/drm/radeon/dri2/Makefile
new file mode 100644
index 0000000000..f471c44349
--- /dev/null
+++ b/src/gallium/winsys/drm/radeon/dri2/Makefile
@@ -0,0 +1,25 @@
+
+TOP = ../../../../../..
+include $(TOP)/configs/current
+
+LIBNAME = radeon_dri.so
+
+MINIGLX_SOURCES =
+
+PIPE_DRIVERS = \
+ $(TOP)/src/gallium/state_trackers/dri2/libdri2drm.a \
+ $(TOP)/src/gallium/winsys/drm/radeon/core/libradeonwinsys.a \
+ $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+ $(TOP)/src/gallium/drivers/r300/libr300.a
+
+C_SOURCES = \
+ $(COMMON_GALLIUM_SOURCES) \
+ $(DRIVER_SOURCES)
+
+ASM_SOURCES =
+
+include ../../Makefile.template
+
+DRI_LIB_DEPS += -ldrm_radeon
+
+symlinks:
diff --git a/src/gallium/winsys/drm/radeon/egl/Makefile b/src/gallium/winsys/drm/radeon/egl/Makefile
new file mode 100644
index 0000000000..d989b3aa93
--- /dev/null
+++ b/src/gallium/winsys/drm/radeon/egl/Makefile
@@ -0,0 +1,25 @@
+TOP = ../../../../../..
+GALLIUMDIR = ../../../..
+include $(TOP)/configs/current
+
+LIBNAME = EGL_r300.so
+
+PIPE_DRIVERS = \
+ $(TOP)/src/gallium/state_trackers/egl/libegldrm.a \
+ $(GALLIUMDIR)/winsys/drm/radeon/core/libradeonwinsys.a \
+ $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+ $(TOP)/src/gallium/drivers/r300/libr300.a
+
+DRIVER_SOURCES =
+
+C_SOURCES = \
+ $(COMMON_GALLIUM_SOURCES) \
+ $(DRIVER_SOURCES)
+
+DRIVER_EXTRAS = -ldrm_radeon
+
+ASM_SOURCES =
+
+include ../../Makefile.template
+
+symlinks:
diff --git a/src/gallium/winsys/drm/radeon/radeon_context.c b/src/gallium/winsys/drm/radeon/radeon_context.c
deleted file mode 100644
index a9d1577634..0000000000
--- a/src/gallium/winsys/drm/radeon/radeon_context.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright © 2008 Jérôme Glisse
- * All Rights Reserved.
- *
- * 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 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 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 COPYRIGHT HOLDERS, AUTHORS
- * AND/OR ITS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- */
-/*
- * Authors:
- * Jérôme Glisse <glisse@freedesktop.org>
- */
-#include <stdio.h>
-#include "dri_util.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_inlines.h"
-#include "state_tracker/st_public.h"
-#include "state_tracker/st_context.h"
-#include "radeon_screen.h"
-#include "radeon_context.h"
-#include "radeon_buffer.h"
-#include "radeon_winsys_softpipe.h"
-
-#define need_GL_ARB_fragment_program
-#define need_GL_ARB_multisample
-#define need_GL_ARB_point_parameters
-#define need_GL_ARB_shader_objects
-#define need_GL_ARB_texture_compression
-#define need_GL_ARB_vertex_buffer_object
-#define need_GL_ARB_vertex_program
-#define need_GL_ARB_vertex_shader
-#define need_GL_EXT_blend_color
-#define need_GL_EXT_blend_equation_separate
-#define need_GL_EXT_blend_func_separate
-#define need_GL_EXT_blend_minmax
-#define need_GL_EXT_cull_vertex
-#define need_GL_EXT_compiled_vertex_array
-#define need_GL_EXT_fog_coord
-#define need_GL_EXT_framebuffer_object
-#define need_GL_EXT_multi_draw_arrays
-#define need_GL_EXT_secondary_color
-#define need_GL_VERSION_2_0
-#define need_GL_VERSION_2_1
-#include "extension_helper.h"
-
-/**
- * Extension strings exported by the radeon driver.
- */
-const struct dri_extension radeon_card_extensions[] = {
- {"GL_ARB_multitexture", NULL},
- {"GL_ARB_texture_border_clamp", NULL},
- {"GL_ARB_texture_rectangle", NULL},
- {"GL_ARB_pixel_buffer_object", NULL},
- {"GL_ARB_point_parameters", GL_ARB_point_parameters_functions},
- {"GL_ARB_shader_objects", GL_ARB_shader_objects_functions},
- {"GL_ARB_shading_language_100", GL_VERSION_2_0_functions},
- {"GL_ARB_shading_language_120", GL_VERSION_2_1_functions},
- {"GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions},
- {"GL_ARB_vertex_program", GL_ARB_vertex_program_functions},
- {"GL_ARB_vertex_shader", GL_ARB_vertex_shader_functions},
- {"GL_EXT_blend_color", GL_EXT_blend_color_functions},
- {"GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions},
- {"GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions},
- {"GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions},
- {"GL_EXT_blend_subtract", NULL},
- {"GL_EXT_compiled_vertex_array", GL_EXT_compiled_vertex_array_functions},
- {"GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions},
- {"GL_EXT_fog_coord", GL_EXT_fog_coord_functions},
- {"GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions},
- {"GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions},
- {"GL_EXT_packed_depth_stencil", NULL},
- {"GL_EXT_pixel_buffer_object", NULL},
- {"GL_EXT_secondary_color", GL_EXT_secondary_color_functions},
- {"GL_EXT_stencil_wrap", NULL},
- {NULL, NULL}
-};
-
-static void radeon_update_renderbuffers(__DRIcontext *dri_context,
- __DRIdrawable *dri_drawable)
-{
- struct radeon_framebuffer *radeon_fb;
- struct radeon_context *radeon_context;
- unsigned attachments[10];
- __DRIbuffer *buffers;
- __DRIscreen *screen;
- int i, count;
-
- radeon_context = dri_context->driverPrivate;
- screen = dri_drawable->driScreenPriv;
- radeon_fb = dri_drawable->driverPrivate;
- for (count = 0, i = 0; count < 6; count++) {
- if (radeon_fb->attachments & (1 << count)) {
- attachments[i++] = count;
- }
- }
-
- buffers = (*screen->dri2.loader->getBuffers)(dri_drawable,
- &dri_drawable->w,
- &dri_drawable->h,
- attachments,
- i,
- &count,
- dri_drawable->loaderPrivate);
- if (buffers == NULL) {
- return;
- }
-
- /* set one cliprect to cover the whole dri_drawable */
- dri_drawable->x = 0;
- dri_drawable->y = 0;
- dri_drawable->backX = 0;
- dri_drawable->backY = 0;
- dri_drawable->numClipRects = 1;
- dri_drawable->pClipRects[0].x1 = 0;
- dri_drawable->pClipRects[0].y1 = 0;
- dri_drawable->pClipRects[0].x2 = dri_drawable->w;
- dri_drawable->pClipRects[0].y2 = dri_drawable->h;
- dri_drawable->numBackClipRects = 1;
- dri_drawable->pBackClipRects[0].x1 = 0;
- dri_drawable->pBackClipRects[0].y1 = 0;
- dri_drawable->pBackClipRects[0].x2 = dri_drawable->w;
- dri_drawable->pBackClipRects[0].y2 = dri_drawable->h;
-
- for (i = 0; i < count; i++) {
- struct pipe_surface *ps;
- enum pipe_format format = 0;
- int index = 0;
-
- switch (buffers[i].attachment) {
- case __DRI_BUFFER_FRONT_LEFT:
- index = ST_SURFACE_FRONT_LEFT;
- switch (buffers[i].cpp) {
- case 4:
- format = PIPE_FORMAT_A8R8G8B8_UNORM;
- break;
- case 2:
- format = PIPE_FORMAT_R5G6B5_UNORM;
- break;
- default:
- /* FIXME: error */
- return;
- }
- break;
- case __DRI_BUFFER_BACK_LEFT:
- index = ST_SURFACE_BACK_LEFT;
- switch (buffers[i].cpp) {
- case 4:
- format = PIPE_FORMAT_A8R8G8B8_UNORM;
- break;
- case 2:
- format = PIPE_FORMAT_R5G6B5_UNORM;
- break;
- default:
- /* FIXME: error */
- return;
- }
- break;
- case __DRI_BUFFER_STENCIL:
- case __DRI_BUFFER_DEPTH:
- index = ST_SURFACE_DEPTH;
- switch (buffers[i].cpp) {
- case 4:
- format = PIPE_FORMAT_Z24S8_UNORM;
- break;
- case 2:
- format = PIPE_FORMAT_Z16_UNORM;
- break;
- default:
- /* FIXME: error */
- return;
- }
- break;
- case __DRI_BUFFER_ACCUM:
- default:
- fprintf(stderr,
- "unhandled buffer attach event, attacment type %d\n",
- buffers[i].attachment);
- return;
- }
-
- ps = radeon_surface_from_handle(radeon_context,
- buffers[i].name,
- format,
- dri_drawable->w,
- dri_drawable->h,
- buffers[i].pitch);
- assert(ps);
- st_set_framebuffer_surface(radeon_fb->st_framebuffer, index, ps);
- }
- st_resize_framebuffer(radeon_fb->st_framebuffer,
- dri_drawable->w,
- dri_drawable->h);
-}
-
-GLboolean radeon_context_create(const __GLcontextModes *visual,
- __DRIcontextPrivate *dri_context,
- void *shared_context)
-{
- __DRIscreenPrivate *dri_screen;
- struct radeon_context *radeon_context;
- struct radeon_screen *radeon_screen;
- struct pipe_context *pipe;
- struct st_context *shared_st_context = NULL;
-
- dri_context->driverPrivate = NULL;
- radeon_context = calloc(1, sizeof(struct radeon_context));
- if (radeon_context == NULL) {
- return GL_FALSE;
- }
-
- if (shared_context) {
- shared_st_context = ((struct radeon_context*)shared_context)->st_context;
- }
-
- dri_screen = dri_context->driScreenPriv;
- radeon_screen = dri_screen->private;
- radeon_context->dri_screen = dri_screen;
- radeon_context->radeon_screen = radeon_screen;
- radeon_context->drm_fd = dri_screen->fd;
-
- radeon_context->pipe_winsys = radeon_pipe_winsys(radeon_screen);
- if (radeon_context->pipe_winsys == NULL) {
- free(radeon_context);
- return GL_FALSE;
- }
-
- if (!getenv("RADEON_SOFTPIPE")) {
- fprintf(stderr, "Creating r300 context...\n");
- pipe =
- r300_create_context(NULL,
- radeon_context->pipe_winsys,
- radeon_create_r300_winsys(radeon_context->drm_fd));
- radeon_context->pipe_screen = pipe->screen;
- } else {
- pipe = radeon_create_softpipe(radeon_context);
- }
- radeon_context->st_context = st_create_context(pipe, visual,
- shared_st_context);
- driInitExtensions(radeon_context->st_context->ctx,
- radeon_card_extensions, GL_TRUE);
- dri_context->driverPrivate = radeon_context;
- return GL_TRUE;
-}
-
-void radeon_context_destroy(__DRIcontextPrivate *dri_context)
-{
- struct radeon_context *radeon_context;
-
- radeon_context = dri_context->driverPrivate;
- st_finish(radeon_context->st_context);
- st_destroy_context(radeon_context->st_context);
- free(radeon_context);
-}
-
-GLboolean radeon_context_bind(__DRIcontextPrivate *dri_context,
- __DRIdrawablePrivate *dri_drawable,
- __DRIdrawablePrivate *dri_readable)
-{
- struct radeon_framebuffer *drawable;
- struct radeon_framebuffer *readable;
- struct radeon_context *radeon_context;
-
- if (dri_context == NULL) {
- st_make_current(NULL, NULL, NULL);
- return GL_TRUE;
- }
-
- radeon_context = dri_context->driverPrivate;
- drawable = dri_drawable->driverPrivate;
- readable = dri_readable->driverPrivate;
- st_make_current(radeon_context->st_context,
- drawable->st_framebuffer,
- readable->st_framebuffer);
-
- radeon_update_renderbuffers(dri_context, dri_drawable);
- if (dri_drawable != dri_readable) {
- radeon_update_renderbuffers(dri_context, dri_readable);
- }
- return GL_TRUE;
-}
-
-GLboolean radeon_context_unbind(__DRIcontextPrivate *dri_context)
-{
- struct radeon_context *radeon_context;
-
- radeon_context = dri_context->driverPrivate;
- st_flush(radeon_context->st_context, PIPE_FLUSH_RENDER_CACHE, NULL);
- return GL_TRUE;
-}
diff --git a/src/gallium/winsys/drm/radeon/radeon_screen.c b/src/gallium/winsys/drm/radeon/radeon_screen.c
deleted file mode 100644
index e31caff0bf..0000000000
--- a/src/gallium/winsys/drm/radeon/radeon_screen.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright © 2008 Jérôme Glisse
- * All Rights Reserved.
- *
- * 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 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 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 COPYRIGHT HOLDERS, AUTHORS
- * AND/OR ITS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- */
-/*
- * Authors:
- * Jérôme Glisse <glisse@freedesktop.org>
- */
-#include <stdio.h>
-#include "pipe/p_screen.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_inlines.h"
-#include "pipe/p_context.h"
-#include "pipe/p_state.h"
-#include "state_tracker/st_public.h"
-#include "state_tracker/st_context.h"
-#include "utils.h"
-#include "xf86drm.h"
-#include "drm.h"
-#include "dri_util.h"
-#include "radeon_screen.h"
-#include "radeon_context.h"
-#include "radeon_buffer.h"
-#include "radeon_bo.h"
-#include "radeon_bo_gem.h"
-#include "radeon_drm.h"
-
-extern const struct dri_extension radeon_card_extensions[];
-
-static const __DRIextension *radeon_screen_extensions[] = {
- &driReadDrawableExtension,
- &driCopySubBufferExtension.base,
- &driSwapControlExtension.base,
- &driFrameTrackingExtension.base,
- &driMediaStreamCounterExtension.base,
- NULL
-};
-
-static __DRIconfig **radeon_fill_in_modes(unsigned pixel_bits,
- unsigned depth_bits,
- GLboolean have_back_buffer)
-{
- __DRIconfig **configs;
- unsigned depth_buffer_factor;
- unsigned back_buffer_factor;
- unsigned num_modes;
- GLenum fb_format;
- GLenum fb_type;
- uint8_t depth_bits_array[3];
- uint8_t stencil_bits_array[3];
- uint8_t msaa_samples_array[1];
- /* TODO: pageflipping ? */
- static const GLenum back_buffer_modes[] = {
- GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
- };
-
- stencil_bits_array[0] = 0;
- stencil_bits_array[1] = 0;
- if (depth_bits == 24) {
- stencil_bits_array[2] = 8;
- num_modes = 3;
- }
-
- depth_bits_array[0] = 0;
- depth_bits_array[1] = depth_bits;
- depth_bits_array[2] = depth_bits;
- depth_buffer_factor = (depth_bits == 24) ? 3 : 2;
-
- back_buffer_factor = (have_back_buffer) ? 3 : 1;
-
- msaa_samples_array[0] = 0;
-
- if (pixel_bits == 16) {
- fb_format = GL_RGB;
- fb_type = GL_UNSIGNED_SHORT_5_6_5;
- } else {
- fb_format = GL_BGRA;
- fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
- }
-
- configs = (__DRIconfig **)driCreateConfigs(fb_format,
- fb_type,
- depth_bits_array,
- stencil_bits_array,
- depth_buffer_factor,
- back_buffer_modes,
- back_buffer_factor,
- msaa_samples_array,
- 1);
- if (configs == NULL) {
- fprintf(stderr, "[%s:%u] Error creating FBConfig!\n",
- __FILE__, __LINE__);
- return NULL;
- }
- return configs;
-}
-
-static void radeon_screen_destroy(__DRIscreenPrivate *dri_screen)
-{
- struct radeon_screen *radeon_screen = (struct radeon_screen*)dri_screen->private;
-
- radeon_bo_manager_gem_dtor(radeon_screen->bom);
- dri_screen = NULL;
- free(radeon_screen);
-}
-
-static const __DRIconfig **radeon_screen_init(__DRIscreenPrivate *dri_screen)
-{
- struct radeon_screen *radeon_screen;
-
- /* Calling driInitExtensions here, with a NULL context pointer,
- * does not actually enable the extensions. It just makes sure
- * that all the dispatch offsets for all the extensions that
- * *might* be enables are known. This is needed because the
- * dispatch offsets need to be known when _mesa_context_create is
- * called, but we can't enable the extensions until we have a
- * context pointer.
- *
- * Hello chicken. Hello egg. How are you two today?
- */
- driInitExtensions(NULL, radeon_card_extensions, GL_FALSE);
-
- radeon_screen = calloc(1, sizeof(struct radeon_screen));
- if (radeon_screen == NULL) {
- fprintf(stderr, "\nERROR! Allocating private area failed\n");
- return NULL;
- }
- dri_screen->private = (void*)radeon_screen;
- dri_screen->extensions = radeon_screen_extensions;
- radeon_screen->dri_screen = dri_screen;
-
- radeon_screen->bom = radeon_bo_manager_gem_ctor(dri_screen->fd);
- if (radeon_screen->bom == NULL) {
- radeon_screen_destroy(dri_screen);
- return NULL;
- }
-
- return driConcatConfigs(radeon_fill_in_modes(16, 16, 1),
- radeon_fill_in_modes(32, 24, 1));
-}
-
-static boolean radeon_buffer_create(__DRIscreenPrivate *dri_screen,
- __DRIdrawablePrivate *dri_drawable,
- const __GLcontextModes *visual,
- boolean is_pixmap)
-{
- if (is_pixmap) {
- /* TODO: implement ? */
- return GL_FALSE;
- } else {
- enum pipe_format color_format, depth_format, stencil_format;
- struct radeon_framebuffer *radeon_fb;
-
- radeon_fb = calloc(1, sizeof(struct radeon_framebuffer));
- if (radeon_fb == NULL) {
- return GL_FALSE;
- }
-
- switch (visual->redBits) {
- case 5:
- color_format = PIPE_FORMAT_R5G6B5_UNORM;
- break;
- default:
- color_format = PIPE_FORMAT_A8R8G8B8_UNORM;
- break;
- }
-
- switch (visual->depthBits) {
- case 24:
- depth_format = PIPE_FORMAT_S8Z24_UNORM;
- break;
- case 16:
- depth_format = PIPE_FORMAT_Z16_UNORM;
- break;
- default:
- depth_format = PIPE_FORMAT_NONE;
- break;
- }
-
- switch (visual->stencilBits) {
- case 8:
- /* force depth format */
- depth_format = PIPE_FORMAT_S8Z24_UNORM;
- stencil_format = PIPE_FORMAT_S8Z24_UNORM;
- break;
- default:
- stencil_format = PIPE_FORMAT_NONE;
- break;
- }
-
- radeon_fb->st_framebuffer = st_create_framebuffer(visual,
- color_format,
- depth_format,
- stencil_format,
- dri_drawable->w,
- dri_drawable->h,
- (void*)radeon_fb);
- if (radeon_fb->st_framebuffer == NULL) {
- free(radeon_fb);
- return GL_FALSE;
- }
- dri_drawable->driverPrivate = (void *) radeon_fb;
-
- radeon_fb->attachments = (1 << __DRI_BUFFER_FRONT_LEFT);
- if (visual->doubleBufferMode) {
- radeon_fb->attachments |= (1 << __DRI_BUFFER_BACK_LEFT);
- }
- if (visual->depthBits || visual->stencilBits) {
- radeon_fb->attachments |= (1 << __DRI_BUFFER_DEPTH);
- }
-
- return GL_TRUE;
- }
-}
-
-static void radeon_buffer_destroy(__DRIdrawablePrivate * dri_drawable)
-{
- struct radeon_framebuffer *radeon_fb;
-
- radeon_fb = dri_drawable->driverPrivate;
- assert(radeon_fb->st_framebuffer);
- st_unreference_framebuffer(radeon_fb->st_framebuffer);
- free(radeon_fb);
-}
-
-static void radeon_swap_buffers(__DRIdrawablePrivate *dri_drawable)
-{
- struct radeon_framebuffer *radeon_fb;
- struct pipe_surface *back_surf = NULL;
-
- radeon_fb = dri_drawable->driverPrivate;
- assert(radeon_fb);
- assert(radeon_fb->st_framebuffer);
-
- st_get_framebuffer_surface(radeon_fb->st_framebuffer,
- ST_SURFACE_BACK_LEFT,
- &back_surf);
- if (back_surf) {
- st_notify_swapbuffers(radeon_fb->st_framebuffer);
- /* TODO: do we want to do anythings ? */
- st_notify_swapbuffers_complete(radeon_fb->st_framebuffer);
- }
-}
-
-/**
- * Called via glXCopySubBufferMESA() to copy a subrect of the back
- * buffer to the front buffer/screen.
- */
-static void radeon_copy_sub_buffer(__DRIdrawablePrivate *dri_drawable,
- int x, int y, int w, int h)
-{
- /* TODO: ... */
-}
-
-const struct __DriverAPIRec driDriverAPI = {
- .InitScreen = NULL,
- .DestroyScreen = radeon_screen_destroy,
- .CreateContext = radeon_context_create,
- .DestroyContext = radeon_context_destroy,
- .CreateBuffer = radeon_buffer_create,
- .DestroyBuffer = radeon_buffer_destroy,
- .SwapBuffers = radeon_swap_buffers,
- .MakeCurrent = radeon_context_bind,
- .UnbindContext = radeon_context_unbind,
- .CopySubBuffer = radeon_copy_sub_buffer,
- .InitScreen2 = radeon_screen_init,
-};
diff --git a/src/gallium/winsys/drm/radeon/radeon_screen.h b/src/gallium/winsys/drm/radeon/radeon_screen.h
deleted file mode 100644
index 01b7fa6531..0000000000
--- a/src/gallium/winsys/drm/radeon/radeon_screen.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2008 Jérôme Glisse
- * All Rights Reserved.
- *
- * 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 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 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 COPYRIGHT HOLDERS, AUTHORS
- * AND/OR ITS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- */
-/*
- * Authors:
- * Jérôme Glisse <glisse@freedesktop.org>
- */
-#ifndef RADEON_SCREEN_H
-#define RADEON_SCREEN_H
-
-#include "dri_util.h"
-#include "radeon_bo.h"
-
-struct radeon_screen {
- __DRIscreenPrivate *dri_screen;
- struct radeon_bo_manager *bom;
-};
-
-#endif
diff --git a/src/gallium/winsys/drm/radeon/xorg/Makefile b/src/gallium/winsys/drm/radeon/xorg/Makefile
new file mode 100644
index 0000000000..6ffd4a3a54
--- /dev/null
+++ b/src/gallium/winsys/drm/radeon/xorg/Makefile
@@ -0,0 +1,42 @@
+TARGET = modesetting_drv.so
+CFILES = $(wildcard ./*.c)
+OBJECTS = $(patsubst ./%.c,./%.o,$(CFILES))
+GALLIUMDIR = ../../../..
+TOP = ../../../../../..
+
+include ${TOP}/configs/current
+
+CFLAGS = -DHAVE_CONFIG_H \
+ -g -Wall -Wimplicit-function-declaration -fPIC \
+ $(shell pkg-config --cflags pixman-1 xorg-server libdrm xproto) \
+ -I${GALLIUMDIR}/include \
+ -I${GALLIUMDIR}/drivers \
+ -I${GALLIUMDIR}/auxiliary \
+ -I${TOP}/src/mesa \
+ -I$(TOP)/include \
+ -I$(TOP)/src/egl/main
+
+LIBS = \
+ $(GALLIUMDIR)/state_trackers/xorg/libxorgtracker.a \
+ $(GALLIUMDIR)/winsys/drm/radeon/core/libradeonwinsys.a \
+ $(TOP)/src/gallium/drivers/r300/libr300.a \
+ $(GALLIUM_AUXILIARIES)
+
+#############################################
+
+
+
+all default: $(TARGET)
+
+$(TARGET): $(OBJECTS) Makefile $(GALLIUMDIR)/state_trackers/xorg/libxorgtracker.a
+ $(TOP)/bin/mklib -noprefix -o $@ \
+ $(OBJECTS) $(LIBS) $(shell pkg-config --libs libdrm) -ldrm_radeon
+
+clean:
+ rm -rf $(OBJECTS) $(TARGET)
+
+install:
+ $(INSTALL) -d $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR)
+ $(INSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR)
+
+.PHONY = all clean install
diff --git a/src/gallium/winsys/drm/radeon/xorg/radeon_xorg.c b/src/gallium/winsys/drm/radeon/xorg/radeon_xorg.c
new file mode 100644
index 0000000000..6f77fbe5de
--- /dev/null
+++ b/src/gallium/winsys/drm/radeon/xorg/radeon_xorg.c
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * 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 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 TUNGSTEN GRAPHICS AND/OR ITS 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.
+ *
+ *
+ * Author: Alan Hourihane <alanh@tungstengraphics.com>
+ * Author: Jakob Bornecrantz <wallbraker@gmail.com>
+ * Author: Corbin Simpson <MostAwesomedude@gmail.com>
+ *
+ */
+
+#include "../../../../state_trackers/xorg/xorg_winsys.h"
+
+static void radeon_xorg_identify(int flags);
+static Bool radeon_xorg_pci_probe(DriverPtr driver,
+ int entity_num,
+ struct pci_device *device,
+ intptr_t match_data);
+
+static const struct pci_id_match radeon_xorg_device_match[] = {
+ {0x1002, 0x5E4D, 0xffff, 0xffff, 0, 0, 0},
+ {0x1002, 0x7249, 0xffff, 0xffff, 0, 0, 0},
+ {0, 0, 0},
+};
+
+static SymTabRec radeon_xorg_chipsets[] = {
+ {0x5E4D, "Radeon RV410 PCIE (X700)"},
+ {0x7249, "Radeon R580 PCIE (X1900 XT)"},
+ {-1, NULL}
+};
+
+static PciChipsets radeon_xorg_pci_devices[] = {
+ {0x5E4D, 0x5E4D, RES_SHARED_VGA},
+ {0x7249, 0x7249, RES_SHARED_VGA},
+ {-1, -1, RES_UNDEFINED}
+};
+
+static XF86ModuleVersionInfo radeon_xorg_version = {
+ "modesetting",
+ MODULEVENDORSTRING,
+ MODINFOSTRING1,
+ MODINFOSTRING2,
+ XORG_VERSION_CURRENT,
+ 0, 1, 0, /* major, minor, patch */
+ ABI_CLASS_VIDEODRV,
+ ABI_VIDEODRV_VERSION,
+ MOD_CLASS_VIDEODRV,
+ {0, 0, 0, 0}
+};
+
+/*
+ * Xorg driver exported structures
+ */
+
+_X_EXPORT DriverRec modesetting = {
+ 1,
+ "modesetting",
+ radeon_xorg_identify,
+ NULL,
+ xorg_tracker_available_options,
+ NULL,
+ 0,
+ NULL,
+ radeon_xorg_device_match,
+ radeon_xorg_pci_probe
+};
+
+static MODULESETUPPROTO(radeon_xorg_setup);
+
+_X_EXPORT XF86ModuleData modesettingModuleData = {
+ &radeon_xorg_version,
+ radeon_xorg_setup,
+ NULL
+};
+
+/*
+ * Xorg driver functions
+ */
+
+static pointer
+radeon_xorg_setup(pointer module, pointer opts, int *errmaj, int *errmin)
+{
+ static Bool setupDone = 0;
+
+ /* This module should be loaded only once, but check to be sure.
+ */
+ if (!setupDone) {
+ setupDone = 1;
+ xf86AddDriver(&modesetting, module, HaveDriverFuncs);
+
+ /*
+ * Tell the loader about symbols from other modules that this module
+ * might refer to.
+ */
+ xorg_tracker_loader_ref_sym_lists();
+
+ /*
+ * The return value must be non-NULL on success even though there
+ * is no TearDownProc.
+ */
+ return (pointer) 1;
+ } else {
+ if (errmaj)
+ *errmaj = LDR_ONCEONLY;
+ return NULL;
+ }
+}
+
+static void
+radeon_xorg_identify(int flags)
+{
+ xf86PrintChipsets("modesetting", "Driver for Modesetting Kernel Drivers",
+ radeon_xorg_chipsets);
+}
+
+static Bool
+radeon_xorg_pci_probe(DriverPtr driver,
+ int entity_num, struct pci_device *device, intptr_t match_data)
+{
+ ScrnInfoPtr scrn = NULL;
+ EntityInfoPtr entity;
+
+ scrn = xf86ConfigPciEntity(scrn, 0, entity_num, radeon_xorg_pci_devices,
+ NULL, NULL, NULL, NULL, NULL);
+ if (scrn != NULL) {
+ scrn->driverVersion = 1;
+ scrn->driverName = "modesetting";
+ scrn->name = "modesetting";
+ scrn->Probe = NULL;
+
+ entity = xf86GetEntityInfo(entity_num);
+
+ /* Use all the functions from the xorg tracker */
+ xorg_tracker_set_functions(scrn);
+ }
+ return scrn != NULL;
+}