This also drops the unneeded bo_busy/wait functions.
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
/* 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);
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);
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;
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);
*/
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) {
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)) {
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]);
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;
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;
}
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)
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);
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 */
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;
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);
struct radeon_winsys_cs_handle *cs_buf;
unsigned handle;
unsigned size;
- int map_count;
- void *data;
unsigned last_flush;
unsigned binding;
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
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;
*/
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
#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,
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);
}
}
*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;
-}