diff options
author | Nicolai Hähnle <[email protected]> | 2017-05-10 20:44:51 +0200 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2017-05-18 11:48:52 +0200 |
commit | 4d6e75776dced684dee0a78c5b70cd96376e84a8 (patch) | |
tree | 44bfee64d278a7b51b698eee7ed1ae679d1ceece /src/amd/common | |
parent | 00f466bad93e13adf3da04bdc0746d76f75b6c1b (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.c | 33 |
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 |