v3d: Handle the line width intrinsics
authorNeil Roberts <nroberts@igalia.com>
Mon, 22 Jun 2020 07:52:25 +0000 (09:52 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 6 Jul 2020 21:59:16 +0000 (21:59 +0000)
Adds new QUNIFORMs to store the line widths.

v2: Also handle the aa_line_width intrinsic

Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5624>

src/broadcom/compiler/nir_to_vir.c
src/broadcom/compiler/v3d_compiler.h
src/broadcom/compiler/vir_dump.c
src/gallium/drivers/v3d/v3d_uniforms.c

index 3fba318373f25bdcbc94e396d8d3daf33449d147..d95361731cb9339a57d9347133c5ecf1bae5daa1 100644 (file)
@@ -2169,6 +2169,16 @@ ntq_emit_intrinsic(struct v3d_compile *c, nir_intrinsic_instr *instr)
                 ntq_store_dest(c, &instr->dest, 0, vir_MOV(c, c->line_x));
                 break;
 
+        case nir_intrinsic_load_line_width:
+                ntq_store_dest(c, &instr->dest, 0,
+                               vir_uniform(c, QUNIFORM_LINE_WIDTH, 0));
+                break;
+
+        case nir_intrinsic_load_aa_line_width:
+                ntq_store_dest(c, &instr->dest, 0,
+                               vir_uniform(c, QUNIFORM_AA_LINE_WIDTH, 0));
+                break;
+
         case nir_intrinsic_load_sample_mask_in:
                 ntq_store_dest(c, &instr->dest, 0, vir_MSF(c));
                 break;
index 296bd840314d9f0bcc5445d5f896b40354d09466..d6de62486d913c54c8b94517b48980b7da7e94d0 100644 (file)
@@ -261,6 +261,13 @@ enum quniform_contents {
 
         QUNIFORM_ALPHA_REF,
 
+        QUNIFORM_LINE_WIDTH,
+
+        /* The line width sent to hardware. This includes the expanded width
+         * when anti-aliasing is enabled.
+         */
+        QUNIFORM_AA_LINE_WIDTH,
+
         /* Number of workgroups passed to glDispatchCompute in the dimension
          * selected by the data value.
          */
index 9e1ef1e9d4cc9b67e67a9979b68d96dfb095fe4c..daf9e37843fcf23fdccd58dc399cf647ae287eac 100644 (file)
@@ -31,6 +31,8 @@ vir_dump_uniform(enum quniform_contents contents,
 {
         static const char *quniform_names[] = {
                 [QUNIFORM_ALPHA_REF] = "alpha_ref",
+                [QUNIFORM_LINE_WIDTH] = "line_width",
+                [QUNIFORM_AA_LINE_WIDTH] = "aa_line_width",
                 [QUNIFORM_VIEWPORT_X_SCALE] = "vp_x_scale",
                 [QUNIFORM_VIEWPORT_Y_SCALE] = "vp_y_scale",
                 [QUNIFORM_VIEWPORT_Z_OFFSET] = "vp_z_offset",
index ab57880f06f5b5dbb7d359e13b77b8ab580ae9cf..64fde274a998dab0063a44a6d06aec20f14c7c21 100644 (file)
@@ -312,6 +312,12 @@ v3d_write_uniforms(struct v3d_context *v3d, struct v3d_job *job,
                                      v3d->zsa->base.alpha.ref_value);
                         break;
 
+                case QUNIFORM_LINE_WIDTH:
+                case QUNIFORM_AA_LINE_WIDTH:
+                        cl_aligned_f(&uniforms,
+                                     v3d->rasterizer->base.line_width);
+                        break;
+
                 case QUNIFORM_UBO_ADDR: {
                         uint32_t unit = v3d_unit_data_get_unit(data);
                         /* Constant buffer 0 may be a system memory pointer,
@@ -464,6 +470,11 @@ v3d_set_shader_uniform_dirty_flags(struct v3d_compiled_shader *shader)
                         dirty |= VC5_DIRTY_ZSA;
                         break;
 
+                case QUNIFORM_LINE_WIDTH:
+                case QUNIFORM_AA_LINE_WIDTH:
+                        dirty |= VC5_DIRTY_RASTERIZER;
+                        break;
+
                 case QUNIFORM_NUM_WORK_GROUPS:
                 case QUNIFORM_SHARED_OFFSET:
                         /* Compute always recalculates uniforms. */