v3d: configure polygon mode when enabled

The hardware do not support setting different polygon modes for front
and back faces at the same time. In this case, unless we are culling one
of the faces, we show a warning to the user.

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/28675>
This commit is contained in:
Juan A. Suarez Romero 2024-04-10 18:52:12 +02:00 committed by Marge Bot
parent 6cc119522e
commit b3e65c77c4
3 changed files with 57 additions and 29 deletions

View file

@ -15,7 +15,6 @@ shaders@point-vertex-id gl_vertexid gl_instanceid,Fail
shaders@point-vertex-id gl_vertexid,Fail
spec@!opengl 1.0@depth-clear-precision-check,Fail
spec@!opengl 1.0@gl-1.0-edgeflag,Fail
spec@!opengl 1.0@gl-1.0-edgeflag-const,Fail
spec@!opengl 1.0@gl-1.0-edgeflag-quads,Fail
spec@!opengl 1.0@gl-1.0-no-op-paths,Fail
spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail
@ -28,33 +27,6 @@ spec@!opengl 1.1@linestipple@Line loop,Fail
spec@!opengl 1.1@linestipple@Line strip,Fail
spec@!opengl 1.1@linestipple@Restarting lines within a single Begin-End block,Fail
spec@!opengl 1.1@point-line-no-cull,Fail
spec@!opengl 1.1@polygon-mode,Fail
spec@!opengl 1.1@polygon-mode-facing,Fail
spec@!opengl 1.1@polygon-mode-offset,Fail
spec@!opengl 1.1@polygon-mode-offset@config 0: Expected white pixel on bottom edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 0: Expected white pixel on left edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 0: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 0: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 1: Expected blue pixel in center,Fail
spec@!opengl 1.1@polygon-mode-offset@config 1: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 1: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 2: Expected blue pixel in center,Fail
spec@!opengl 1.1@polygon-mode-offset@config 2: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 2: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 3: Expected white pixel on bottom edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 3: Expected white pixel on left edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 3: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 3: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 4: Expected white pixel on bottom edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 4: Expected white pixel on left edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 4: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 4: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 5: Expected blue pixel in center,Fail
spec@!opengl 1.1@polygon-mode-offset@config 5: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 5: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 6: Expected blue pixel in center,Fail
spec@!opengl 1.1@polygon-mode-offset@config 6: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 6: Expected white pixel on top edge,Fail
spec@!opengl 1.1@teximage-colors gl_alpha16@Exact upload-download of GL_ALPHA16,Fail
spec@!opengl 1.1@texwrap formats bordercolor,Fail
spec@!opengl 1.1@texwrap formats bordercolor-swizzled,Fail
@ -433,6 +405,41 @@ spec@nv_read_depth@read_depth_gles3,Fail
spec@oes_point_sprite@arb_point_sprite-checkerboard_gles1,Fail
spec@oes_shader_io_blocks@compiler@layout-location-aliasing.vert,Fail
# There are two problems here. On one side, hardware do not support
# different polygon mode for front and back faces. By default we
# choose the mode set for front face, unless we are culling it; in
# this case we choose the mode set for back face. The other problem is
# that we do not support rendering quads, so Gallium decomposes them
# in triangles. This has the drawback that when setting polygon mode
# as lines, we are rendering an extra edge.
spec@!opengl 1.1@polygon-mode,Fail
spec@!opengl 1.1@polygon-mode-facing,Fail
spec@!opengl 1.1@polygon-mode-offset,Fail
spec@!opengl 1.1@polygon-mode-offset@config 0: Expected white pixel on bottom edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 0: Expected white pixel on left edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 0: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 0: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 1: Expected blue pixel in center,Fail
spec@!opengl 1.1@polygon-mode-offset@config 1: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 1: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 2: Expected blue pixel in center,Fail
spec@!opengl 1.1@polygon-mode-offset@config 2: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 2: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 3: Expected white pixel on bottom edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 3: Expected white pixel on left edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 3: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 3: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 4: Expected white pixel on bottom edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 4: Expected white pixel on left edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 4: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 4: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 5: Expected blue pixel in center,Fail
spec@!opengl 1.1@polygon-mode-offset@config 5: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 5: Expected white pixel on top edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 6: Expected blue pixel in center,Fail
spec@!opengl 1.1@polygon-mode-offset@config 6: Expected white pixel on right edge,Fail
spec@!opengl 1.1@polygon-mode-offset@config 6: Expected white pixel on top edge,Fail
# V3D does not support PIPE_FORMAT_{R16,R16G16,R16G16B16A16}_UNORM for
# rendering
spec@!opengl 3.0@required-texture-attachment-formats,Fail

View file

@ -68,7 +68,7 @@ traces:
gputest/plot3d-v2.trace:
broadcom-rpi4:
checksum: f8a9a5cd78646c89efe0df320755a3b2
checksum: 1ef33ad22679107a256501c79bfd9e7c
gputest/tessmark-v2.trace:
broadcom-rpi4:

View file

@ -358,6 +358,27 @@ v3dX(emit_state)(struct pipe_context *pctx)
V3D_LINE_RASTERIZATION_PERP_END_CAPS :
V3D_LINE_RASTERIZATION_DIAMOND_EXIT;
if (config.enable_forward_facing_primitive &&
config.enable_reverse_facing_primitive &&
v3d->rasterizer->base.fill_front != v3d->rasterizer->base.fill_back) {
mesa_logw_once("Setting a different polygon mode for "
"front and back faces is not supported");
}
if (config.enable_forward_facing_primitive) {
if (v3d->rasterizer->base.fill_front != PIPE_POLYGON_MODE_FILL) {
config.direct3d_wireframe_triangles_mode = true;
config.direct3d_point_fill_mode =
v3d->rasterizer->base.fill_front == PIPE_POLYGON_MODE_POINT;
}
} else {
if (v3d->rasterizer->base.fill_back != PIPE_POLYGON_MODE_FILL) {
config.direct3d_wireframe_triangles_mode = true;
config.direct3d_point_fill_mode =
v3d->rasterizer->base.fill_back == PIPE_POLYGON_MODE_POINT;
}
}
#if V3D_VERSION >= 71
/* The following follows the logic implemented in v3dv
* plus the definition of depth_clip_near/far and