Mesa (main): d3d12: Enable cubemap arrays

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Dec 30 18:51:46 UTC 2021


Module: Mesa
Branch: main
Commit: fe963f336ccafee32f5397956f5c174d24bff874
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fe963f336ccafee32f5397956f5c174d24bff874

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Wed Dec  8 07:05:53 2021 -0800

d3d12: Enable cubemap arrays

Reviewed-by: Sil Vilerino <sivileri at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14161>

---

 src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt    | 46 +++-------------------
 src/gallium/drivers/d3d12/d3d12_context.cpp        |  8 ++++
 .../d3d12/d3d12_lower_int_cubemap_to_array.c       | 28 +++++++++----
 src/gallium/drivers/d3d12/d3d12_resource.h         |  1 +
 src/gallium/drivers/d3d12/d3d12_screen.cpp         |  4 +-
 src/gallium/drivers/d3d12/d3d12_surface.cpp        |  2 +
 6 files changed, 38 insertions(+), 51 deletions(-)

diff --git a/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt b/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt
index 14275f71d00..c7a54b2a03b 100644
--- a/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt
+++ b/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt
@@ -317,8 +317,6 @@ spec/!opengl 3.2/gl-3.2-adj-prims line cull-front pv-first: fail
 spec/!opengl 3.2/gl-3.2-adj-prims line cull-front pv-last: fail
 spec/!opengl 3.2/gl-3.2-adj-prims pv-first: fail
 spec/!opengl 3.2/gl-3.2-adj-prims pv-last: fail
-spec/!opengl 3.2/layered-rendering/clear-color-all-types cube_map_array mipmapped: skip
-spec/!opengl 3.2/layered-rendering/clear-color-all-types cube_map_array single_level: skip
 spec/!opengl 3.2/layered-rendering/gl-layer-cube-map: fail
 spec/!opengl 3.2/layered-rendering/gl-layer-render: fail
 spec/!opengl 3.2/layered-rendering/gl-layer-render-clipped: fail
@@ -559,7 +557,6 @@ spec/arb_direct_state_access/create-transformfeedbacks: skip
 spec/arb_direct_state_access/getcompressedtextureimage: skip
 spec/arb_direct_state_access/gettextureimage-formats: crash
 spec/arb_direct_state_access/gettransformfeedback: skip
-spec/arb_direct_state_access/textures-storage/cube array texture: skip
 spec/arb_direct_state_access/transformfeedback-bufferbase: skip
 spec/arb_direct_state_access/transformfeedback-bufferrange: skip
 spec/arb_draw_indirect/arb_draw_indirect-api-errors: skip
@@ -595,7 +592,6 @@ spec/arb_framebuffer_no_attachments/arb_framebuffer_no_attachments-minmax: skip
 spec/arb_framebuffer_no_attachments/arb_framebuffer_no_attachments-params: skip
 spec/arb_framebuffer_no_attachments/arb_framebuffer_no_attachments-query: skip
 spec/arb_framebuffer_no_attachments/arb_framebuffer_no_attachments-roundup-samples: skip
-spec/arb_framebuffer_object/fbo-incomplete/invalid layer of a cube-array texture: skip
 spec/arb_framebuffer_srgb/arb_framebuffer_srgb-srgb_conformance: fail
 spec/arb_geometry_shader4/arb_geometry_shader4-ignore-adjacent-vertices  gl_line_strip_adjacency: skip
 spec/arb_geometry_shader4/arb_geometry_shader4-ignore-adjacent-vertices  gl_lines_adjacency: skip
@@ -1859,7 +1855,6 @@ spec/arb_pipeline_statistics_query/arb_pipeline_statistics_query-frag: skip
 spec/arb_pipeline_statistics_query/arb_pipeline_statistics_query-geom: skip
 spec/arb_pipeline_statistics_query/arb_pipeline_statistics_query-vert: skip
 spec/arb_pipeline_statistics_query/arb_pipeline_statistics_query-vert_adj: skip
-spec/arb_pixel_buffer_object/texsubimage cube_map_array pbo: skip
 spec/arb_point_parameters/arb_point_parameters-point-attenuation: fail
 spec/arb_point_sprite/arb_point_sprite-mipmap: fail
 spec/arb_post_depth_coverage/arb_post_depth_coverage-basic: skip
@@ -2135,7 +2130,6 @@ spec/arb_sparse_buffer/buffer-data: skip
 spec/arb_sparse_buffer/commit: skip
 spec/arb_sparse_buffer/minmax: skip
 spec/arb_stencil_texturing/draw: fail
-spec/arb_stencil_texturing/glblitframebuffer corrupts state/gl_texture_cube_map_array: skip
 spec/arb_sync/clientwaitsync-timeout: skip
 spec/arb_tessellation_shader/arb_tessellation_shader-get-tcs-params: skip
 spec/arb_tessellation_shader/arb_tessellation_shader-get-tes-params: skip
@@ -2315,34 +2309,11 @@ spec/arb_texture_cube_map/copyteximage cube samples=32: skip
 spec/arb_texture_cube_map/copyteximage cube samples=4: skip
 spec/arb_texture_cube_map/copyteximage cube samples=6: skip
 spec/arb_texture_cube_map/copyteximage cube samples=8: skip
-spec/arb_texture_cube_map_array/arb_texture_cube_map_array-cubemap: skip
-spec/arb_texture_cube_map_array/arb_texture_cube_map_array-cubemap-lod: skip
-spec/arb_texture_cube_map_array/arb_texture_cube_map_array-fbo-cubemap-array: skip
-spec/arb_texture_cube_map_array/arb_texture_cube_map_array-get: skip
-spec/arb_texture_cube_map_array/arb_texture_cube_map_array-sampler-cube-array-shadow: skip
-spec/arb_texture_cube_map_array/arb_texture_cube_map_array-teximage3d-invalid-values: skip
-spec/arb_texture_cube_map_array/fbo-generatemipmap-cubemap array: skip
-spec/arb_texture_cube_map_array/fbo-generatemipmap-cubemap array rgb9_e5: skip
-spec/arb_texture_cube_map_array/fbo-generatemipmap-cubemap array s3tc_dxt1: skip
-spec/arb_texture_cube_map_array/getteximage-targets cube_array: skip
-spec/arb_texture_cube_map_array/glsl-resource-not-bound cubearray: skip
-spec/arb_texture_cube_map_array/texsubimage cube_map_array: skip
-spec/arb_texture_cube_map_array/texturesize/fs-texturesize-isamplercubearray: skip
-spec/arb_texture_cube_map_array/texturesize/fs-texturesize-samplercubearray: skip
-spec/arb_texture_cube_map_array/texturesize/fs-texturesize-samplercubearrayshadow: skip
-spec/arb_texture_cube_map_array/texturesize/fs-texturesize-usamplercubearray: skip
-spec/arb_texture_cube_map_array/texturesize/gs-texturesize-isamplercubearray: skip
-spec/arb_texture_cube_map_array/texturesize/gs-texturesize-samplercubearray: skip
-spec/arb_texture_cube_map_array/texturesize/gs-texturesize-samplercubearrayshadow: skip
-spec/arb_texture_cube_map_array/texturesize/gs-texturesize-usamplercubearray: skip
+spec/arb_texture_cube_map_array/arb_texture_cube_map_array-cubemap: fail
 spec/arb_texture_cube_map_array/texturesize/tes-texturesize-isamplercubearray: skip
 spec/arb_texture_cube_map_array/texturesize/tes-texturesize-samplercubearray: skip
 spec/arb_texture_cube_map_array/texturesize/tes-texturesize-samplercubearrayshadow: skip
 spec/arb_texture_cube_map_array/texturesize/tes-texturesize-usamplercubearray: skip
-spec/arb_texture_cube_map_array/texturesize/vs-texturesize-isamplercubearray: skip
-spec/arb_texture_cube_map_array/texturesize/vs-texturesize-samplercubearray: skip
-spec/arb_texture_cube_map_array/texturesize/vs-texturesize-samplercubearrayshadow: skip
-spec/arb_texture_cube_map_array/texturesize/vs-texturesize-usamplercubearray: skip
 spec/arb_texture_float/multisample-formats 32 gl_arb_texture_float: skip
 spec/arb_texture_gather/texturegather/fs-r-none-float-2d: skip
 spec/arb_texture_gather/texturegather/fs-r-none-float-2darray: skip
@@ -3529,7 +3500,6 @@ spec/arb_texture_stencil8/texwrap formats offset/gl_stencil_index8, swizzled: fa
 spec/arb_texture_stencil8/texwrap formats/gl_stencil_index8: fail
 spec/arb_texture_stencil8/texwrap formats/gl_stencil_index8, npot: fail
 spec/arb_texture_stencil8/texwrap formats/gl_stencil_index8, swizzled: fail
-spec/arb_texture_storage/texture-storage/cube array texture: skip
 spec/arb_texture_view/bug-layers-image: skip
 spec/arb_texture_view/clear-into-view-2d: skip
 spec/arb_texture_view/clear-into-view-2d-array: skip
@@ -4194,7 +4164,6 @@ spec/ext_texture_compression_latc/texwrap formats: skip
 spec/ext_texture_compression_latc/texwrap formats bordercolor: skip
 spec/ext_texture_compression_latc/texwrap formats bordercolor-swizzled: skip
 spec/ext_texture_compression_rgtc/rgtc-api_gles2: skip
-spec/ext_texture_compression_s3tc/getteximage-targets cube_array s3tc: skip
 spec/ext_texture_compression_s3tc/s3tc-errors: fail
 spec/ext_texture_compression_s3tc/s3tc-errors_gles2: skip
 spec/ext_texture_compression_s3tc/s3tc-targeted: fail
@@ -4514,11 +4483,6 @@ spec/glsl-1.10/execution/varying-packing/simple vec4 array: crash
 spec/glsl-1.10/execution/varying-packing/simple vec4 arrays_of_arrays: crash
 spec/glsl-1.10/execution/varying-packing/simple vec4 separate: crash
 spec/glsl-1.30/execution/fs-texelfetch-2d: fail
-spec/glsl-1.30/execution/tex-miplevel-selection texture() cubearray: skip
-spec/glsl-1.30/execution/tex-miplevel-selection texture() cubearrayshadow: skip
-spec/glsl-1.30/execution/tex-miplevel-selection texture(bias) cubearray: skip
-spec/glsl-1.30/execution/tex-miplevel-selection texturegrad cubearray: skip
-spec/glsl-1.30/execution/tex-miplevel-selection texturelod cubearray: skip
 spec/glsl-1.30/execution/tex-miplevel-selection textureoffset 2darrayshadow: skip
 spec/glsl-1.50/execution/geometry/primitive-types gl_triangle_strip: fail
 spec/glsl-1.50/execution/geometry/primitive-types gl_triangle_strip_adjacency: fail
@@ -4710,10 +4674,10 @@ wgl/wgl-sanity: skip
 summary:
        name:  results
        ----  --------
-       pass:    14314
-       fail:      480
+       pass:    14360
+       fail:      481
       crash:       68
-       skip:     4141
+       skip:     4104
     timeout:        0
        warn:       10
  incomplete:        0
@@ -4722,4 +4686,4 @@ summary:
     changes:        0
       fixes:        0
 regressions:        0
-      total:    19023
+      total:    19033
diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp
index b208c5c3bf0..7070b00262e 100644
--- a/src/gallium/drivers/d3d12/d3d12_context.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_context.cpp
@@ -883,6 +883,14 @@ d3d12_init_sampler_view_descriptor(struct d3d12_sampler_view *sampler_view)
       desc.TextureCube.MipLevels = sampler_view->mip_levels;
       desc.TextureCube.ResourceMinLODClamp = 0.0f;
       break;
+   case D3D12_SRV_DIMENSION_TEXTURECUBEARRAY:
+      assert(array_size % 6 == 0);
+      desc.TextureCubeArray.MostDetailedMip = state->u.tex.first_level;
+      desc.TextureCubeArray.MipLevels = sampler_view->mip_levels;
+      desc.TextureCubeArray.First2DArrayFace = state->u.tex.first_layer;
+      desc.TextureCubeArray.NumCubes = array_size / 6;
+      desc.TextureCubeArray.ResourceMinLODClamp = 0.0f;
+      break;
    case D3D12_SRV_DIMENSION_BUFFER:
       desc.Buffer.FirstElement = 0;
       desc.Buffer.StructureByteStride = 0;
diff --git a/src/gallium/drivers/d3d12/d3d12_lower_int_cubemap_to_array.c b/src/gallium/drivers/d3d12/d3d12_lower_int_cubemap_to_array.c
index 62cc47fe5bc..96319a2e584 100644
--- a/src/gallium/drivers/d3d12/d3d12_lower_int_cubemap_to_array.c
+++ b/src/gallium/drivers/d3d12/d3d12_lower_int_cubemap_to_array.c
@@ -64,6 +64,7 @@ typedef struct {
    nir_ssa_def *arx;
    nir_ssa_def *ary;
    nir_ssa_def *arz;
+   nir_ssa_def *array;
 } coord_t;
 
 
@@ -79,6 +80,9 @@ evaluate_face_x(nir_builder *b, coord_t *coord)
    nir_ssa_def *y = nir_fadd(b, nir_fmul(b, ima, coord->ry), nir_imm_float(b, 0.5));
    nir_ssa_def *face = nir_bcsel(b, positive, nir_imm_float(b, 0.0), nir_imm_float(b, 1.0));
 
+   if (coord->array)
+      face = nir_fadd(b, face, coord->array);
+
    return nir_vec3(b, x,y, face);
 }
 
@@ -93,6 +97,9 @@ evaluate_face_y(nir_builder *b, coord_t *coord)
    nir_ssa_def *y = nir_fadd(b, nir_fmul(b, nir_fmul(b, sign, ima), coord->rz), nir_imm_float(b, 0.5));
    nir_ssa_def *face = nir_bcsel(b, positive, nir_imm_float(b, 2.0), nir_imm_float(b, 3.0));
 
+   if (coord->array)
+      face = nir_fadd(b, face, coord->array);
+
    return nir_vec3(b, x,y, face);
 }
 
@@ -107,6 +114,9 @@ evaluate_face_z(nir_builder *b, coord_t *coord)
    nir_ssa_def *y = nir_fadd(b, nir_fmul(b, ima, coord->ry), nir_imm_float(b, 0.5));
    nir_ssa_def *face = nir_bcsel(b, positive, nir_imm_float(b, 4.0), nir_imm_float(b, 5.0));
 
+   if (coord->array)
+      face = nir_fadd(b, face, coord->array);
+
    return nir_vec3(b, x,y, face);
 }
 
@@ -144,9 +154,6 @@ create_array_tex_from_cube_tex(nir_builder *b, nir_tex_instr *tex, nir_ssa_def *
 static nir_ssa_def *
 lower_cube_sample(nir_builder *b, nir_tex_instr *tex)
 {
-   /* We don't support cube map arrays yet */
-   assert(!tex->is_array);
-
    int coord_index = nir_tex_instr_src_index(tex, nir_tex_src_coord);
    assert(coord_index >= 0);
 
@@ -160,6 +167,9 @@ lower_cube_sample(nir_builder *b, nir_tex_instr *tex)
    coords.arx = nir_fabs(b, coords.rx);
    coords.ary = nir_fabs(b, coords.ry);
    coords.arz = nir_fabs(b, coords.rz);
+   coords.array = NULL;
+   if (tex->is_array)
+      coords.array = nir_fmul(b, nir_channel(b, coord, 3), nir_imm_float(b, 6.0f));
 
    nir_ssa_def *use_face_x = nir_iand(b,
                                       nir_fge(b, coords.arx, coords.ary),
@@ -189,12 +199,18 @@ lower_cube_sample(nir_builder *b, nir_tex_instr *tex)
    return create_array_tex_from_cube_tex(b, tex, coord_and_face);
 }
 
-/* We don't expect the array size here */
 static nir_ssa_def *
 lower_cube_txs(nir_builder *b, nir_tex_instr *tex)
 {
    b->cursor = nir_after_instr(&tex->instr);
-   return nir_channels(b, &tex->dest.ssa, 3);
+   if (!tex->is_array)
+      return nir_channels(b, &tex->dest.ssa, 3);
+
+   nir_ssa_def *array_dim = nir_channel(b, &tex->dest.ssa, 2);
+   nir_ssa_def *cube_array_dim = nir_idiv(b, array_dim, nir_imm_int(b, 6));
+   return nir_vec3(b, nir_channel(b, &tex->dest.ssa, 0),
+                      nir_channel(b, &tex->dest.ssa, 1),
+                      cube_array_dim);
 }
 
 static const struct glsl_type *
@@ -210,8 +226,6 @@ make_2darray_from_cubemap(const struct glsl_type *type)
 static const struct glsl_type *
 make_2darray_from_cubemap_with_array(const struct glsl_type *type)
 {
-   /* While we don't (yet) support cube map arrays, there still may be arrays
-    * of cube maps */
    if (glsl_type_is_array(type)) {
       const struct glsl_type *new_type = glsl_without_array(type);
       return new_type != type ? glsl_array_type(make_2darray_from_cubemap(glsl_without_array(type)),
diff --git a/src/gallium/drivers/d3d12/d3d12_resource.h b/src/gallium/drivers/d3d12/d3d12_resource.h
index e9532d1369f..0226217c461 100644
--- a/src/gallium/drivers/d3d12/d3d12_resource.h
+++ b/src/gallium/drivers/d3d12/d3d12_resource.h
@@ -107,6 +107,7 @@ static inline bool
 d3d12_subresource_id_uses_layer(enum pipe_texture_target target)
 {
    return target == PIPE_TEXTURE_CUBE ||
+          target == PIPE_TEXTURE_CUBE_ARRAY ||
           target == PIPE_TEXTURE_1D_ARRAY ||
           target == PIPE_TEXTURE_2D_ARRAY;
 }
diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp
index c4dee5177f9..015a0c7ed2b 100644
--- a/src/gallium/drivers/d3d12/d3d12_screen.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp
@@ -191,10 +191,8 @@ d3d12_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_TEXTURE_MULTISAMPLE:
       return 1;
 
-#if 0 /* TODO: Enable me */
    case PIPE_CAP_CUBE_MAP_ARRAY:
-      return screen->max_feature_level >= D3D_FEATURE_LEVEL_10_1;
-#endif
+      return 1;
 
    case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
       return 1;
diff --git a/src/gallium/drivers/d3d12/d3d12_surface.cpp b/src/gallium/drivers/d3d12/d3d12_surface.cpp
index 64ee32af766..80b96ad3641 100644
--- a/src/gallium/drivers/d3d12/d3d12_surface.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_surface.cpp
@@ -45,6 +45,7 @@ view_dsv_dimension(enum pipe_texture_target target, unsigned samples)
 
    case PIPE_TEXTURE_2D_ARRAY:
    case PIPE_TEXTURE_CUBE:
+   case PIPE_TEXTURE_CUBE_ARRAY:
       return samples > 1 ? D3D12_DSV_DIMENSION_TEXTURE2DMSARRAY :
                            D3D12_DSV_DIMENSION_TEXTURE2DARRAY;
 
@@ -68,6 +69,7 @@ view_rtv_dimension(enum pipe_texture_target target, unsigned samples)
 
    case PIPE_TEXTURE_2D_ARRAY:
    case PIPE_TEXTURE_CUBE:
+   case PIPE_TEXTURE_CUBE_ARRAY:
       return samples > 1 ? D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY :
                            D3D12_RTV_DIMENSION_TEXTURE2DARRAY;
 



More information about the mesa-commit mailing list