summaryrefslogtreecommitdiffstats
path: root/src/amd/common
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2017-05-10 20:44:51 +0200
committerNicolai Hähnle <[email protected]>2017-05-18 11:48:52 +0200
commit4d6e75776dced684dee0a78c5b70cd96376e84a8 (patch)
tree44bfee64d278a7b51b698eee7ed1ae679d1ceece /src/amd/common
parent00f466bad93e13adf3da04bdc0746d76f75b6c1b (diff)
ac/radeonsi: move some aspects of sanity checking to ac_surface
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/amd/common')
-rw-r--r--src/amd/common/ac_surface.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c
index b20d8189cc8..0bcbc61815c 100644
--- a/src/amd/common/ac_surface.c
+++ b/src/amd/common/ac_surface.c
@@ -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