From: Thierry Reding <tred...@nvidia.com> --- src/gallium/drivers/nouveau/nouveau_buffer.c | 3 +- src/gallium/drivers/nouveau/nouveau_buffer.h | 3 +- src/gallium/drivers/nouveau/nouveau_screen.c | 10 --- src/gallium/drivers/nouveau/nv30/nv30_resource.c | 4 +- src/gallium/drivers/nouveau/nv50/nv50_resource.c | 5 +- src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c | 73 +++++++++++++++++++- src/gallium/drivers/nouveau/nvc0/nvc0_resource.c | 85 +++++++++--------------- src/gallium/drivers/nouveau/nvc0/nvc0_resource.h | 2 - 8 files changed, 109 insertions(+), 76 deletions(-)
diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.c b/src/gallium/drivers/nouveau/nouveau_buffer.c index 73afff961115..2c604419ce05 100644 --- a/src/gallium/drivers/nouveau/nouveau_buffer.c +++ b/src/gallium/drivers/nouveau/nouveau_buffer.c @@ -636,8 +636,7 @@ const struct u_resource_vtbl nouveau_buffer_vtbl = struct pipe_resource * nouveau_buffer_create(struct pipe_screen *pscreen, - const struct pipe_resource *templ, - const uint64_t *modifiers, unsigned int count) + const struct pipe_resource *templ) { struct nouveau_screen *screen = nouveau_screen(pscreen); struct nv04_resource *buffer; diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.h b/src/gallium/drivers/nouveau/nouveau_buffer.h index 466f8cc2b466..3a33fae9ce2f 100644 --- a/src/gallium/drivers/nouveau/nouveau_buffer.h +++ b/src/gallium/drivers/nouveau/nouveau_buffer.h @@ -89,8 +89,7 @@ nouveau_resource_mapped_by_gpu(struct pipe_resource *resource) struct pipe_resource * nouveau_buffer_create(struct pipe_screen *pscreen, - const struct pipe_resource *templ, - const uint64_t *modifiers, unsigned int count); + const struct pipe_resource *templ); struct pipe_resource * nouveau_user_buffer_create(struct pipe_screen *screen, void *ptr, diff --git a/src/gallium/drivers/nouveau/nouveau_screen.c b/src/gallium/drivers/nouveau/nouveau_screen.c index d651cc7f4b8c..b84ef13ebe7f 100644 --- a/src/gallium/drivers/nouveau/nouveau_screen.c +++ b/src/gallium/drivers/nouveau/nouveau_screen.c @@ -128,15 +128,6 @@ nouveau_screen_bo_from_handle(struct pipe_screen *pscreen, return bo; } -static uint64_t nouveau_bo_get_modifier(struct nouveau_bo *bo) -{ - struct nouveau_device *dev = bo->device; - - if (dev->chipset >= 0xc0) - return nvc0_bo_get_modifier(bo); - - return DRM_FORMAT_MOD_INVALID; -} bool nouveau_screen_bo_get_handle(struct pipe_screen *pscreen, @@ -144,7 +135,6 @@ nouveau_screen_bo_get_handle(struct pipe_screen *pscreen, unsigned stride, struct winsys_handle *whandle) { - whandle->modifier = nouveau_bo_get_modifier(bo); whandle->stride = stride; if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) { diff --git a/src/gallium/drivers/nouveau/nv30/nv30_resource.c b/src/gallium/drivers/nouveau/nv30/nv30_resource.c index 38d2b2e41c30..386bd3459bd3 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_resource.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_resource.c @@ -53,11 +53,9 @@ static struct pipe_resource * nv30_resource_create(struct pipe_screen *pscreen, const struct pipe_resource *tmpl) { - const uint64_t modifier = DRM_FORMAT_MOD_INVALID; - switch (tmpl->target) { case PIPE_BUFFER: - return nouveau_buffer_create(pscreen, tmpl, &modifier, 1); + return nouveau_buffer_create(pscreen, tmpl); default: return nv30_miptree_create(pscreen, tmpl); } diff --git a/src/gallium/drivers/nouveau/nv50/nv50_resource.c b/src/gallium/drivers/nouveau/nv50/nv50_resource.c index 37592ad66349..aed8c6241d4b 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_resource.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_resource.c @@ -1,4 +1,3 @@ -#include <drm_fourcc.h> #include "pipe/p_context.h" #include "util/u_inlines.h" @@ -12,11 +11,9 @@ static struct pipe_resource * nv50_resource_create(struct pipe_screen *screen, const struct pipe_resource *templ) { - const uint64_t modifier = DRM_FORMAT_MOD_INVALID; - switch (templ->target) { case PIPE_BUFFER: - return nouveau_buffer_create(screen, templ, &modifier, 1); + return nouveau_buffer_create(screen, templ); default: return nv50_miptree_create(screen, templ); } diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c index 627d6b7346c3..7983c4030876 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c @@ -24,6 +24,7 @@ #include "pipe/p_state.h" #include "pipe/p_defines.h" +#include "state_tracker/drm_driver.h" #include "util/u_inlines.h" #include "util/u_format.h" @@ -235,9 +236,79 @@ nvc0_miptree_init_layout_tiled(struct nv50_miptree *mt) } } +static uint64_t nvc0_miptree_get_modifier(struct nv50_miptree *mt) +{ + union nouveau_bo_config *config = &mt->base.bo->config; + uint64_t modifier; + + if (mt->layout_3d) + return DRM_FORMAT_MOD_INVALID; + + switch (config->nvc0.memtype) { + case 0x00: + modifier = DRM_FORMAT_MOD_LINEAR; + break; + + case 0xfe: + switch (NVC0_TILE_MODE_Y(config->nvc0.tile_mode)) { + case 0: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_ONE_GOB; + break; + + case 1: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_TWO_GOB; + break; + + case 2: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_FOUR_GOB; + break; + + case 3: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_EIGHT_GOB; + break; + + case 4: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_SIXTEEN_GOB; + break; + + case 5: + modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_THIRTYTWO_GOB; + break; + + default: + modifier = DRM_FORMAT_MOD_INVALID; + break; + } + break; + + default: + modifier = DRM_FORMAT_MOD_INVALID; + break; + } + + return modifier; +} + +static boolean +nvc0_miptree_get_handle(struct pipe_screen *pscreen, + struct pipe_resource *pt, + struct winsys_handle *whandle) +{ + struct nv50_miptree *mt = nv50_miptree(pt); + boolean ret; + + ret = nv50_miptree_get_handle(pscreen, pt, whandle); + if (!ret) + return ret; + + whandle->modifier = nvc0_miptree_get_modifier(mt); + + return true; +} + const struct u_resource_vtbl nvc0_miptree_vtbl = { - nv50_miptree_get_handle, /* get_handle */ + nvc0_miptree_get_handle, /* get_handle */ nv50_miptree_destroy, /* resource_destroy */ nvc0_miptree_transfer_map, /* transfer_map */ u_default_transfer_flush_region, /* transfer_flush_region */ diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c index c409dce7f31f..ec6257a89633 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c @@ -13,7 +13,7 @@ nvc0_resource_create(struct pipe_screen *screen, switch (templ->target) { case PIPE_BUFFER: - return nouveau_buffer_create(screen, templ, &modifier, 1); + return nouveau_buffer_create(screen, templ); default: return nvc0_miptree_create(screen, templ, &modifier, 1); } @@ -26,7 +26,7 @@ nvc0_resource_create_with_modifiers(struct pipe_screen *screen, { switch (templ->target) { case PIPE_BUFFER: - return nouveau_buffer_create(screen, templ, modifiers, count); + return nouveau_buffer_create(screen, templ); default: return nvc0_miptree_create(screen, templ, modifiers, count); } @@ -38,6 +38,37 @@ nvc0_query_dmabuf_modifiers(struct pipe_screen *screen, uint64_t *modifiers, unsigned int *external_only, int *count) { + static const uint64_t supported_modifiers[] = { + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_ONE_GOB, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_TWO_GOB, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_FOUR_GOB, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_EIGHT_GOB, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_SIXTEEN_GOB, + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_THIRTYTWO_GOB, + }; + int i, num = 0; + + if (max > ARRAY_SIZE(supported_modifiers)) + max = ARRAY_SIZE(supported_modifiers); + + if (!max) { + max = ARRAY_SIZE(supported_modifiers); + external_only = NULL; + modifiers = NULL; + } + + for (i = 0; i < max; i++) { + if (modifiers) + modifiers[num] = supported_modifiers[i]; + + if (external_only) + external_only[num] = 0; + + num++; + } + + *count = num; } static struct pipe_resource * @@ -90,53 +121,3 @@ nvc0_screen_init_resource_functions(struct pipe_screen *pscreen) pscreen->resource_get_handle = u_resource_get_handle_vtbl; pscreen->resource_destroy = u_resource_destroy_vtbl; } - -uint64_t nvc0_bo_get_modifier(struct nouveau_bo *bo) -{ - union nouveau_bo_config *config = &bo->config; - uint64_t modifier = DRM_FORMAT_MOD_INVALID; - - switch (config->nvc0.memtype) { - case 0x00: - modifier = DRM_FORMAT_MOD_LINEAR; - break; - - case 0xfe: - switch (NVC0_TILE_MODE_Y(config->nvc0.tile_mode)) { - case 0: - modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_ONE_GOB; - break; - - case 1: - modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_TWO_GOB; - break; - - case 2: - modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_FOUR_GOB; - break; - - case 3: - modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_EIGHT_GOB; - break; - - case 4: - modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_SIXTEEN_GOB; - break; - - case 5: - modifier = DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_THIRTYTWO_GOB; - break; - - default: - modifier = DRM_FORMAT_MOD_INVALID; - break; - } - break; - - default: - modifier = DRM_FORMAT_MOD_INVALID; - break; - } - - return modifier; -} diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.h b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.h index 78247748c141..b24fca004cad 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.h +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.h @@ -59,6 +59,4 @@ void nvc0_miptree_transfer_unmap(struct pipe_context *pcontext, struct pipe_transfer *ptx); -uint64_t nvc0_bo_get_modifier(struct nouveau_bo *bo); - #endif -- 2.16.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev