summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/drm/radeon/core/radeon_drm.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2010-02-22 17:26:30 +1000
committerDave Airlie <airlied@redhat.com>2010-02-22 17:26:35 +1000
commitb14548ea32000459f4f0c4b49f3fa11d1ee9c003 (patch)
treec6034ea6d6cdfb7669a11bed5b066c2345b7c48d /src/gallium/winsys/drm/radeon/core/radeon_drm.c
parentfff5be8e7b4557c221f2425dcafc2e7cbbba76ba (diff)
Revert "r300g: rebuild winsys/pipe buffer handling and add buffer map"
This reverts commit fff5be8e7b4557c221f2425dcafc2e7cbbba76ba. Probably went too soon with this, dileX reported OA not working for him it works here fine, but the optimisations I wanted aren't working properly yet so I'll fix that now. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'src/gallium/winsys/drm/radeon/core/radeon_drm.c')
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_drm.c134
1 files changed, 86 insertions, 48 deletions
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_drm.c b/src/gallium/winsys/drm/radeon/core/radeon_drm.c
index f886fda2f2..0c0e118ba3 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_drm.c
+++ b/src/gallium/winsys/drm/radeon/core/radeon_drm.c
@@ -31,22 +31,8 @@
#include "radeon_drm.h"
-static struct radeon_libdrm_winsys *
-radeon_winsys_create(int fd)
-{
- struct radeon_libdrm_winsys *rws;
-
- rws = CALLOC_STRUCT(radeon_libdrm_winsys);
- if (rws == NULL) {
- return NULL;
- }
-
- rws->fd = fd;
- return rws;
-}
-
/* Helper function to do the ioctls needed for setup and init. */
-static void do_ioctls(int fd, struct radeon_libdrm_winsys* winsys)
+static void do_ioctls(int fd, struct radeon_winsys* winsys)
{
struct drm_radeon_gem_info gem_info = {0};
struct drm_radeon_info info = {0};
@@ -137,26 +123,62 @@ struct pipe_screen* radeon_create_screen(struct drm_api* api,
int drmFB,
struct drm_create_screen_arg *arg)
{
- struct radeon_libdrm_winsys* rws;
-
- rws = radeon_winsys_create(drmFB);
- if (!rws)
- return NULL;
-
- do_ioctls(drmFB, rws);
+ struct radeon_winsys* rwinsys = radeon_pipe_winsys(drmFB);
+ do_ioctls(drmFB, rwinsys);
/* The state tracker can organize a softpipe fallback if no hw
* driver is found.
*/
- if (is_r3xx(rws->pci_id)) {
- radeon_setup_winsys(drmFB, rws);
- return r300_create_screen(&rws->base);
+ if (is_r3xx(rwinsys->pci_id)) {
+ radeon_setup_winsys(drmFB, rwinsys);
+ return r300_create_screen(rwinsys);
} else {
- FREE(rws);
+ FREE(rwinsys);
return NULL;
}
}
+
+boolean radeon_buffer_from_texture(struct drm_api* api,
+ struct pipe_screen* screen,
+ struct pipe_texture* texture,
+ struct pipe_buffer** buffer,
+ unsigned* stride)
+{
+ /* XXX fix this */
+ return r300_get_texture_buffer(screen, texture, buffer, stride);
+}
+
+/* Create a buffer from a handle. */
+/* XXX what's up with name? */
+struct pipe_buffer* radeon_buffer_from_handle(struct drm_api* api,
+ struct pipe_screen* screen,
+ const char* name,
+ unsigned handle)
+{
+ struct radeon_bo_manager* bom =
+ ((struct radeon_winsys*)screen->winsys)->priv->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;
+}
+
static struct pipe_texture*
radeon_texture_from_shared_handle(struct drm_api *api,
struct pipe_screen *screen,
@@ -165,20 +187,18 @@ radeon_texture_from_shared_handle(struct drm_api *api,
unsigned stride,
unsigned handle)
{
- struct pb_buffer *_buf;
- struct r300_winsys_buffer *buf;
+ struct pipe_buffer *buffer;
struct pipe_texture *blanket;
- struct radeon_libdrm_winsys *ws = radeon_winsys_screen(r300_winsys_screen(screen));
- _buf = radeon_drm_bufmgr_create_buffer_from_handle(ws->kman, handle);
- if (!_buf) {
- return NULL;
+ buffer = radeon_buffer_from_handle(api, screen, name, handle);
+ if (!buffer) {
+ return NULL;
}
- buf = radeon_libdrm_winsys_buffer(_buf);
- blanket = r300_texture_blanket_winsys_buffer(screen, templ, &stride, buf);
+ blanket = screen->texture_blanket(screen, templ, &stride, buffer);
+
+ pipe_buffer_reference(&buffer, NULL);
- pb_reference(&_buf, NULL);
return blanket;
}
@@ -188,14 +208,34 @@ static boolean radeon_shared_handle_from_texture(struct drm_api *api,
unsigned *stride,
unsigned *handle)
{
- struct r300_winsys_buffer *radeon_buffer;
- struct pb_buffer *_buf;
- if (!r300_get_texture_buffer(screen, texture, &radeon_buffer, stride)) {
+ int retval, fd;
+ struct drm_gem_flink flink;
+ struct radeon_pipe_buffer* radeon_buffer;
+ struct pipe_buffer *buffer = NULL;
+
+ if (!radeon_buffer_from_texture(api, screen, texture, &buffer, stride)) {
return FALSE;
}
- _buf = radeon_pb_buffer(radeon_buffer);
- return radeon_drm_bufmgr_shared_handle_from_buffer(_buf, handle);
+ radeon_buffer = (struct radeon_pipe_buffer*)buffer;
+ if (!radeon_buffer->flinked) {
+ fd = ((struct radeon_winsys*)screen->winsys)->priv->fd;
+
+ flink.handle = radeon_buffer->bo->handle;
+
+ retval = ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink);
+ if (retval) {
+ debug_printf("radeon: DRM_IOCTL_GEM_FLINK failed, error %d\n",
+ retval);
+ return FALSE;
+ }
+
+ radeon_buffer->flink = flink.name;
+ radeon_buffer->flinked = TRUE;
+ }
+
+ *handle = radeon_buffer->flink;
+ return TRUE;
}
static boolean radeon_local_handle_from_texture(struct drm_api *api,
@@ -204,18 +244,16 @@ static boolean radeon_local_handle_from_texture(struct drm_api *api,
unsigned *stride,
unsigned *handle)
{
- struct r300_winsys_buffer *radeon_buffer;
- struct pb_buffer *_buf;
-
- if (!r300_get_texture_buffer(screen, texture, &radeon_buffer, stride)) {
+ struct pipe_buffer *buffer = NULL;
+ if (!radeon_buffer_from_texture(api, screen, texture, &buffer, stride)) {
return FALSE;
}
- _buf = radeon_pb_buffer(radeon_buffer);
- *handle = radeon_drm_bufmgr_handle_from_buffer(_buf);
+ *handle = ((struct radeon_pipe_buffer*)buffer)->bo->handle;
+
+ pipe_buffer_reference(&buffer, NULL);
- pb_reference(&_buf, NULL);
- return true;
+ return TRUE;
}
static void radeon_drm_api_destroy(struct drm_api *api)