From 40bdd2bbf756f79881301d84708b0069b6b8ca25 Mon Sep 17 00:00:00 2001 From: Amber Date: Mon, 6 Feb 2023 14:39:19 +0100 Subject: [PATCH] freedreno: use A6XX_GRAS_SC_CNTL_SINGLE_PRIM_MODE with fb readback fixes: dEQP-GLES31.functional.blend_equation_advanced.msaa.* Signed-off-by: Amber Amber Part-of: --- docs/features.txt | 2 +- src/freedreno/ci/freedreno-a618-fails.txt | 25 ------------------------ src/freedreno/ci/freedreno-a630-fails.txt | 17 ---------------- src/freedreno/ir3/ir3_shader.c | 1 + src/freedreno/ir3/ir3_shader.h | 1 + src/gallium/drivers/freedreno/a6xx/fd6_context.c | 3 +++ src/gallium/drivers/freedreno/a6xx/fd6_emit.c | 14 +++++++++++++ src/gallium/drivers/freedreno/a6xx/fd6_emit.h | 4 ++++ 8 files changed, 24 insertions(+), 43 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index 842fd19..117d663 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -331,7 +331,7 @@ Khronos, ARB, and OES extensions that are not part of any OpenGL or OpenGL ES ve GL_EXT_sRGB_write_control DONE (all drivers that support GLES 3.0+) GL_EXT_texture_norm16 DONE (freedreno, i965, r600, radeonsi, nvc0i, softpipe, zink) GL_EXT_texture_sRGB_R8 DONE (all drivers that support GLES 3.0+) - GL_KHR_blend_equation_advanced_coherent DONE (i965/gen9+, panfrost, zink) + GL_KHR_blend_equation_advanced_coherent DONE (freedreno/a6xx, i965/gen9+, panfrost, zink) GL_KHR_texture_compression_astc_hdr DONE (core only) GL_KHR_texture_compression_astc_sliced_3d DONE (freedreno/a4xx+, i965/gen9+, r600, radeonsi, panfrost, softpipe, v3d, zink, lima) GL_OES_depth_texture_cube_map DONE (all drivers that support GLSL 1.30+) diff --git a/src/freedreno/ci/freedreno-a618-fails.txt b/src/freedreno/ci/freedreno-a618-fails.txt index 90c310f..2161174 100644 --- a/src/freedreno/ci/freedreno-a618-fails.txt +++ b/src/freedreno/ci/freedreno-a618-fails.txt @@ -32,31 +32,6 @@ KHR-GL45.direct_state_access.renderbuffers_storage_multisample,Fail KHR-GL45.multi_bind.dispatch_bind_image_textures,Fail -# rendering errors in ~4x4 blocks around the bottom side of the diagonal for the quad -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.colorburn,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.colordodge,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.darken,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.difference,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.exclusion,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.hardlight,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.hsl_color,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.hsl_hue,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.hsl_luminosity,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.hsl_saturation,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.lighten,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.multiply,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.overlay,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.screen,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.softlight,Fail - -bypass-dEQP-GLES31.functional.blend_equation_advanced.basic.colorburn,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.basic.screen,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.barrier.screen,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.barrier.hardlight,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.barrier.hsl_luminosity,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.barrier.lighten,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.barrier.softlight,Fail - # Fails when TU_DEBUG=forcebin is set gmem-dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_two_buffers_geom,Fail gmem-dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_two_buffers_vert,Fail diff --git a/src/freedreno/ci/freedreno-a630-fails.txt b/src/freedreno/ci/freedreno-a630-fails.txt index 38682ef..84d9307 100644 --- a/src/freedreno/ci/freedreno-a630-fails.txt +++ b/src/freedreno/ci/freedreno-a630-fails.txt @@ -31,23 +31,6 @@ KHR-GL45.direct_state_access.renderbuffers_storage_multisample,Fail KHR-GL45.multi_bind.dispatch_bind_image_textures,Fail -# rendering errors in ~4x4 blocks around the bottom side of the diagonal for the quad -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.colorburn,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.colordodge,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.darken,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.difference,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.exclusion,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.hardlight,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.hsl_color,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.hsl_hue,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.hsl_luminosity,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.hsl_saturation,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.lighten,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.multiply,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.overlay,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.screen,Fail -bypass-dEQP-GLES31.functional.blend_equation_advanced.msaa.softlight,Fail - # Fails when TU_DEBUG=forcebin is set gmem-dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_two_buffers_geom,Fail gmem-dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.writes_two_buffers_vert,Fail diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c index 03be17a..4337253 100644 --- a/src/freedreno/ir3/ir3_shader.c +++ b/src/freedreno/ir3/ir3_shader.c @@ -282,6 +282,7 @@ alloc_variant(struct ir3_shader *shader, const struct ir3_shader_key *key, case MESA_SHADER_FRAGMENT: v->fs.early_fragment_tests = info->fs.early_fragment_tests; v->fs.color_is_dual_source = info->fs.color_is_dual_source; + v->fs.uses_fbfetch_output = info->fs.uses_fbfetch_output; break; case MESA_SHADER_COMPUTE: diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h index 32af7f5..2e8afb3 100644 --- a/src/freedreno/ir3/ir3_shader.h +++ b/src/freedreno/ir3/ir3_shader.h @@ -766,6 +766,7 @@ struct ir3_shader_variant { struct { bool early_fragment_tests : 1; bool color_is_dual_source : 1; + bool uses_fbfetch_output : 1; } fs; struct { unsigned req_input_mem; diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_context.c b/src/gallium/drivers/freedreno/a6xx/fd6_context.c index 475cbd7..f3b4d5b 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_context.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_context.c @@ -206,6 +206,9 @@ setup_state_map(struct fd_context *ctx) fd_context_add_shader_map(ctx, PIPE_SHADER_COMPUTE, FD_DIRTY_SHADER_SSBO | FD_DIRTY_SHADER_IMAGE, BIT(FD6_GROUP_CS_BINDLESS)); + fd_context_add_shader_map(ctx, PIPE_SHADER_FRAGMENT, + FD_DIRTY_SHADER_PROG, + BIT(FD6_GROUP_PRIM_MODE_SYSMEM) | BIT(FD6_GROUP_PRIM_MODE_GMEM)); /* NOTE: scissor enabled bit is part of rasterizer state, but * fd_rasterizer_state_bind() will mark scissor dirty if needed: diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c index d84e78a..9d3d91e 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c @@ -662,6 +662,20 @@ fd6_emit_3d_state(struct fd_ringbuffer *ring, struct fd6_emit *emit) case FD6_GROUP_SO: fd6_emit_streamout(ring, emit); break; + case FD6_GROUP_PRIM_MODE_SYSMEM: + state = fd_submit_new_ringbuffer(emit->ctx->batch->submit, 2 * 4, FD_RINGBUFFER_STREAMING); + OUT_PKT4(ring, REG_A6XX_GRAS_SC_CNTL, 1); + OUT_RING(ring, A6XX_GRAS_SC_CNTL_CCUSINGLECACHELINESIZE(2) | + emit->fs->fs.uses_fbfetch_output ? A6XX_GRAS_SC_CNTL_SINGLE_PRIM_MODE(FLUSH_PER_OVERLAP_AND_OVERWRITE) : 0); + fd6_state_take_group(&emit->state, state, FD6_GROUP_PRIM_MODE_SYSMEM); + break; + case FD6_GROUP_PRIM_MODE_GMEM: + state = fd_submit_new_ringbuffer(emit->ctx->batch->submit, 2 * 4, FD_RINGBUFFER_STREAMING); + OUT_PKT4(ring, REG_A6XX_GRAS_SC_CNTL, 1); + OUT_RING(ring, A6XX_GRAS_SC_CNTL_CCUSINGLECACHELINESIZE(2) | + emit->fs->fs.uses_fbfetch_output ? A6XX_GRAS_SC_CNTL_SINGLE_PRIM_MODE(FLUSH_PER_OVERLAP) : 0); + fd6_state_take_group(&emit->state, state, FD6_GROUP_PRIM_MODE_GMEM); + break; case FD6_GROUP_NON_GROUP: fd6_emit_non_ring(ring, emit); break; diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_emit.h b/src/gallium/drivers/freedreno/a6xx/fd6_emit.h index d908eee..5c9a54a 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_emit.h +++ b/src/gallium/drivers/freedreno/a6xx/fd6_emit.h @@ -70,6 +70,8 @@ enum fd6_state_id { FD6_GROUP_DS_BINDLESS, FD6_GROUP_GS_BINDLESS, FD6_GROUP_FS_BINDLESS, + FD6_GROUP_PRIM_MODE_SYSMEM, + FD6_GROUP_PRIM_MODE_GMEM, /* * Virtual state-groups, which don't turn into a CP_SET_DRAW_STATE group @@ -145,6 +147,8 @@ fd6_state_take_group(struct fd6_state *state, struct fd_ringbuffer *stateobj, [FD6_GROUP_PROG_INTERP] = ENABLE_DRAW, [FD6_GROUP_FS_TEX] = ENABLE_DRAW, [FD6_GROUP_FS_BINDLESS] = ENABLE_DRAW, + [FD6_GROUP_PRIM_MODE_SYSMEM] = CP_SET_DRAW_STATE__0_SYSMEM | CP_SET_DRAW_STATE__0_BINNING, + [FD6_GROUP_PRIM_MODE_GMEM] = CP_SET_DRAW_STATE__0_GMEM, }; assert(state->num_groups < ARRAY_SIZE(state->groups)); struct fd6_state_group *g = &state->groups[state->num_groups++]; -- 2.7.4