panvk: handle sample mask writes on 1-sample targets
In OpenGL, non-multisample targets always have full coverage, and shader writes to gl_SampleMask are ignored. On Vulkan, sample mask writes on single-sample targets are treated the same way as writes with >1 sample. Fixes dEQP-VK.pipeline.*.multisample_shader_builtin.write_sample_mask.1_samples Signed-off-by: Benjamin Lee <benjamin.lee@collabora.com> Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32636>
This commit is contained in:
@@ -80,6 +80,33 @@ lower_load_poly_line_smooth_enabled(nir_builder *b, nir_intrinsic_instr *intrin,
|
||||
return true;
|
||||
}
|
||||
|
||||
/* From the OpenGL 4.6 spec 14.3.1:
|
||||
*
|
||||
* If MULTISAMPLE is disabled, multisample rasterization of all primitives
|
||||
* is equivalent to single-sample (fragment-center) rasterization, except
|
||||
* that the fragment coverage value is set to full coverage.
|
||||
*
|
||||
* So always use the original sample mask when multisample is disabled */
|
||||
static bool
|
||||
lower_sample_mask_writes(nir_builder *b, nir_intrinsic_instr *intrin,
|
||||
void *data)
|
||||
{
|
||||
if (intrin->intrinsic != nir_intrinsic_store_output)
|
||||
return false;
|
||||
|
||||
if (nir_intrinsic_io_semantics(intrin).location != FRAG_RESULT_SAMPLE_MASK)
|
||||
return false;
|
||||
|
||||
b->cursor = nir_before_instr(&intrin->instr);
|
||||
|
||||
nir_def *orig = nir_load_sample_mask(b);
|
||||
nir_def *new = nir_b32csel(b, nir_load_multisampled_pan(b),
|
||||
intrin->src[0].ssa, orig);
|
||||
nir_src_rewrite(&intrin->src[0], new);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
panfrost_shader_compile(struct panfrost_screen *screen, const nir_shader *ir,
|
||||
struct util_debug_callback *dbg,
|
||||
@@ -148,6 +175,9 @@ panfrost_shader_compile(struct panfrost_screen *screen, const nir_shader *ir,
|
||||
nir_metadata_control_flow, key);
|
||||
NIR_PASS(_, s, nir_lower_alu);
|
||||
}
|
||||
|
||||
NIR_PASS(_, s, nir_shader_intrinsics_pass,
|
||||
lower_sample_mask_writes, nir_metadata_control_flow, NULL);
|
||||
}
|
||||
|
||||
if (dev->arch <= 5 && s->info.stage == MESA_SHADER_FRAGMENT) {
|
||||
|
||||
@@ -2743,12 +2743,6 @@ dEQP-VK.wsi.wayland.swapchain.simulate_oom.min_image_count,Crash
|
||||
dEQP-VK.wsi.wayland.swapchain.simulate_oom.pre_transform,Crash
|
||||
dEQP-VK.wsi.wayland.swapchain.simulate_oom.present_mode,Crash
|
||||
|
||||
|
||||
# New with sampleRateShading
|
||||
dEQP-VK.pipeline.monolithic.multisample_shader_builtin.write_sample_mask.1_samples,Fail
|
||||
dEQP-VK.pipeline.fast_linked_library.multisample_shader_builtin.write_sample_mask.1_samples,Fail
|
||||
dEQP-VK.pipeline.pipeline_library.multisample_shader_builtin.write_sample_mask.1_samples,Fail
|
||||
|
||||
dEQP-VK.dynamic_rendering.primary_cmd_buff.basic.2_cmdbuffers_resuming,Fail
|
||||
dEQP-VK.dynamic_rendering.primary_cmd_buff.basic.2_secondary_2_primary_cmdbuffers_resuming,Fail
|
||||
dEQP-VK.dynamic_rendering.primary_cmd_buff.basic.2_secondary_cmdbuffers_resuming,Fail
|
||||
|
||||
@@ -278,12 +278,9 @@ dEQP-VK.glsl.limits.near_max.fragment_input.components_123,Fail
|
||||
dEQP-VK.glsl.limits.near_max.fragment_input.components_124,Fail
|
||||
|
||||
dEQP-VK.pipeline.monolithic.max_varyings.test_vertex_io_between_vertex_fragment,Fail
|
||||
dEQP-VK.pipeline.monolithic.multisample_shader_builtin.write_sample_mask.1_samples,Fail
|
||||
|
||||
dEQP-VK.pipeline.pipeline_library.max_varyings.test_vertex_io_between_vertex_fragment,Fail
|
||||
|
||||
dEQP-VK.pipeline.pipeline_library.multisample_shader_builtin.write_sample_mask.1_samples,Fail
|
||||
|
||||
dEQP-VK.renderpass.suballocation.attachment_allocation.input_output.63,Fail
|
||||
dEQP-VK.renderpass.multiple_subpasses_multiple_command_buffers.test,Fail
|
||||
dEQP-VK.renderpass2.suballocation.attachment_allocation.input_output.63,Fail
|
||||
@@ -295,8 +292,6 @@ dEQP-VK.spirv_assembly.instruction.graphics.opquantize.too_small_vert,Fail
|
||||
|
||||
dEQP-VK.pipeline.fast_linked_library.max_varyings.test_vertex_io_between_vertex_fragment,Fail
|
||||
|
||||
dEQP-VK.pipeline.fast_linked_library.multisample_shader_builtin.write_sample_mask.1_samples,Fail
|
||||
|
||||
dEQP-VK.glsl.loops.special.do_while_dynamic_iterations.dowhile_trap_vertex,Crash
|
||||
|
||||
dEQP-VK.rasterization.rasterization_order_attachment_access.depth.samples_1.multi_draw_barriers,Crash
|
||||
|
||||
@@ -5105,9 +5105,7 @@ bi_lower_sample_mask_writes(nir_builder *b, nir_intrinsic_instr *intr,
|
||||
|
||||
nir_def *orig = nir_load_sample_mask(b);
|
||||
|
||||
nir_src_rewrite(&intr->src[0],
|
||||
nir_b32csel(b, nir_load_multisampled_pan(b),
|
||||
nir_iand(b, orig, intr->src[0].ssa), orig));
|
||||
nir_src_rewrite(&intr->src[0], nir_iand(b, orig, intr->src[0].ssa));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user