ac/radeonsi: move some aspects of sanity checking to ac_surface
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 10 May 2017 18:44:51 +0000 (20:44 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 18 May 2017 09:48:52 +0000 (11:48 +0200)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/amd/common/ac_surface.c
src/gallium/winsys/amdgpu/drm/amdgpu_surface.c

index b20d818..0bcbc61 100644 (file)
@@ -30,6 +30,7 @@
 #include "util/macros.h"
 #include "util/u_math.h"
 
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <amdgpu.h>
@@ -202,6 +203,32 @@ ADDR_HANDLE amdgpu_addr_create(enum radeon_family family,
        return addrCreateOutput.hLib;
 }
 
+static int surf_config_sanity(const struct ac_surf_config *config)
+{
+       /* all dimension must be at least 1 ! */
+       if (!config->info.width || !config->info.height || !config->info.depth ||
+           !config->info.array_size || !config->info.levels)
+               return -EINVAL;
+
+       switch (config->info.samples) {
+       case 0:
+       case 1:
+       case 2:
+       case 4:
+       case 8:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if (config->is_3d && config->info.array_size > 1)
+               return -EINVAL;
+       if (config->is_cube && config->info.depth > 1)
+               return -EINVAL;
+
+       return 0;
+}
+
 static int gfx6_compute_level(ADDR_HANDLE addrlib,
                              const struct ac_surf_config *config,
                              struct radeon_surf *surf, bool is_stencil,
@@ -1016,6 +1043,12 @@ int ac_compute_surface(ADDR_HANDLE addrlib,
                       enum radeon_surf_mode mode,
                       struct radeon_surf *surf)
 {
+       int r;
+
+       r = surf_config_sanity(config);
+       if (r)
+               return r;
+
        if (config->chip_class >= GFX9)
                return gfx9_compute_surface(addrlib, config, mode, surf);
        else
index ca391e0..cd403f5 100644 (file)
 
 static int amdgpu_surface_sanity(const struct pipe_resource *tex)
 {
-   /* all dimension must be at least 1 ! */
-   if (!tex->width0 || !tex->height0 || !tex->depth0 ||
-       !tex->array_size)
-      return -EINVAL;
-
-   switch (tex->nr_samples) {
-   case 0:
-   case 1:
-   case 2:
-   case 4:
-   case 8:
-      break;
-   default:
-      return -EINVAL;
-   }
-
    switch (tex->target) {
    case PIPE_TEXTURE_1D:
       if (tex->height0 > 1)