From: Nicolai Hähnle Date: Wed, 10 May 2017 18:44:51 +0000 (+0200) Subject: ac/radeonsi: move some aspects of sanity checking to ac_surface X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4d6e75776dced684dee0a78c5b70cd96376e84a8;p=mesa.git ac/radeonsi: move some aspects of sanity checking to ac_surface Reviewed-by: Marek Olšák --- 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 #include #include #include @@ -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 diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c b/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c index ca391e0c4ea..cd403f5bfb0 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c @@ -34,22 +34,6 @@ 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)