r600g: use buffer_map/unmap from radeon_winsys

This also drops the unneeded bo_busy/wait functions.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Marek Olšák
2011-08-04 04:27:48 +02:00
parent e2e1dc9e66
commit ab630b5768
10 changed files with 23 additions and 146 deletions
+2 -1
View File
@@ -95,13 +95,14 @@ unsigned r600_get_backend_map(struct radeon *radeon);
/* r600_bo.c */
struct r600_bo;
struct radeon_winsys_cs;
struct r600_bo *r600_bo(struct radeon *radeon,
unsigned size, unsigned alignment,
unsigned binding, unsigned usage);
struct r600_bo *r600_bo_handle(struct radeon *radeon, struct winsys_handle *whandle,
unsigned *stride, unsigned *array_mode);
void *r600_bo_map(struct radeon *radeon, struct r600_bo *bo, unsigned usage, void *ctx);
void *r600_bo_map(struct radeon *radeon, struct r600_bo *bo, struct radeon_winsys_cs *cs, unsigned usage);
void r600_bo_unmap(struct radeon *radeon, struct r600_bo *bo);
boolean r600_bo_get_winsys_handle(struct radeon *radeon, struct r600_bo *pb_bo,
unsigned stride, struct winsys_handle *whandle);
+1 -1
View File
@@ -2231,7 +2231,7 @@ int r600_vertex_elements_build_fetch_shader(struct r600_pipe_context *rctx, stru
return -ENOMEM;
}
bytecode = r600_bo_map(rctx->radeon, ve->fetch_shader, 0, NULL);
bytecode = r600_bo_map(rctx->radeon, ve->fetch_shader, rctx->ctx.cs, PIPE_TRANSFER_WRITE);
if (bytecode == NULL) {
r600_bc_clear(&bc);
r600_bo_reference(rctx->radeon, &ve->fetch_shader, NULL);
+3 -4
View File
@@ -85,7 +85,7 @@ static void *r600_buffer_transfer_map(struct pipe_context *pipe,
if (rbuffer->r.b.user_ptr)
return (uint8_t*)rbuffer->r.b.user_ptr + transfer->box.x;
data = r600_bo_map(rctx->screen->radeon, rbuffer->r.bo, transfer->usage, pipe);
data = r600_bo_map(rctx->screen->radeon, rbuffer->r.bo, rctx->ctx.cs, transfer->usage);
if (!data)
return NULL;
@@ -134,9 +134,8 @@ static void r600_buffer_transfer_inline_write(struct pipe_context *pipe,
assert(rbuffer->r.b.user_ptr == NULL);
map = r600_bo_map(radeon, rbuffer->r.bo,
PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | usage,
pipe);
map = r600_bo_map(radeon, rbuffer->r.bo, rctx->ctx.cs,
PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | usage);
memcpy(map + box->x, data, box->width);
+3 -1
View File
@@ -54,6 +54,7 @@
*/
static struct r600_fence *r600_create_fence(struct r600_pipe_context *ctx)
{
struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
struct r600_fence *fence = NULL;
if (!ctx->fences.bo) {
@@ -63,7 +64,8 @@ static struct r600_fence *r600_create_fence(struct r600_pipe_context *ctx)
R600_ERR("r600: failed to create bo for fence objects\n");
return NULL;
}
ctx->fences.data = r600_bo_map(ctx->radeon, ctx->fences.bo, PIPE_TRANSFER_UNSYNCHRONIZED, NULL);
ctx->fences.data = r600_bo_map(ctx->radeon, ctx->fences.bo, rctx->ctx.cs,
PIPE_TRANSFER_UNSYNCHRONIZED | PIPE_TRANSFER_WRITE);
}
if (!LIST_IS_EMPTY(&ctx->fences.pool)) {
+1 -1
View File
@@ -86,7 +86,7 @@ static int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *s
if (shader->bo == NULL) {
return -ENOMEM;
}
ptr = (uint32_t*)r600_bo_map(rctx->radeon, shader->bo, 0, NULL);
ptr = (uint32_t*)r600_bo_map(rctx->radeon, shader->bo, rctx->ctx.cs, PIPE_TRANSFER_WRITE);
if (R600_BIG_ENDIAN) {
for (i = 0; i < rshader->bc.ndw; ++i) {
ptr[i] = bswap_32(rshader->bc.bytecode[i]);
+3 -2
View File
@@ -682,10 +682,11 @@ void r600_texture_transfer_destroy(struct pipe_context *ctx,
void* r600_texture_transfer_map(struct pipe_context *ctx,
struct pipe_transfer* transfer)
{
struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
struct r600_transfer *rtransfer = (struct r600_transfer*)transfer;
struct r600_bo *bo;
enum pipe_format format = transfer->resource->format;
struct radeon *radeon = ((struct r600_screen*)ctx->screen)->radeon;
struct radeon *radeon = rctx->screen->radeon;
unsigned offset = 0;
char *map;
@@ -704,7 +705,7 @@ void* r600_texture_transfer_map(struct pipe_context *ctx,
transfer->box.x / util_format_get_blockwidth(format) * util_format_get_blocksize(format);
}
if (!(map = r600_bo_map(radeon, bo, transfer->usage, ctx))) {
if (!(map = r600_bo_map(radeon, bo, rctx->ctx.cs, transfer->usage))) {
return NULL;
}
+3 -37
View File
@@ -107,48 +107,14 @@ struct r600_bo *r600_bo_handle(struct radeon *radeon, struct winsys_handle *whan
return bo;
}
void *r600_bo_map(struct radeon *radeon, struct r600_bo *bo, unsigned usage, void *ctx)
void *r600_bo_map(struct radeon *radeon, struct r600_bo *bo, struct radeon_winsys_cs *cs, unsigned usage)
{
struct pipe_context *pctx = ctx;
if (usage & PIPE_TRANSFER_UNSYNCHRONIZED) {
radeon_bo_map(radeon, bo->bo);
return (uint8_t *) bo->bo->data;
}
if (p_atomic_read(&bo->bo->reference.count) > 1) {
if (usage & PIPE_TRANSFER_DONTBLOCK) {
return NULL;
}
if (ctx) {
pctx->flush(pctx, NULL);
}
}
if (usage & PIPE_TRANSFER_DONTBLOCK) {
uint32_t domain;
if (radeon_bo_busy(radeon, bo->bo, &domain))
return NULL;
if (radeon_bo_map(radeon, bo->bo)) {
return NULL;
}
goto out;
}
radeon_bo_map(radeon, bo->bo);
if (radeon_bo_wait(radeon, bo->bo)) {
radeon_bo_unmap(radeon, bo->bo);
return NULL;
}
out:
return (uint8_t *) bo->bo->data;
return radeon->ws->buffer_map(bo->bo->buf, cs, usage);
}
void r600_bo_unmap(struct radeon *radeon, struct r600_bo *bo)
{
radeon_bo_unmap(radeon, bo->bo);
radeon->ws->buffer_unmap(bo->bo->buf);
}
void r600_bo_destroy(struct radeon *radeon, struct r600_bo *bo)
@@ -74,7 +74,7 @@ void r600_get_backend_mask(struct r600_context *ctx)
goto err;
/* initialize buffer with zeroes */
results = r600_bo_map(ctx->radeon, buffer, PB_USAGE_CPU_WRITE, NULL);
results = r600_bo_map(ctx->radeon, buffer, ctx->cs, PIPE_TRANSFER_WRITE);
if (results) {
memset(results, 0, ctx->max_db * 4 * 4);
r600_bo_unmap(ctx->radeon, buffer);
@@ -92,7 +92,7 @@ void r600_get_backend_mask(struct r600_context *ctx)
r600_context_flush(ctx, 0);
/* analyze results */
results = r600_bo_map(ctx->radeon, buffer, PB_USAGE_CPU_READ, NULL);
results = r600_bo_map(ctx->radeon, buffer, ctx->cs, PIPE_TRANSFER_READ);
if (results) {
for(i = 0; i < ctx->max_db; i++) {
/* at least highest bit will be set if backend is used */
@@ -1576,9 +1576,9 @@ static boolean r600_query_result(struct r600_context *ctx, struct r600_query *qu
u32 *results, *current_result;
if (wait)
results = r600_bo_map(ctx->radeon, query->buffer, PIPE_TRANSFER_READ, NULL);
results = r600_bo_map(ctx->radeon, query->buffer, ctx->cs, PIPE_TRANSFER_READ);
else
results = r600_bo_map(ctx->radeon, query->buffer, PIPE_TRANSFER_DONTBLOCK | PIPE_TRANSFER_READ, NULL);
results = r600_bo_map(ctx->radeon, query->buffer, ctx->cs, PIPE_TRANSFER_DONTBLOCK | PIPE_TRANSFER_READ);
if (!results)
return FALSE;
@@ -1646,7 +1646,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
u32 *results;
int i;
results = r600_bo_map(ctx->radeon, query->buffer, PIPE_TRANSFER_WRITE, NULL);
results = r600_bo_map(ctx->radeon, query->buffer, ctx->cs, PIPE_TRANSFER_WRITE);
if (results) {
results = (u32*)((char*)results + query->results_end);
memset(results, 0, query->result_size);
+2 -25
View File
@@ -66,8 +66,6 @@ struct radeon_bo {
struct radeon_winsys_cs_handle *cs_buf;
unsigned handle;
unsigned size;
int map_count;
void *data;
unsigned last_flush;
unsigned binding;
@@ -92,9 +90,6 @@ struct radeon_bo *radeon_bo(struct radeon *radeon, unsigned handle,
unsigned size, unsigned alignment, unsigned bind, unsigned initial_domain);
void radeon_bo_reference(struct radeon *radeon, struct radeon_bo **dst,
struct radeon_bo *src);
int radeon_bo_wait(struct radeon *radeon, struct radeon_bo *bo);
int radeon_bo_busy(struct radeon *radeon, struct radeon_bo *bo, uint32_t *domain);
int radeon_bo_fixed_map(struct radeon *radeon, struct radeon_bo *bo);
/*
* r600_hw_context.c
@@ -123,8 +118,8 @@ static INLINE unsigned r600_context_bo_reloc(struct r600_context *ctx, struct r6
assert(bo != NULL);
reloc_index =
ctx->radeon->ws->cs_add_reloc(ctx->cs, bo->cs_buf, rbo->domains, rbo->domains);
reloc_index = ctx->radeon->ws->cs_add_reloc(ctx->cs, bo->cs_buf,
rbo->domains, rbo->domains);
if (reloc_index >= ctx->creloc)
ctx->creloc = reloc_index+1;
@@ -138,22 +133,4 @@ static INLINE unsigned r600_context_bo_reloc(struct r600_context *ctx, struct r6
*/
void r600_bo_destroy(struct radeon *radeon, struct r600_bo *bo);
/*
* radeon_bo.c
*/
static inline int radeon_bo_map(struct radeon *radeon, struct radeon_bo *bo)
{
if (bo->map_count == 0 && !bo->data)
return radeon_bo_fixed_map(radeon, bo);
bo->map_count++;
return 0;
}
static inline void radeon_bo_unmap(struct radeon *radeon, struct radeon_bo *bo)
{
bo->map_count--;
assert(bo->map_count >= 0);
}
#endif
-69
View File
@@ -32,43 +32,6 @@
#include <sys/mman.h>
#include <errno.h>
int radeon_bo_fixed_map(struct radeon *radeon, struct radeon_bo *bo)
{
struct drm_radeon_gem_mmap args;
void *ptr;
int r;
/* Zero out args to make valgrind happy */
memset(&args, 0, sizeof(args));
args.handle = bo->handle;
args.offset = 0;
args.size = (uint64_t)bo->size;
r = drmCommandWriteRead(radeon->info.fd, DRM_RADEON_GEM_MMAP,
&args, sizeof(args));
if (r) {
fprintf(stderr, "error mapping %p 0x%08X (error = %d)\n",
bo, bo->handle, r);
return r;
}
ptr = mmap(0, args.size, PROT_READ|PROT_WRITE, MAP_SHARED, radeon->info.fd, args.addr_ptr);
if (ptr == MAP_FAILED) {
fprintf(stderr, "%s failed to map bo\n", __func__);
return -errno;
}
bo->data = ptr;
bo->map_count++;
return 0;
}
static void radeon_bo_fixed_unmap(struct radeon *radeon, struct radeon_bo *bo)
{
if (bo->data) {
munmap(bo->data, bo->size);
bo->data = NULL;
}
}
#include "state_tracker/drm_driver.h"
struct radeon_bo *radeon_bo(struct radeon *radeon, unsigned handle,
@@ -102,7 +65,6 @@ struct radeon_bo *radeon_bo(struct radeon *radeon, unsigned handle,
static void radeon_bo_destroy(struct radeon *radeon, struct radeon_bo *bo)
{
radeon_bo_fixed_unmap(radeon, bo);
pb_reference(&bo->buf, NULL);
FREE(bo);
}
@@ -117,34 +79,3 @@ void radeon_bo_reference(struct radeon *radeon,
}
*dst = src;
}
int radeon_bo_wait(struct radeon *radeon, struct radeon_bo *bo)
{
struct drm_radeon_gem_wait_idle args;
int ret;
/* Zero out args to make valgrind happy */
memset(&args, 0, sizeof(args));
args.handle = bo->handle;
do {
ret = drmCommandWriteRead(radeon->info.fd, DRM_RADEON_GEM_WAIT_IDLE,
&args, sizeof(args));
} while (ret == -EBUSY);
return ret;
}
int radeon_bo_busy(struct radeon *radeon, struct radeon_bo *bo, uint32_t *domain)
{
struct drm_radeon_gem_busy args;
int ret;
memset(&args, 0, sizeof(args));
args.handle = bo->handle;
args.domain = 0;
ret = drmCommandWriteRead(radeon->info.fd, DRM_RADEON_GEM_BUSY,
&args, sizeof(args));
*domain = args.domain;
return ret;
}