mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-11 23:10:28 +01:00
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:
parent
8e1eee8b5e
commit
a157133380
5 changed files with 99 additions and 2 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue