[Mesa-dev] [PATCH] fixup! nouveau: Add framebuffer modifier support
Thierry Reding
thierry.reding at gmail.com
Thu Feb 22 18:07:47 UTC 2018
From: Thierry Reding <treding at 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
More information about the mesa-dev
mailing list