nvc0/nv50: support and enable EXT_memory_object*

Passes the ext_external_objects-memory-object-api-errors piglit:

./bin/ext_external_objects-memory-object-api-errors
Mesa: User error: GL_INVALID_VALUE in glTexStorageMem1DEXT(memory=0)
PIGLIT: {"subtest": {"1D texture" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glTexStorageMem2DEXT(memory=0)
PIGLIT: {"subtest": {"2D texture" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glTexStorageMem3DEXT(memory=0)
PIGLIT: {"subtest": {"3D texture" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glTextureStorageMem1DEXT(memory=0)
PIGLIT: {"subtest": {"1D texture direct state access" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glTexureStorageMem2DEXT(memory=0)
PIGLIT: {"subtest": {"2D texture direct state access" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glTextureStorageMem3DEXT(memory=0)
PIGLIT: {"subtest": {"3D texture direct state access" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glTexStorageMem2DMultisampleEXT(memory=0)
PIGLIT: {"subtest": {"2D texture ms" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glTexStorageMem3DMultisampleEXT(memory=0)
PIGLIT: {"subtest": {"3D texture ms" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glTextureStorageMem2DMultisampleEXT(memory=0)
PIGLIT: {"subtest": {"2D texture ms direct state access" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glTextureStorageMem3DMultisampleEXT(memory=0)
PIGLIT: {"subtest": {"3D texture ms direct state access" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glBufferStorageMemEXT(memory == 0)
PIGLIT: {"subtest": {"buffer storage" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glNamedBufferStorageMemEXT(memory == 0)
PIGLIT: {"subtest": {"buffer storage direct state access" : "pass"}}
Mesa: User error: GL_INVALID_ENUM in glGetUnsignedBytevEXT(pname=0xffffffff)
PIGLIT: {"subtest": {"unsigned-byte-v-bad-enum" : "pass"}}
Mesa: User error: GL_INVALID_ENUM in glGetUnsignedBytei_vEXT(pname=0xffffffff)
PIGLIT: {"subtest": {"unsigned-byte-i-v-bad-enum" : "pass"}}
Mesa: User error: GL_INVALID_VALUE in glGetUnsignedBytei_vEXT(pname=GL_DEVICE_UUID_EXT)
PIGLIT: {"subtest": {"unsigned-byte-i-v-bad-value" : "pass"}}

Signed-off-by: Yusuf Khan <yusisamerican@gmail.com>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19405>
This commit is contained in:
Yusuf Khan 2022-10-28 01:58:29 -05:00 committed by Marge Bot
parent 8e1eee8b5e
commit a157133380
5 changed files with 99 additions and 2 deletions

View file

@ -100,6 +100,73 @@ nv50_invalidate_resource(struct pipe_context *pipe, struct pipe_resource *res)
nouveau_buffer_invalidate(pipe, res);
}
struct pipe_memory_object *
nv50_memobj_create_from_handle(struct pipe_screen *screen,
struct winsys_handle *handle,
bool dedicated)
{
struct nv50_memobj *memobj = CALLOC_STRUCT(nv50_memobj);
memobj->bo = nouveau_screen_bo_from_handle(screen, handle, &memobj->stride);
if (memobj->bo == NULL) {
FREE(memobj->bo);
return NULL;
}
memobj->handle = handle;
memobj->b.dedicated = dedicated;
return &memobj->b;
}
void
nv50_memobj_destroy(struct pipe_screen *screen,
struct pipe_memory_object *pmemobj)
{
struct nv50_memobj *memobj = (struct nv50_memobj *)pmemobj;
free(memobj->handle);
free(memobj->bo);
free(memobj);
}
struct pipe_resource *
nv50_resource_from_memobj(struct pipe_screen *screen,
const struct pipe_resource *templ,
struct pipe_memory_object *pmemobj,
uint64_t offset)
{
struct nv50_miptree *mt;
struct nv50_memobj *memobj = (struct nv50_memobj *)pmemobj;
/* only supports 2D, non-mipmapped textures for the moment */
if ((templ->target != PIPE_TEXTURE_2D &&
templ->target != PIPE_TEXTURE_RECT) ||
templ->last_level != 0 ||
templ->depth0 != 1 ||
templ->array_size > 1)
return NULL;
mt = CALLOC_STRUCT(nv50_miptree);
if (!mt)
return NULL;
mt->base.bo = memobj->bo;
mt->base.domain = mt->base.bo->flags & NOUVEAU_BO_APER;
mt->base.address = mt->base.bo->offset;
mt->base.base = *templ;
pipe_reference_init(&mt->base.base.reference, 1);
mt->base.base.screen = screen;
mt->level[0].offset = 0;
mt->level[0].tile_mode = mt->base.bo->config.nv50.tile_mode;
NOUVEAU_DRV_STAT(nouveau_screen(screen), tex_obj_current_count, 1);
/* no need to adjust bo reference count */
return &mt->base.base;
}
void
nv50_init_resource_functions(struct pipe_context *pcontext)
{
@ -122,4 +189,8 @@ nv50_screen_init_resource_functions(struct pipe_screen *pscreen)
pscreen->resource_from_handle = nv50_resource_from_handle;
pscreen->resource_get_handle = nv50_miptree_get_handle;
pscreen->resource_destroy = nv50_resource_destroy;
pscreen->memobj_create_from_handle = nv50_memobj_create_from_handle;
pscreen->resource_from_memobj = nv50_resource_from_memobj;
pscreen->memobj_destroy = nv50_memobj_destroy;
}

View file

@ -43,6 +43,13 @@ struct nv50_miptree_level {
uint32_t tile_mode;
};
struct nv50_memobj {
struct winsys_handle *handle;
struct pipe_memory_object b;
struct nouveau_bo *bo;
unsigned stride;
};
#define NV50_MAX_TEXTURE_LEVELS 16
struct nv50_miptree {
@ -164,4 +171,19 @@ nv50_clear_texture(struct pipe_context *pipe,
const struct pipe_box *box,
const void *data);
struct pipe_memory_object *
nv50_memobj_create_from_handle(struct pipe_screen *screen,
struct winsys_handle *handle,
bool dedicated);
struct pipe_resource *
nv50_resource_from_memobj(struct pipe_screen *screen,
const struct pipe_resource *t,
struct pipe_memory_object *pmemobj,
uint64_t offset);
void
nv50_memobj_destroy(struct pipe_screen *screen,
struct pipe_memory_object *pmemobj);
#endif /* __NV50_RESOURCE_H__ */

View file

@ -233,6 +233,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_SAMPLER_VIEW_TARGET:
case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
case PIPE_CAP_CLIP_HALFZ:
case PIPE_CAP_MEMOBJ:
case PIPE_CAP_POLYGON_OFFSET_CLAMP:
case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
@ -348,7 +349,6 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_BINDLESS_TEXTURE:
case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
case PIPE_CAP_QUERY_SO_OVERFLOW:
case PIPE_CAP_MEMOBJ:
case PIPE_CAP_LOAD_CONSTBUF:
case PIPE_CAP_TILE_RASTER_ORDER:
case PIPE_CAP_FRAMEBUFFER_MSAA_CONSTRAINTS:

View file

@ -175,4 +175,8 @@ nvc0_screen_init_resource_functions(struct pipe_screen *pscreen)
pscreen->resource_get_handle = nvc0_miptree_get_handle;
pscreen->resource_destroy = nvc0_resource_destroy;
pscreen->resource_from_user_memory = nvc0_resource_from_user_memory;
pscreen->memobj_create_from_handle = nv50_memobj_create_from_handle;
pscreen->resource_from_memobj = nv50_resource_from_memobj;
pscreen->memobj_destroy = nv50_memobj_destroy;
}

View file

@ -275,6 +275,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_DRAW_PARAMETERS:
case PIPE_CAP_SHADER_PACK_HALF_FLOAT:
case PIPE_CAP_MULTI_DRAW_INDIRECT:
case PIPE_CAP_MEMOBJ:
case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
case PIPE_CAP_FS_FACE_IS_INTEGER_SYSVAL:
case PIPE_CAP_QUERY_BUFFER_OBJECT:
@ -383,7 +384,6 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_NATIVE_FENCE_FD:
case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
case PIPE_CAP_MEMOBJ:
case PIPE_CAP_LOAD_CONSTBUF:
case PIPE_CAP_TILE_RASTER_ORDER:
case PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES: