mesa: implement GL_AMD_pinned_memory
It's not possible to query the current buffer binding, because the extension doesn't define GL_..._BUFFER__BINDING_AMD. Drivers should check the target parameter of Drivers.BufferData. If it's equal to GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, the memory should be pinned. That's all there is to it. A piglit test is on the piglit mailing list. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Christian König <christian.koenig@amd.com>
This commit is contained in:
@@ -117,6 +117,11 @@ get_buffer_target(struct gl_context *ctx, GLenum target)
|
||||
return &ctx->AtomicBuffer;
|
||||
}
|
||||
break;
|
||||
case GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD:
|
||||
if (ctx->Extensions.AMD_pinned_memory) {
|
||||
return &ctx->ExternalVirtualMemoryBuffer;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
@@ -1242,6 +1247,10 @@ _mesa_DeleteBuffers(GLsizei n, const GLuint *ids)
|
||||
_mesa_BindBuffer( GL_TEXTURE_BUFFER, 0 );
|
||||
}
|
||||
|
||||
if (ctx->ExternalVirtualMemoryBuffer == bufObj) {
|
||||
_mesa_BindBuffer(GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, 0);
|
||||
}
|
||||
|
||||
/* The ID is immediately freed for re-use */
|
||||
_mesa_HashRemove(ctx->Shared->BufferObjects, ids[i]);
|
||||
/* Make sure we do not run into the classic ABA problem on bind.
|
||||
@@ -1381,7 +1390,16 @@ _mesa_BufferStorage(GLenum target, GLsizeiptr size, const GLvoid *data,
|
||||
ASSERT(ctx->Driver.BufferData);
|
||||
if (!ctx->Driver.BufferData(ctx, target, size, data, GL_DYNAMIC_DRAW,
|
||||
flags, bufObj)) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBufferStorage()");
|
||||
if (target == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD) {
|
||||
/* Even though the interaction between AMD_pinned_memory and
|
||||
* glBufferStorage is not described in the spec, Graham Sellers
|
||||
* said that it should behave the same as glBufferData.
|
||||
*/
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glBufferStorage()");
|
||||
}
|
||||
else {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBufferStorage()");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1465,7 +1483,18 @@ _mesa_BufferData(GLenum target, GLsizeiptrARB size,
|
||||
GL_MAP_WRITE_BIT |
|
||||
GL_DYNAMIC_STORAGE_BIT,
|
||||
bufObj)) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBufferDataARB()");
|
||||
if (target == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD) {
|
||||
/* From GL_AMD_pinned_memory:
|
||||
*
|
||||
* INVALID_OPERATION is generated by BufferData if <target> is
|
||||
* EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, and the store cannot be
|
||||
* mapped to the GPU address space.
|
||||
*/
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glBufferData()");
|
||||
}
|
||||
else {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBufferData()");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user