Commit 8b587ee7 authored by Marek Olšák's avatar Marek Olšák

gallium: add interface and state tracker support for GL_AMD_pinned_memory

v2: add alignment restrictions to docs, fix indentation in headers
Reviewed-by: Christian König's avatarChristian König <christian.koenig@amd.com>
parent 11ebb03c
......@@ -246,6 +246,12 @@ The integer capabilities:
* ``PIPE_CAP_MULTISAMPLE_Z_RESOLVE``: Whether the driver supports blitting
a multisampled depth buffer into a single-sampled texture (or depth buffer).
Only the first sampled should be copied.
* ``PIPE_CAP_RESOURCE_FROM_USER_MEMORY``: Whether the driver can create
a pipe_resource where an already-existing piece of (malloc'd) user memory
is used as its backing storage. In other words, whether the driver can map
existing user memory into the device address space for direct device access.
The create function is pipe_screen::resource_from_user_memory. The address
and size must be page-aligned.
.. _pipe_capf:
......
......@@ -229,6 +229,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
case PIPE_CAP_VERTEXID_NOBASE:
case PIPE_CAP_POLYGON_OFFSET_CLAMP:
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return 0;
case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
......
......@@ -471,6 +471,7 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
case PIPE_CAP_SAMPLER_VIEW_TARGET:
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return 0;
case PIPE_CAP_VENDOR_ID:
......
......@@ -288,6 +288,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_POLYGON_OFFSET_CLAMP:
return 1;
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return 0;
}
/* should only get here on unhandled cases */
......
......@@ -160,6 +160,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_VERTEXID_NOBASE:
case PIPE_CAP_POLYGON_OFFSET_CLAMP:
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return 0;
case PIPE_CAP_VENDOR_ID:
......
......@@ -208,6 +208,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_DRAW_INDIRECT:
case PIPE_CAP_VERTEXID_NOBASE:
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE: /* potentially supported on some hw */
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return 0;
case PIPE_CAP_VENDOR_ID:
......
......@@ -192,6 +192,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_FAKE_SW_MSAA:
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
case PIPE_CAP_VERTEXID_NOBASE:
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return 0;
case PIPE_CAP_VENDOR_ID:
......
......@@ -184,6 +184,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
case PIPE_CAP_VERTEXID_NOBASE:
case PIPE_CAP_POLYGON_OFFSET_CLAMP:
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return 0;
/* SWTCL-only features. */
......
......@@ -236,6 +236,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_POLYGON_OFFSET_CLAMP:
return 0;
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return 0;
}
/* should only get here on unhandled cases */
......
......@@ -307,6 +307,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
/* XXX: Query the host ? */
return 1;
case PIPE_CAP_UMA:
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return 0;
}
......
......@@ -172,6 +172,7 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_VERTEXID_NOBASE:
case PIPE_CAP_POLYGON_OFFSET_CLAMP:
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return 0;
/* Stream output. */
......
......@@ -575,6 +575,7 @@ enum pipe_cap {
PIPE_CAP_VERTEXID_NOBASE = 112,
PIPE_CAP_POLYGON_OFFSET_CLAMP = 113,
PIPE_CAP_MULTISAMPLE_Z_RESOLVE = 114,
PIPE_CAP_RESOURCE_FROM_USER_MEMORY = 115,
};
#define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
......
......@@ -163,6 +163,14 @@ struct pipe_screen {
const struct pipe_resource *templat,
struct winsys_handle *handle);
/**
* Create a resource from user memory. This maps the user memory into
* the device address space.
*/
struct pipe_resource * (*resource_from_user_memory)(struct pipe_screen *,
const struct pipe_resource *t,
void *user_memory);
/**
* Get a winsys_handle from a texture. Some platforms/winsys requires
* that the texture is created with a special usage flag like
......
......@@ -186,7 +186,8 @@ st_bufferobj_data(struct gl_context *ctx,
struct st_buffer_object *st_obj = st_buffer_object(obj);
unsigned bind, pipe_usage, pipe_flags = 0;
if (size && data && st_obj->buffer &&
if (target != GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD &&
size && data && st_obj->buffer &&
st_obj->Base.Size == size &&
st_obj->Base.Usage == usage &&
st_obj->Base.StorageFlags == storageFlags) {
......@@ -287,6 +288,7 @@ st_bufferobj_data(struct gl_context *ctx,
}
if (size != 0) {
struct pipe_screen *screen = pipe->screen;
struct pipe_resource buffer;
memset(&buffer, 0, sizeof buffer);
......@@ -300,16 +302,22 @@ st_bufferobj_data(struct gl_context *ctx,
buffer.depth0 = 1;
buffer.array_size = 1;
st_obj->buffer = pipe->screen->resource_create(pipe->screen, &buffer);
if (target == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD) {
st_obj->buffer =
screen->resource_from_user_memory(screen, &buffer, (void*)data);
}
else {
st_obj->buffer = screen->resource_create(screen, &buffer);
if (st_obj->buffer && data)
pipe_buffer_write(pipe, st_obj->buffer, 0, size, data);
}
if (!st_obj->buffer) {
/* out of memory */
st_obj->Base.Size = 0;
return GL_FALSE;
}
if (data)
pipe_buffer_write(pipe, st_obj->buffer, 0, size, data);
}
/* BufferData may change an array or uniform buffer, need to update it */
......
......@@ -446,6 +446,7 @@ void st_init_extensions(struct pipe_screen *screen,
{ o(EXT_texture_swizzle), PIPE_CAP_TEXTURE_SWIZZLE },
{ o(EXT_transform_feedback), PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS },
{ o(AMD_pinned_memory), PIPE_CAP_RESOURCE_FROM_USER_MEMORY },
{ o(AMD_seamless_cubemap_per_texture), PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE },
{ o(ATI_separate_stencil), PIPE_CAP_TWO_SIDED_STENCIL },
{ o(ATI_texture_mirror_once), PIPE_CAP_TEXTURE_MIRROR_CLAMP },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment