This fixes layered rendering Vulkan CTS tests with cube (arrays). We also do this in the GL driver, see this code from gen8_depth_state.c for example: case GL_TEXTURE_CUBE_MAP_ARRAY: case GL_TEXTURE_CUBE_MAP: /* The PRM claims that we should use BRW_SURFACE_CUBE for this * situation, but experiments show that gl_Layer doesn't work when we do * this. So we use BRW_SURFACE_2D, since for rendering purposes this is * equivalent. */ surftype = BRW_SURFACE_2D; depth *= 6; break; So I guess we simply forgot to port this workaround to Vulkan. v2: tweak the conditions so the special case is cube texture sampling rather than anything else (Jason) Fixes: dEQP-VK.geometry.layered.cube* Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>tags/17.0-branchpoint
@@ -113,12 +113,14 @@ get_surftype(enum isl_surf_dim dim, isl_surf_usage_flags_t usage) | |||
assert(!(usage & ISL_SURF_USAGE_CUBE_BIT)); | |||
return SURFTYPE_1D; | |||
case ISL_SURF_DIM_2D: | |||
if (usage & ISL_SURF_USAGE_STORAGE_BIT) { | |||
/* Storage images are always plain 2-D, not cube */ | |||
return SURFTYPE_2D; | |||
} else if (usage & ISL_SURF_USAGE_CUBE_BIT) { | |||
if ((usage & ISL_SURF_USAGE_CUBE_BIT) && | |||
(usage & ISL_SURF_USAGE_TEXTURE_BIT)) { | |||
/* We need SURFTYPE_CUBE to make cube sampling work */ | |||
return SURFTYPE_CUBE; | |||
} else { | |||
/* Everything else (render and storage) treat cubes as plain | |||
* 2D array textures | |||
*/ | |||
return SURFTYPE_2D; | |||
} | |||
case ISL_SURF_DIM_3D: |