util_range_add(&rbuffer->b.b, &rbuffer->b.valid_buffer_range, 0, templ->width0);
/* Convert a user pointer to a buffer. */
- rbuffer->buf = ws->buffer_from_ptr(ws, user_memory, templ->width0);
+ rbuffer->buf = ws->buffer_from_ptr(ws, user_memory, templ->width0,
+ templ->usage == PIPE_USAGE_IMMUTABLE? RADEON_FLAG_READ_ONLY : 0);
if (!rbuffer->buf) {
FREE(rbuffer);
return NULL;
buf->b.buffer_id_unique = util_idalloc_mt_alloc(&sscreen->buffer_ids);
/* Convert a user pointer to a buffer. */
- buf->buf = ws->buffer_from_ptr(ws, user_memory, templ->width0);
+ buf->buf = ws->buffer_from_ptr(ws, user_memory, templ->width0, 0);
if (!buf->buf) {
si_resource_destroy(screen, &buf->b.b);
return NULL;
* \param pointer User pointer to turn into a buffer object.
* \param Size Size in bytes for the new buffer.
*/
- struct pb_buffer *(*buffer_from_ptr)(struct radeon_winsys *ws, void *pointer, uint64_t size);
+ struct pb_buffer *(*buffer_from_ptr)(struct radeon_winsys *ws, void *pointer, uint64_t size, enum radeon_bo_flag flags);
/**
* Whether the buffer was created from a user pointer.
}
static struct pb_buffer *amdgpu_bo_from_ptr(struct radeon_winsys *rws,
- void *pointer, uint64_t size)
+ void *pointer, uint64_t size,
+ enum radeon_bo_flag flags)
{
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
amdgpu_bo_handle buf_handle;
}
static struct pb_buffer *radeon_winsys_bo_from_ptr(struct radeon_winsys *rws,
- void *pointer, uint64_t size)
+ void *pointer, uint64_t size,
+ enum radeon_bo_flag flags)
{
struct radeon_drm_winsys *ws = radeon_drm_winsys(rws);
struct drm_radeon_gem_userptr args;
memset(&args, 0, sizeof(args));
args.addr = (uintptr_t)pointer;
args.size = align(size, ws->info.gart_page_size);
- args.flags = RADEON_GEM_USERPTR_ANONONLY |
- RADEON_GEM_USERPTR_VALIDATE |
- RADEON_GEM_USERPTR_REGISTER;
+
+ if (flags & RADEON_FLAG_READ_ONLY)
+ args.flags = RADEON_GEM_USERPTR_READONLY |
+ RADEON_GEM_USERPTR_VALIDATE;
+ else
+ args.flags = RADEON_GEM_USERPTR_ANONONLY |
+ RADEON_GEM_USERPTR_REGISTER |
+ RADEON_GEM_USERPTR_VALIDATE;
+
if (drmCommandWriteRead(ws->fd, DRM_RADEON_GEM_USERPTR,
&args, sizeof(args))) {
FREE(bo);