v3d: add support for ARB_texture_cube_map_array

This implements support for texture cubemap arrays.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Signed-off-by: Juan A. Suarez Romero <jasuarez@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22482>
This commit is contained in:
Juan A. Suarez Romero
2023-04-13 18:57:39 +02:00
committed by Marge Bot
parent 1bc9efc10c
commit b346c019d5
6 changed files with 45 additions and 8 deletions

View File

@@ -133,7 +133,7 @@ GL 4.0, GLSL 4.00 --- all DONE: freedreno/a6xx, i965/gen7+, nvc0, r600, radeonsi
GL_ARB_shader_subroutine DONE (freedreno, i965/gen6+, nv50, softpipe)
GL_ARB_tessellation_shader DONE (freedreno/a6xx, i965/gen7+, )
GL_ARB_texture_buffer_object_rgb32 DONE (freedreno, i965/gen6+, softpipe, panfrost, asahi)
GL_ARB_texture_cube_map_array DONE (freedreno/a4xx+, i965/gen6+, nv50, softpipe)
GL_ARB_texture_cube_map_array DONE (freedreno/a4xx+, i965/gen6+, nv50, softpipe, v3d)
GL_ARB_texture_gather DONE (freedreno, i965/gen6+, nv50, softpipe, v3d, panfrost, asahi)
GL_ARB_texture_query_lod DONE (freedreno, i965, nv50, softpipe, v3d, panfrost)
GL_ARB_transform_feedback2 DONE (freedreno/a3xx+, i965/gen6+, nv50, softpipe, v3d, panfrost)

View File

@@ -120,7 +120,6 @@ spec@!opengl 3.0@render-integer@GL_RGB8UI,Fail
spec@!opengl 3.0@render-integer@GL_RGBA8I,Fail
spec@!opengl 3.0@render-integer@GL_RGBA8UI,Fail
spec@!opengl 3.0@required-texture-attachment-formats,Fail
spec@!opengl 3.0@sampler-cube-shadow,Fail
spec@!opengl 3.1@minmax,Fail
spec@!opengl 3.1@primitive-restart-xfb flush,Fail
spec@!opengl 3.1@primitive-restart-xfb generated,Fail
@@ -505,6 +504,11 @@ spec@oes_egl_image_external_essl3@oes_egl_image_external_essl3,Crash
spec@oes_point_sprite@arb_point_sprite-checkerboard_gles1,Fail
spec@oes_shader_io_blocks@compiler@layout-location-aliasing.vert,Fail
# OpenGL 3.1 applies non-seamless cubemap texturing, while our
# driver/GLES uses seamless cubemap texturing.
spec@!opengl 3.0@sampler-cube-shadow,Fail
spec@arb_texture_cube_map_array@arb_texture_cube_map_array-sampler-cube-array-shadow,Fail
# https://gitlab.freedesktop.org/mesa/piglit/-/merge_requests/800
spec@!opengl es 3.0@gles-3.0-transform-feedback-uniform-buffer-object,Fail

View File

@@ -174,7 +174,9 @@ v3d_stencil_blit(struct pipe_context *ctx, struct pipe_blit_info *info)
/* Initialize the sampler view. */
struct pipe_sampler_view src_tmpl = {
.target = src->base.target,
.target = (src->base.target == PIPE_TEXTURE_CUBE_ARRAY) ?
PIPE_TEXTURE_2D_ARRAY :
src->base.target,
.format = src_format,
.u.tex = {
.first_level = info->src.level,

View File

@@ -148,11 +148,13 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_INDEP_BLEND_FUNC:
case PIPE_CAP_CONDITIONAL_RENDER:
case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
case PIPE_CAP_CUBE_MAP_ARRAY:
return 1;
case PIPE_CAP_POLYGON_OFFSET_CLAMP:
return screen->devinfo.ver >= 41;
case PIPE_CAP_TEXTURE_QUERY_LOD:
return screen->devinfo.ver >= 42;
break;

View File

@@ -72,7 +72,12 @@ get_texture_size(struct v3d_texture_stateobj *texstate,
texture->u.tex.first_level);
case QUNIFORM_TEXTURE_ARRAY_SIZE:
assert(texture->target != PIPE_BUFFER);
return texture->texture->array_size;
if (texture->target != PIPE_TEXTURE_CUBE_ARRAY) {
return texture->texture->array_size;
} else {
assert(texture->texture->array_size % 6 == 0);
return texture->texture->array_size / 6;
}
case QUNIFORM_TEXTURE_LEVELS:
assert(texture->target != PIPE_BUFFER);
return (texture->u.tex.last_level -
@@ -108,7 +113,12 @@ get_image_size(struct v3d_shaderimg_stateobj *shaderimg,
image->base.u.tex.level);
case QUNIFORM_IMAGE_ARRAY_SIZE:
assert(image->base.resource->target != PIPE_BUFFER);
return image->base.resource->array_size;
if (image->base.resource->target != PIPE_TEXTURE_CUBE_ARRAY) {
return image->base.resource->array_size;
} else {
assert(image->base.resource->array_size % 6 == 0);
return image->base.resource->array_size / 6;
}
default:
unreachable("Bad texture size field");
}

View File

@@ -872,8 +872,16 @@ static void
v3d_setup_texture_shader_state(struct V3DX(TEXTURE_SHADER_STATE) *tex,
struct pipe_resource *prsc,
int base_level, int last_level,
int first_layer, int last_layer)
int first_layer, int last_layer,
bool sampling_cube_array)
{
/* Due to ARB_texture_view, a cubemap array can be seen as 2D texture
* array.
*/
assert(!sampling_cube_array ||
prsc->target == PIPE_TEXTURE_CUBE_ARRAY ||
prsc->target == PIPE_TEXTURE_2D_ARRAY);
struct v3d_resource *rsc = v3d_resource(prsc);
int msaa_scale = prsc->nr_samples > 1 ? 2 : 1;
@@ -899,6 +907,15 @@ v3d_setup_texture_shader_state(struct V3DX(TEXTURE_SHADER_STATE) *tex,
tex->image_depth = (last_layer - first_layer) + 1;
}
/* Empirical testing with CTS shows that when we are sampling from
* cube arrays we want to set image depth to layers / 6, but not when
* doing image load/store or sampling from 2d image arrays.
*/
if (sampling_cube_array) {
assert(tex->image_depth % 6 == 0);
tex->image_depth /= 6;
}
tex->base_level = base_level;
#if V3D_VERSION >= 40
tex->max_level = last_level;
@@ -964,7 +981,8 @@ v3dX(create_texture_shader_state_bo)(struct v3d_context *v3d,
cso->u.tex.first_level,
cso->u.tex.last_level,
cso->u.tex.first_layer,
cso->u.tex.last_layer);
cso->u.tex.last_layer,
cso->target == PIPE_TEXTURE_CUBE_ARRAY);
} else {
v3d_setup_texture_shader_state_from_buffer(&tex, prsc,
cso->format,
@@ -1391,7 +1409,8 @@ v3d_create_image_view_texture_shader_state(struct v3d_context *v3d,
iview->base.u.tex.level,
iview->base.u.tex.level,
iview->base.u.tex.first_layer,
iview->base.u.tex.last_layer);
iview->base.u.tex.last_layer,
false);
} else {
v3d_setup_texture_shader_state_from_buffer(&tex, prsc,
iview->base.format,