summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/drm/radeon/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/winsys/drm/radeon/core')
-rw-r--r--src/gallium/winsys/drm/radeon/core/Makefile2
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_buffer.h60
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_drm.c134
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_drm.h5
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_drm_buffer.c361
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_r300.c237
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_r300.h6
-rw-r--r--src/gallium/winsys/drm/radeon/core/radeon_winsys.h86
8 files changed, 244 insertions, 647 deletions
diff --git a/src/gallium/winsys/drm/radeon/core/Makefile b/src/gallium/winsys/drm/radeon/core/Makefile
index 13bbbf730d..860cbb6dbf 100644
--- a/src/gallium/winsys/drm/radeon/core/Makefile
+++ b/src/gallium/winsys/drm/radeon/core/Makefile
@@ -5,7 +5,7 @@ include $(TOP)/configs/current
LIBNAME = radeonwinsys
C_SOURCES = \
- radeon_drm_buffer.c \
+ radeon_buffer.c \
radeon_drm.c \
radeon_r300.c
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_buffer.h b/src/gallium/winsys/drm/radeon/core/radeon_buffer.h
index 8e0274e33d..f1c8fc2a3b 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_buffer.h
+++ b/src/gallium/winsys/drm/radeon/core/radeon_buffer.h
@@ -32,11 +32,11 @@
#include <stdio.h>
+#include "util/u_simple_screen.h"
#include "pipe/p_defines.h"
#include "util/u_inlines.h"
#include "pipebuffer/pb_buffer.h"
-#include "pipebuffer/pb_bufmgr.h"
#include "util/u_memory.h"
@@ -47,41 +47,41 @@
#include "radeon_winsys.h"
+struct radeon_pipe_buffer {
+ struct pipe_buffer base;
+ /* Pointer to GPU-backed BO. */
+ struct radeon_bo *bo;
+ /* Pointer to fallback PB buffer. */
+ struct pb_buffer *pb;
+ boolean flinked;
+ uint32_t flink;
+};
#define RADEON_MAX_BOS 24
-static INLINE struct pb_buffer *
-radeon_pb_buffer(struct r300_winsys_buffer *buffer)
-{
- return (struct pb_buffer *)buffer;
-}
+struct radeon_winsys_priv {
+ /* DRM FD */
+ int fd;
-static INLINE struct r300_winsys_buffer *
-radeon_libdrm_winsys_buffer(struct pb_buffer *buffer)
-{
- return (struct r300_winsys_buffer *)buffer;
-}
+ /* Radeon BO manager. */
+ struct radeon_bo_manager* bom;
-struct pb_manager *
-radeon_drm_bufmgr_create(struct radeon_libdrm_winsys *rws);
+ /* Radeon CS manager. */
+ struct radeon_cs_manager* csm;
-boolean radeon_drm_bufmgr_add_buffer(struct pb_buffer *_buf,
- uint32_t rd, uint32_t wd);
+ /* Current CS. */
+ struct radeon_cs* cs;
+ /* Flush CB */
+ void (*flush_cb)(void *);
+ void *flush_data;
+};
-void radeon_drm_bufmgr_write_reloc(struct pb_buffer *_buf,
- uint32_t rd, uint32_t wd,
- uint32_t flags);
-
-struct radeon_libdrm_winsys* radeon_pipe_winsys(int fd);
-
-boolean radeon_drm_bufmgr_shared_handle_from_buffer(struct pb_buffer *_buf,
- uint32_t *handle);
-uint32_t radeon_drm_bufmgr_handle_from_buffer(struct pb_buffer *_buf);
-struct pb_buffer *radeon_drm_bufmgr_create_buffer_from_handle(struct pb_manager *_mgr,
- uint32_t handle);
-
-void radeon_drm_bufmgr_set_tiling(struct pb_buffer *_buf, boolean microtiled, boolean macrotiled, uint32_t pitch);
-
-void radeon_drm_bufmgr_flush_maps(struct pb_manager *_mgr);
+struct radeon_winsys* radeon_pipe_winsys(int fb);
+#if 0
+struct pipe_surface *radeon_surface_from_handle(struct radeon_context *radeon_context,
+ uint32_t handle,
+ enum pipe_format format,
+ int w, int h, int pitch);
+#endif
#endif
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)
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_drm.h b/src/gallium/winsys/drm/radeon/core/radeon_drm.h
index 2f55061330..8d74cbafc2 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_drm.h
+++ b/src/gallium/winsys/drm/radeon/core/radeon_drm.h
@@ -59,6 +59,11 @@ boolean radeon_buffer_from_texture(struct drm_api* api,
struct pipe_buffer** buffer,
unsigned* stride);
+struct pipe_buffer* radeon_buffer_from_handle(struct drm_api* api,
+ struct pipe_screen* screen,
+ const char* name,
+ unsigned handle);
+
boolean radeon_handle_from_buffer(struct drm_api* api,
struct pipe_screen* screen,
struct pipe_buffer* buffer,
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_drm_buffer.c b/src/gallium/winsys/drm/radeon/core/radeon_drm_buffer.c
deleted file mode 100644
index 5f2fd2d7fc..0000000000
--- a/src/gallium/winsys/drm/radeon/core/radeon_drm_buffer.c
+++ /dev/null
@@ -1,361 +0,0 @@
-
-#include "radeon_drm.h"
-#include "radeon_bo_gem.h"
-#include "radeon_cs_gem.h"
-
-#include "util/u_inlines.h"
-#include "util/u_memory.h"
-#include "util/u_simple_list.h"
-#include "pipebuffer/pb_buffer.h"
-#include "pipebuffer/pb_bufmgr.h"
-
-#include "radeon_winsys.h"
-struct radeon_drm_bufmgr;
-
-struct radeon_drm_buffer {
- struct pb_buffer base;
- struct radeon_drm_bufmgr *mgr;
-
- struct radeon_bo *bo;
-
- boolean flinked;
- uint32_t flink;
-
- boolean mapped;
- struct radeon_drm_buffer *next, *prev;
-};
-
-extern const struct pb_vtbl radeon_drm_buffer_vtbl;
-
-
-static INLINE struct radeon_drm_buffer *
-radeon_drm_buffer(struct pb_buffer *buf)
-{
- assert(buf);
- assert(buf->vtbl == &radeon_drm_buffer_vtbl);
- return (struct radeon_drm_buffer *)buf;
-}
-
-struct radeon_drm_bufmgr {
- struct pb_manager base;
- struct radeon_libdrm_winsys *rws;
- struct radeon_drm_buffer buffer_map_list;
-};
-
-static INLINE struct radeon_drm_bufmgr *
-radeon_drm_bufmgr(struct pb_manager *mgr)
-{
- assert(mgr);
- return (struct radeon_drm_bufmgr *)mgr;
-}
-
-static void
-radeon_drm_buffer_destroy(struct pb_buffer *_buf)
-{
- struct radeon_drm_buffer *buf = radeon_drm_buffer(_buf);
-
- if (buf->mapped) {
- remove_from_list(buf);
- radeon_bo_unmap(buf->bo);
- buf->mapped = false;
- }
- radeon_bo_unref(buf->bo);
-
- FREE(buf);
-}
-
-static void *
-radeon_drm_buffer_map(struct pb_buffer *_buf,
- unsigned flags)
-{
- struct radeon_drm_buffer *buf = radeon_drm_buffer(_buf);
- int write;
-
- if (flags & PIPE_BUFFER_USAGE_DONTBLOCK) {
- uint32_t domain;
-
- if (radeon_bo_is_busy(buf->bo, &domain))
- return NULL;
- }
-
- if (radeon_bo_is_referenced_by_cs(buf->bo, buf->mgr->rws->cs)) {
- buf->mgr->rws->flush_cb(buf->mgr->rws->flush_data);
- }
-
- if (buf->mapped)
- return buf->bo->ptr;
-
- if (flags & PIPE_BUFFER_USAGE_CPU_WRITE) {
- write = 1;
- }
-
- if (radeon_bo_map(buf->bo, write)) {
- return NULL;
- }
- buf->mapped = true;
- insert_at_tail(&buf->mgr->buffer_map_list, buf);
- return buf->bo->ptr;
-}
-
-static void
-radeon_drm_buffer_unmap(struct pb_buffer *_buf)
-{
- (void)_buf;
-}
-
-static void
-radeon_drm_buffer_get_base_buffer(struct pb_buffer *buf,
- struct pb_buffer **base_buf,
- unsigned *offset)
-{
- *base_buf = buf;
- *offset = 0;
-}
-
-
-static enum pipe_error
-radeon_drm_buffer_validate(struct pb_buffer *_buf,
- struct pb_validate *vl,
- unsigned flags)
-{
- /* Always pinned */
- return PIPE_OK;
-}
-
-static void
-radeon_drm_buffer_fence(struct pb_buffer *buf,
- struct pipe_fence_handle *fence)
-{
-}
-
-const struct pb_vtbl radeon_drm_buffer_vtbl = {
- radeon_drm_buffer_destroy,
- radeon_drm_buffer_map,
- radeon_drm_buffer_unmap,
- radeon_drm_buffer_validate,
- radeon_drm_buffer_fence,
- radeon_drm_buffer_get_base_buffer,
-};
-
-
-static uint32_t radeon_domain_from_usage(unsigned usage)
-{
- uint32_t domain = 0;
-
- if (usage & PIPE_BUFFER_USAGE_GPU_WRITE) {
- domain |= RADEON_GEM_DOMAIN_VRAM;
- }
- if (usage & PIPE_BUFFER_USAGE_PIXEL) {
- domain |= RADEON_GEM_DOMAIN_VRAM;
- }
- if (usage & PIPE_BUFFER_USAGE_VERTEX) {
- domain |= RADEON_GEM_DOMAIN_GTT;
- }
- if (usage & PIPE_BUFFER_USAGE_INDEX) {
- domain |= RADEON_GEM_DOMAIN_GTT;
- }
-
- return domain;
-}
-
-struct pb_buffer *radeon_drm_bufmgr_create_buffer_from_handle(struct pb_manager *_mgr,
- uint32_t handle)
-{
- struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
- struct radeon_libdrm_winsys *rws = mgr->rws;
- struct radeon_drm_buffer *buf;
- struct radeon_bo *bo;
-
- bo = radeon_bo_open(rws->bom, handle, 0,
- 0, 0, 0);
- if (bo == NULL)
- return NULL;
-
- buf = CALLOC_STRUCT(radeon_drm_buffer);
- if (!buf) {
- radeon_bo_unref(bo);
- return NULL;
- }
-
- make_empty_list(buf);
-
- pipe_reference_init(&buf->base.base.reference, 1);
- buf->base.base.alignment = 0;
- buf->base.base.usage = PIPE_BUFFER_USAGE_PIXEL;
- buf->base.base.size = 0;
- buf->base.vtbl = &radeon_drm_buffer_vtbl;
- buf->mgr = mgr;
-
- buf->bo = bo;
-
- // fprintf(stderr,"hand %p : %d\n", &buf->base, handle);
- return &buf->base;
-
-}
-
-static struct pb_buffer *
-radeon_drm_bufmgr_create_buffer(struct pb_manager *_mgr,
- pb_size size,
- const struct pb_desc *desc)
-{
- struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
- struct radeon_libdrm_winsys *rws = mgr->rws;
- struct radeon_drm_buffer *buf;
- uint32_t domain;
-
- buf = CALLOC_STRUCT(radeon_drm_buffer);
- if (!buf)
- goto error1;
-
- pipe_reference_init(&buf->base.base.reference, 1);
- buf->base.base.alignment = desc->alignment;
- buf->base.base.usage = desc->usage;
- buf->base.base.size = size;
- buf->base.vtbl = &radeon_drm_buffer_vtbl;
- buf->mgr = mgr;
-
- make_empty_list(buf);
- domain = radeon_domain_from_usage(desc->usage);
- buf->bo = radeon_bo_open(rws->bom, 0, size,
- desc->alignment, domain, 0);
- if (buf->bo == NULL)
- goto error2;
-
- // fprintf(stderr,"%p : %d\n", &buf->base, size);
- return &buf->base;
-
- error2:
- FREE(buf);
- error1:
- return NULL;
-}
-
-static void
-radeon_drm_bufmgr_flush(struct pb_manager *mgr)
-{
- /* NOP */
-}
-
-static void
-radeon_drm_bufmgr_destroy(struct pb_manager *_mgr)
-{
- struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
- FREE(mgr);
-}
-
-struct pb_manager *
-radeon_drm_bufmgr_create(struct radeon_libdrm_winsys *rws)
-{
- struct radeon_drm_bufmgr *mgr;
-
- mgr = CALLOC_STRUCT(radeon_drm_bufmgr);
- if (!mgr)
- return NULL;
-
- mgr->base.destroy = radeon_drm_bufmgr_destroy;
- mgr->base.create_buffer = radeon_drm_bufmgr_create_buffer;
- mgr->base.flush = radeon_drm_bufmgr_flush;
-
- mgr->rws = rws;
- make_empty_list(&mgr->buffer_map_list);
- return &mgr->base;
-}
-
-uint32_t radeon_drm_bufmgr_handle_from_buffer(struct pb_buffer *_buf)
-{
- struct radeon_drm_buffer *buf = radeon_drm_buffer(_buf);
-
- return buf->bo->handle;
-}
-
-boolean radeon_drm_bufmgr_shared_handle_from_buffer(struct pb_buffer *_buf,
- uint32_t *handle)
-{
- struct radeon_drm_buffer *buf = radeon_drm_buffer(_buf);
- struct drm_gem_flink flink;
- int retval, fd;
- if (!buf->flinked) {
- fd = buf->mgr->rws->fd;
- flink.handle = buf->bo->handle;
-
- retval = ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink);
- if (retval) {
- return false;
- }
-
- buf->flinked = TRUE;
- buf->flink = flink.name;
- }
- *handle = buf->flink;
- return TRUE;
-}
-
-static struct radeon_drm_buffer *get_drm_buffer(struct pb_buffer *_buf)
-{
- struct radeon_drm_buffer *buf;
- if (_buf->vtbl == &radeon_drm_buffer_vtbl) {
- buf = radeon_drm_buffer(_buf);
- } else {
- struct pb_buffer *base_buf;
- pb_size offset;
- pb_get_base_buffer(_buf, &base_buf, &offset);
-
- buf = radeon_drm_buffer(base_buf);
- }
- return buf;
-}
-
-void radeon_drm_bufmgr_set_tiling(struct pb_buffer *_buf, boolean microtiled, boolean macrotiled, uint32_t pitch)
-{
- struct radeon_drm_buffer *buf = get_drm_buffer(_buf);
- uint32_t flags = 0;
-
- if (microtiled)
- flags |= RADEON_BO_FLAGS_MICRO_TILE;
- if (macrotiled)
- flags |= RADEON_BO_FLAGS_MACRO_TILE;
-
- radeon_bo_set_tiling(buf->bo, flags, pitch);
-
-}
-
-boolean radeon_drm_bufmgr_add_buffer(struct pb_buffer *_buf,
- uint32_t rd, uint32_t wd)
-{
- struct radeon_drm_buffer *buf = get_drm_buffer(_buf);
- radeon_cs_space_add_persistent_bo(buf->mgr->rws->cs, buf->bo,
- rd, wd);
-
- return true;
-}
-
-void radeon_drm_bufmgr_write_reloc(struct pb_buffer *_buf,
- uint32_t rd, uint32_t wd,
- uint32_t flags)
-{
- struct radeon_drm_buffer *buf = get_drm_buffer(_buf);
- int retval;
-
- retval = radeon_cs_write_reloc(buf->mgr->rws->cs,
- buf->bo, rd, wd, flags);
- if (retval) {
- debug_printf("radeon: Relocation of %p (%d, %d, %d) failed!\n",
- buf, rd, wd, flags);
- }
-}
-
-void radeon_drm_bufmgr_flush_maps(struct pb_manager *_mgr)
-{
- struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
- struct radeon_drm_buffer *rpb, *t_rpb;
-
- foreach_s(rpb, t_rpb, &mgr->buffer_map_list) {
- rpb->mapped = 0;
- radeon_bo_unmap(rpb->bo);
- remove_from_list(rpb);
- }
-
- make_empty_list(&mgr->buffer_map_list);
-
-
-}
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_r300.c b/src/gallium/winsys/drm/radeon/core/radeon_r300.c
index 997abb8f5c..d759beaba1 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_r300.c
+++ b/src/gallium/winsys/drm/radeon/core/radeon_r300.c
@@ -22,104 +22,29 @@
#include "radeon_r300.h"
-static struct r300_winsys_buffer *
-radeon_r300_winsys_buffer_create(struct r300_winsys_screen *rws,
- unsigned alignment,
- unsigned usage,
- unsigned size)
-{
- struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
- struct pb_desc desc;
- struct pb_manager *provider;
- struct pb_buffer *buffer;
-
- memset(&desc, 0, sizeof(desc));
- desc.alignment = alignment;
- desc.usage = usage;
-
- if (usage == PIPE_BUFFER_USAGE_CONSTANT)
- provider = ws->mman;
- else if (usage == PIPE_BUFFER_USAGE_VERTEX ||
- usage == PIPE_BUFFER_USAGE_INDEX)
- provider = ws->cman;
- else
- provider = ws->kman;
- buffer = provider->create_buffer(provider, size, &desc);
- if (!buffer)
- return NULL;
-
- return radeon_libdrm_winsys_buffer(buffer);
-}
-
-static void radeon_r300_winsys_buffer_destroy(struct r300_winsys_buffer *buf)
-{
- struct pb_buffer *_buf = radeon_pb_buffer(buf);
-
- pb_destroy(_buf);
-}
-static void radeon_r300_winsys_buffer_set_tiling(struct r300_winsys_screen *rws,
- struct r300_winsys_buffer *buf,
- uint32_t pitch,
- boolean microtiled,
- boolean macrotiled)
-{
- struct pb_buffer *_buf = radeon_pb_buffer(buf);
- radeon_drm_bufmgr_set_tiling(_buf, microtiled, macrotiled, pitch);
-}
-
-static void *radeon_r300_winsys_buffer_map(struct r300_winsys_screen *ws,
- struct r300_winsys_buffer *buf,
- unsigned usage)
-{
- struct pb_buffer *_buf = radeon_pb_buffer(buf);
-
- return pb_map(_buf, 0);
-}
-
-static void radeon_r300_winsys_buffer_unmap(struct r300_winsys_screen *ws,
- struct r300_winsys_buffer *buf)
-{
- struct pb_buffer *_buf = radeon_pb_buffer(buf);
-
- pb_unmap(_buf);
-}
-
-static void radeon_r300_winsys_buffer_reference(struct r300_winsys_screen *rws,
- struct r300_winsys_buffer **pdst,
- struct r300_winsys_buffer *src)
-{
- struct pb_buffer *_src = radeon_pb_buffer(src);
- struct pb_buffer *_dst = radeon_pb_buffer(*pdst);
-
- pb_reference(&_dst, _src);
-
- *pdst = radeon_libdrm_winsys_buffer(_dst);
-}
-
-static void radeon_set_flush_cb(struct r300_winsys_screen *rws,
+static void radeon_set_flush_cb(struct radeon_winsys *winsys,
void (*flush_cb)(void *),
void *data)
{
- struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
- ws->flush_cb = flush_cb;
- ws->flush_data = data;
- radeon_cs_space_set_flush(ws->cs, flush_cb, data);
+ winsys->priv->flush_cb = flush_cb;
+ winsys->priv->flush_data = data;
+ radeon_cs_space_set_flush(winsys->priv->cs, flush_cb, data);
}
-static boolean radeon_add_buffer(struct r300_winsys_screen *rws,
- struct r300_winsys_buffer *buf,
+static boolean radeon_add_buffer(struct radeon_winsys* winsys,
+ struct pipe_buffer* pbuffer,
uint32_t rd,
uint32_t wd)
{
- struct pb_buffer *_buf = radeon_pb_buffer(buf);
+ struct radeon_bo* bo = ((struct radeon_pipe_buffer*)pbuffer)->bo;
- return radeon_drm_bufmgr_add_buffer(_buf, rd, wd);
+ radeon_cs_space_add_persistent_bo(winsys->priv->cs, bo, rd, wd);
+ return TRUE;
}
-static boolean radeon_validate(struct r300_winsys_screen *rws)
+static boolean radeon_validate(struct radeon_winsys* winsys)
{
- struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
- if (radeon_cs_space_check(ws->cs) < 0) {
+ if (radeon_cs_space_check(winsys->priv->cs) < 0) {
return FALSE;
}
@@ -127,146 +52,108 @@ static boolean radeon_validate(struct r300_winsys_screen *rws)
return TRUE;
}
-static boolean radeon_check_cs(struct r300_winsys_screen *rws, int size)
+static boolean radeon_check_cs(struct radeon_winsys* winsys, int size)
{
- struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
- struct radeon_cs *cs = ws->cs;
+ struct radeon_cs* cs = winsys->priv->cs;
- return radeon_validate(rws) && cs->cdw + size <= cs->ndw;
+ return radeon_validate(winsys) && cs->cdw + size <= cs->ndw;
}
-static void radeon_begin_cs(struct r300_winsys_screen *rws,
+static void radeon_begin_cs(struct radeon_winsys* winsys,
int size,
const char* file,
const char* function,
int line)
{
- struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
- radeon_cs_begin(ws->cs, size, file, function, line);
+ radeon_cs_begin(winsys->priv->cs, size, file, function, line);
}
-static void radeon_write_cs_dword(struct r300_winsys_screen *rws,
+static void radeon_write_cs_dword(struct radeon_winsys* winsys,
uint32_t dword)
{
- struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
- radeon_cs_write_dword(ws->cs, dword);
+ radeon_cs_write_dword(winsys->priv->cs, dword);
}
-static void radeon_write_cs_reloc(struct r300_winsys_screen *rws,
- struct r300_winsys_buffer *buf,
+static void radeon_write_cs_reloc(struct radeon_winsys* winsys,
+ struct pipe_buffer* pbuffer,
uint32_t rd,
uint32_t wd,
uint32_t flags)
{
- struct pb_buffer *_buf = radeon_pb_buffer(buf);
- radeon_drm_bufmgr_write_reloc(_buf, rd, wd, flags);
+ int retval = 0;
+ struct radeon_pipe_buffer* radeon_buffer =
+ (struct radeon_pipe_buffer*)pbuffer;
+
+ assert(!radeon_buffer->pb);
+
+ retval = radeon_cs_write_reloc(winsys->priv->cs, radeon_buffer->bo,
+ rd, wd, flags);
+
+ if (retval) {
+ debug_printf("radeon: Relocation of %p (%d, %d, %d) failed!\n",
+ pbuffer, rd, wd, flags);
+ }
}
-static void radeon_reset_bos(struct r300_winsys_screen *rws)
+static void radeon_reset_bos(struct radeon_winsys *winsys)
{
- struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
- radeon_cs_space_reset_bos(ws->cs);
+ radeon_cs_space_reset_bos(winsys->priv->cs);
}
-static void radeon_end_cs(struct r300_winsys_screen *rws,
+static void radeon_end_cs(struct radeon_winsys* winsys,
const char* file,
const char* function,
int line)
{
- struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
- radeon_cs_end(ws->cs, file, function, line);
+ radeon_cs_end(winsys->priv->cs, file, function, line);
}
-static void radeon_flush_cs(struct r300_winsys_screen *rws)
+static void radeon_flush_cs(struct radeon_winsys* winsys)
{
- struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
int retval;
/* Don't flush a zero-sized CS. */
- if (!ws->cs->cdw) {
+ if (!winsys->priv->cs->cdw) {
return;
}
- radeon_drm_bufmgr_flush_maps(ws->kman);
/* Emit the CS. */
- retval = radeon_cs_emit(ws->cs);
+ retval = radeon_cs_emit(winsys->priv->cs);
if (retval) {
debug_printf("radeon: Bad CS, dumping...\n");
- radeon_cs_print(ws->cs, stderr);
+ radeon_cs_print(winsys->priv->cs, stderr);
}
/* Reset CS.
* Someday, when we care about performance, we should really find a way
* to rotate between two or three CS objects so that the GPU can be
* spinning through one CS while another one is being filled. */
- radeon_cs_erase(ws->cs);
-}
-
-static uint32_t radeon_get_value(struct r300_winsys_screen *rws,
- enum r300_value_id id)
-{
- struct radeon_libdrm_winsys *ws = (struct radeon_libdrm_winsys *)rws;
-
- switch(id) {
- case R300_VID_PCI_ID:
- return ws->pci_id;
- case R300_VID_GB_PIPES:
- return ws->gb_pipes;
- case R300_VID_Z_PIPES:
- return ws->z_pipes;
- }
- return 0;
-}
-
-static void
-radeon_winsys_destroy(struct r300_winsys_screen *rws)
-{
- struct radeon_libdrm_winsys *ws = (struct radeon_libdrm_winsys *)rws;
- radeon_cs_destroy(ws->cs);
-
- ws->cman->destroy(ws->cman);
- ws->kman->destroy(ws->kman);
- ws->mman->destroy(ws->mman);
-
- radeon_bo_manager_gem_dtor(ws->bom);
- radeon_cs_manager_gem_dtor(ws->csm);
+ radeon_cs_erase(winsys->priv->cs);
}
void
-radeon_setup_winsys(int fd, struct radeon_libdrm_winsys* ws)
+radeon_setup_winsys(int fd, struct radeon_winsys* winsys)
{
- ws->csm = radeon_cs_manager_gem_ctor(fd);
-
- ws->bom = radeon_bo_manager_gem_ctor(fd);
- ws->kman = radeon_drm_bufmgr_create(ws);
+ struct radeon_winsys_priv* priv = winsys->priv;
- ws->cman = pb_cache_manager_create(ws->kman, 100000);
- ws->mman = pb_malloc_bufmgr_create();
+ priv->csm = radeon_cs_manager_gem_ctor(fd);
/* Size limit on IBs is 64 kibibytes. */
- ws->cs = radeon_cs_create(ws->csm, 1024 * 64 / 4);
- radeon_cs_set_limit(ws->cs,
- RADEON_GEM_DOMAIN_GTT, ws->gart_size);
- radeon_cs_set_limit(ws->cs,
- RADEON_GEM_DOMAIN_VRAM, ws->vram_size);
-
- ws->base.add_buffer = radeon_add_buffer;
- ws->base.validate = radeon_validate;
- ws->base.destroy = radeon_winsys_destroy;
- ws->base.check_cs = radeon_check_cs;
- ws->base.begin_cs = radeon_begin_cs;
- ws->base.write_cs_dword = radeon_write_cs_dword;
- ws->base.write_cs_reloc = radeon_write_cs_reloc;
- ws->base.end_cs = radeon_end_cs;
- ws->base.flush_cs = radeon_flush_cs;
- ws->base.reset_bos = radeon_reset_bos;
- ws->base.set_flush_cb = radeon_set_flush_cb;
- ws->base.get_value = radeon_get_value;
-
- ws->base.buffer_create = radeon_r300_winsys_buffer_create;
- ws->base.buffer_destroy = radeon_r300_winsys_buffer_destroy;
- ws->base.buffer_set_tiling = radeon_r300_winsys_buffer_set_tiling;
- ws->base.buffer_map = radeon_r300_winsys_buffer_map;
- ws->base.buffer_unmap = radeon_r300_winsys_buffer_unmap;
- ws->base.buffer_reference = radeon_r300_winsys_buffer_reference;
+ priv->cs = radeon_cs_create(priv->csm, 1024 * 64 / 4);
+ radeon_cs_set_limit(priv->cs,
+ RADEON_GEM_DOMAIN_GTT, winsys->gart_size);
+ radeon_cs_set_limit(priv->cs,
+ RADEON_GEM_DOMAIN_VRAM, winsys->vram_size);
+
+ winsys->add_buffer = radeon_add_buffer;
+ winsys->validate = radeon_validate;
+
+ winsys->check_cs = radeon_check_cs;
+ winsys->begin_cs = radeon_begin_cs;
+ winsys->write_cs_dword = radeon_write_cs_dword;
+ winsys->write_cs_reloc = radeon_write_cs_reloc;
+ winsys->end_cs = radeon_end_cs;
+ winsys->flush_cs = radeon_flush_cs;
+ winsys->reset_bos = radeon_reset_bos;
+ winsys->set_flush_cb = radeon_set_flush_cb;
}
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_r300.h b/src/gallium/winsys/drm/radeon/core/radeon_r300.h
index 82a8aad715..cfbdb30266 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_r300.h
+++ b/src/gallium/winsys/drm/radeon/core/radeon_r300.h
@@ -28,12 +28,12 @@
#include <stdlib.h>
#include "drm.h"
#include "radeon_drm.h"
-#include "radeon_bo_gem.h"
#include "radeon_cs_gem.h"
-#include "radeon_winsys.h"
+#include "r300_winsys.h"
+
#include "radeon_buffer.h"
-void radeon_setup_winsys(int fd, struct radeon_libdrm_winsys* winsys);
+void radeon_setup_winsys(int fd, struct radeon_winsys* winsys);
#endif /* RADEON_R300_H */
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_winsys.h b/src/gallium/winsys/drm/radeon/core/radeon_winsys.h
index c8e725cff0..4901080ca7 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_winsys.h
+++ b/src/gallium/winsys/drm/radeon/core/radeon_winsys.h
@@ -30,17 +30,16 @@
#ifndef RADEON_WINSYS_H
#define RADEON_WINSYS_H
-#include "r300_winsys.h"
+#include "util/u_simple_screen.h"
-struct radeon_libdrm_winsys {
- /* Parent class. */
- struct r300_winsys_screen base;
-
- struct pb_manager *kman;
+struct radeon_winsys_priv;
- struct pb_manager *mman;
+struct radeon_winsys {
+ /* Parent class. */
+ struct pipe_winsys base;
- struct pb_manager *cman;
+ /* Winsys private */
+ struct radeon_winsys_priv* priv;
/* PCI ID */
uint32_t pci_id;
@@ -57,27 +56,56 @@ struct radeon_libdrm_winsys {
/* VRAM size. */
uint32_t vram_size;
- /* DRM FD */
- int fd;
-
- /* Radeon BO manager. */
- struct radeon_bo_manager *bom;
-
- /* Radeon CS manager. */
- struct radeon_cs_manager *csm;
-
- /* Current CS. */
- struct radeon_cs *cs;
-
- /* Flush CB */
- void (*flush_cb)(void *);
- void *flush_data;
+ /* Add a pipe_buffer to the list of buffer objects to validate. */
+ boolean (*add_buffer)(struct radeon_winsys* winsys,
+ struct pipe_buffer* pbuffer,
+ uint32_t rd,
+ uint32_t wd);
+
+ /* Revalidate all currently setup pipe_buffers.
+ * Returns TRUE if a flush is required. */
+ boolean (*validate)(struct radeon_winsys* winsys);
+
+ /* Check to see if there's room for commands. */
+ boolean (*check_cs)(struct radeon_winsys* winsys, int size);
+
+ /* Start a command emit. */
+ void (*begin_cs)(struct radeon_winsys* winsys,
+ int size,
+ const char* file,
+ const char* function,
+ int line);
+
+ /* Write a dword to the command buffer. */
+ void (*write_cs_dword)(struct radeon_winsys* winsys, uint32_t dword);
+
+ /* Write a relocated dword to the command buffer. */
+ void (*write_cs_reloc)(struct radeon_winsys* winsys,
+ struct pipe_buffer* bo,
+ uint32_t rd,
+ uint32_t wd,
+ uint32_t flags);
+
+ /* Finish a command emit. */
+ void (*end_cs)(struct radeon_winsys* winsys,
+ const char* file,
+ const char* function,
+ int line);
+
+ /* Flush the CS. */
+ void (*flush_cs)(struct radeon_winsys* winsys);
+
+ /* winsys flush - callback from winsys when flush required */
+ void (*set_flush_cb)(struct radeon_winsys *winsys,
+ void (*flush_cb)(void *), void *data);
+
+ void (*reset_bos)(struct radeon_winsys *winsys);
+
+ void (*buffer_set_tiling)(struct radeon_winsys* winsys,
+ struct pipe_buffer* buffer,
+ uint32_t pitch,
+ boolean microtiled,
+ boolean macrotiled);
};
-static INLINE struct radeon_libdrm_winsys *
-radeon_winsys_screen(struct r300_winsys_screen *base)
-{
- return (struct radeon_libdrm_winsys *)base;
-}
-
#endif