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

Reply via email to