anv/allocator: Move the alignment assert for the pointer free list
[mesa.git] / src / intel / vulkan / gen8_pipeline.c
index c9545c898f3ce0e4af22d5617bf26c2d9c2d8bb2..10dd6457fbc99dc9079c8d2e83f24bc38cda2116 100644 (file)
@@ -59,8 +59,8 @@ emit_rs_state(struct anv_pipeline *pipeline,
       .ViewportTransformEnable = !(extra && extra->disable_viewport),
       .TriangleStripListProvokingVertexSelect = 0,
       .LineStripListProvokingVertexSelect = 0,
-      .TriangleFanProvokingVertexSelect = 0,
-      .PointWidthSource = pipeline->writes_point_size ? Vertex : State,
+      .TriangleFanProvokingVertexSelect = 1,
+      .PointWidthSource = Vertex,
       .PointWidth = 1.0,
    };
 
@@ -90,6 +90,9 @@ emit_rs_state(struct anv_pipeline *pipeline,
       .ViewportZFarClipTestEnable = true,
       .ViewportZNearClipTestEnable = true,
 #endif
+      .GlobalDepthOffsetEnableSolid = info->depthBiasEnable,
+      .GlobalDepthOffsetEnableWireframe = info->depthBiasEnable,
+      .GlobalDepthOffsetEnablePoint = info->depthBiasEnable,
    };
 
    GENX(3DSTATE_RASTER_pack)(NULL, pipeline->gen8.raster, &raster);
@@ -224,6 +227,7 @@ emit_ds_state(struct anv_pipeline *pipeline,
       .DoubleSidedStencilEnable = true,
 
       .StencilTestEnable = info->stencilTestEnable,
+      .StencilBufferWriteEnable = info->stencilTestEnable,
       .StencilFailOp = vk_to_gen_stencil_op[info->front.failOp],
       .StencilPassDepthPassOp = vk_to_gen_stencil_op[info->front.passOp],
       .StencilPassDepthFailOp = vk_to_gen_stencil_op[info->front.depthFailOp],
@@ -234,6 +238,14 @@ emit_ds_state(struct anv_pipeline *pipeline,
       .BackfaceStencilTestFunction = vk_to_gen_compare_op[info->back.compareOp],
    };
 
+   /* From the Broadwell PRM:
+    *
+    *    "If Depth_Test_Enable = 1 AND Depth_Test_func = EQUAL, the
+    *    Depth_Write_Enable must be set to 0."
+    */
+   if (info->depthTestEnable && info->depthCompareOp == VK_COMPARE_OP_EQUAL)
+      wm_depth_stencil.DepthBufferWriteEnable = false;
+
    GENX(3DSTATE_WM_DEPTH_STENCIL_pack)(NULL, dw, &wm_depth_stencil);
 }
 
@@ -321,9 +333,24 @@ genX(graphics_pipeline_create)(
 
    emit_urb_setup(pipeline);
 
+   const struct brw_wm_prog_data *wm_prog_data = get_wm_prog_data(pipeline);
    anv_batch_emit(&pipeline->batch, GENX(3DSTATE_CLIP),
                   .ClipEnable = true,
+                  .EarlyCullEnable = true,
+                  .APIMode = 1, /* D3D */
                   .ViewportXYClipTestEnable = !(extra && extra->disable_viewport),
+
+                  .ClipMode =
+                     pCreateInfo->pRasterizationState->rasterizerDiscardEnable ?
+                     REJECT_ALL : NORMAL,
+
+                  .NonPerspectiveBarycentricEnable = wm_prog_data ?
+                     (wm_prog_data->barycentric_interp_modes & 0x38) != 0 : 0,
+
+                  .TriangleStripListProvokingVertexSelect = 0,
+                  .LineStripListProvokingVertexSelect = 0,
+                  .TriangleFanProvokingVertexSelect = 1,
+
                   .MinimumPointWidth = 0.125,
                   .MaximumPointWidth = 255.875,
                   .MaximumVPIndex = pCreateInfo->pViewportState->viewportCount - 1);
@@ -337,15 +364,15 @@ genX(graphics_pipeline_create)(
                   .PointRasterizationRule = RASTRULE_UPPER_RIGHT,
                   .BarycentricInterpolationMode =
                      pipeline->ps_ksp0 == NO_KERNEL ?
-                     0 : pipeline->wm_prog_data.barycentric_interp_modes);
-
-   const struct brw_gs_prog_data *gs_prog_data = &pipeline->gs_prog_data;
-   offset = 1;
-   length = (gs_prog_data->base.vue_map.num_slots + 1) / 2 - offset;
+                     0 : wm_prog_data->barycentric_interp_modes);
 
-   if (pipeline->gs_kernel == NO_KERNEL)
+   if (pipeline->gs_kernel == NO_KERNEL) {
       anv_batch_emit(&pipeline->batch, GENX(3DSTATE_GS), .Enable = false);
-   else
+   } else {
+      const struct brw_gs_prog_data *gs_prog_data = get_gs_prog_data(pipeline);
+      offset = 1;
+      length = (gs_prog_data->base.vue_map.num_slots + 1) / 2 - offset;
+
       anv_batch_emit(&pipeline->batch, GENX(3DSTATE_GS),
                      .SingleProgramFlow = false,
                      .KernelStartPointer = pipeline->gs_kernel,
@@ -386,11 +413,12 @@ genX(graphics_pipeline_create)(
 
                      .VertexURBEntryOutputReadOffset = offset,
                      .VertexURBEntryOutputLength = length);
+   }
 
-   const struct brw_vue_prog_data *vue_prog_data = &pipeline->vs_prog_data.base;
+   const struct brw_vs_prog_data *vs_prog_data = get_vs_prog_data(pipeline);
    /* Skip the VUE header and position slots */
    offset = 1;
-   length = (vue_prog_data->vue_map.num_slots + 1) / 2 - offset;
+   length = (vs_prog_data->base.vue_map.num_slots + 1) / 2 - offset;
 
    uint32_t vs_start = pipeline->vs_simd8 != NO_KERNEL ? pipeline->vs_simd8 :
                                                          pipeline->vs_vec4;
@@ -409,7 +437,7 @@ genX(graphics_pipeline_create)(
                      .VectorMaskEnable = false,
                      .SamplerCount = 0,
                      .BindingTableEntryCount =
-                     vue_prog_data->base.binding_table.size_bytes / 4,
+                        vs_prog_data->base.base.binding_table.size_bytes / 4,
                      .ThreadDispatchPriority = false,
                      .FloatingPointMode = IEEE754,
                      .IllegalOpcodeExceptionEnable = false,
@@ -417,11 +445,11 @@ genX(graphics_pipeline_create)(
                      .SoftwareExceptionEnable = false,
 
                      .ScratchSpaceBasePointer = pipeline->scratch_start[MESA_SHADER_VERTEX],
-                     .PerThreadScratchSpace = scratch_space(&vue_prog_data->base),
+                     .PerThreadScratchSpace = scratch_space(&vs_prog_data->base.base),
 
                      .DispatchGRFStartRegisterForURBData =
-                     vue_prog_data->base.dispatch_grf_start_reg,
-                     .VertexURBEntryReadLength = vue_prog_data->urb_read_length,
+                        vs_prog_data->base.base.dispatch_grf_start_reg,
+                     .VertexURBEntryReadLength = vs_prog_data->base.urb_read_length,
                      .VertexURBEntryReadOffset = 0,
 
                      .MaximumNumberofThreads = device->info.max_vs_threads - 1,
@@ -435,112 +463,13 @@ genX(graphics_pipeline_create)(
                      .UserClipDistanceClipTestEnableBitmask = 0,
                      .UserClipDistanceCullTestEnableBitmask = 0);
 
-   const struct brw_wm_prog_data *wm_prog_data = &pipeline->wm_prog_data;
-
    const int num_thread_bias = GEN_GEN == 8 ? 2 : 1;
    if (pipeline->ps_ksp0 == NO_KERNEL) {
       anv_batch_emit(&pipeline->batch, GENX(3DSTATE_PS));
       anv_batch_emit(&pipeline->batch, GENX(3DSTATE_PS_EXTRA),
                      .PixelShaderValid = false);
    } else {
-      /* TODO: We should clean this up.  Among other things, this is mostly
-       * shared with other gens.
-       */
-      const struct brw_vue_map *fs_input_map;
-      if (pipeline->gs_kernel == NO_KERNEL)
-         fs_input_map = &vue_prog_data->vue_map;
-      else
-         fs_input_map = &gs_prog_data->base.vue_map;
-
-      struct GENX(3DSTATE_SBE_SWIZ) swiz = {
-         GENX(3DSTATE_SBE_SWIZ_header),
-      };
-
-      int max_source_attr = 0;
-      for (int attr = 0; attr < VARYING_SLOT_MAX; attr++) {
-         int input_index = wm_prog_data->urb_setup[attr];
-
-         if (input_index < 0)
-            continue;
-
-         int source_attr = fs_input_map->varying_to_slot[attr];
-         max_source_attr = MAX2(max_source_attr, source_attr);
-
-         if (input_index >= 16)
-            continue;
-
-         if (source_attr == -1) {
-            /* This attribute does not exist in the VUE--that means that the
-             * vertex shader did not write to it.  It could be that it's a
-             * regular varying read by the fragment shader but not written by
-             * the vertex shader or it's gl_PrimitiveID. In the first case the
-             * value is undefined, in the second it needs to be
-             * gl_PrimitiveID.
-             */
-            swiz.Attribute[input_index].ConstantSource = PRIM_ID;
-            swiz.Attribute[input_index].ComponentOverrideX = true;
-            swiz.Attribute[input_index].ComponentOverrideY = true;
-            swiz.Attribute[input_index].ComponentOverrideZ = true;
-            swiz.Attribute[input_index].ComponentOverrideW = true;
-         } else {
-            /* We have to subtract two slots to accout for the URB entry output
-             * read offset in the VS and GS stages.
-             */
-            swiz.Attribute[input_index].SourceAttribute = source_attr - 2;
-         }
-      }
-
-      anv_batch_emit(&pipeline->batch, GENX(3DSTATE_SBE),
-                     .AttributeSwizzleEnable = true,
-                     .ForceVertexURBEntryReadLength = false,
-                     .ForceVertexURBEntryReadOffset = false,
-                     .VertexURBEntryReadLength =
-                        DIV_ROUND_UP(max_source_attr + 1, 2),
-                     .PointSpriteTextureCoordinateOrigin = UPPERLEFT,
-                     .NumberofSFOutputAttributes =
-                     wm_prog_data->num_varying_inputs,
-
-#if GEN_GEN >= 9
-                     .Attribute0ActiveComponentFormat = ACF_XYZW,
-                     .Attribute1ActiveComponentFormat = ACF_XYZW,
-                     .Attribute2ActiveComponentFormat = ACF_XYZW,
-                     .Attribute3ActiveComponentFormat = ACF_XYZW,
-                     .Attribute4ActiveComponentFormat = ACF_XYZW,
-                     .Attribute5ActiveComponentFormat = ACF_XYZW,
-                     .Attribute6ActiveComponentFormat = ACF_XYZW,
-                     .Attribute7ActiveComponentFormat = ACF_XYZW,
-                     .Attribute8ActiveComponentFormat = ACF_XYZW,
-                     .Attribute9ActiveComponentFormat = ACF_XYZW,
-                     .Attribute10ActiveComponentFormat = ACF_XYZW,
-                     .Attribute11ActiveComponentFormat = ACF_XYZW,
-                     .Attribute12ActiveComponentFormat = ACF_XYZW,
-                     .Attribute13ActiveComponentFormat = ACF_XYZW,
-                     .Attribute14ActiveComponentFormat = ACF_XYZW,
-                     .Attribute15ActiveComponentFormat = ACF_XYZW,
-                     /* wow, much field, very attribute */
-                     .Attribute16ActiveComponentFormat = ACF_XYZW,
-                     .Attribute17ActiveComponentFormat = ACF_XYZW,
-                     .Attribute18ActiveComponentFormat = ACF_XYZW,
-                     .Attribute19ActiveComponentFormat = ACF_XYZW,
-                     .Attribute20ActiveComponentFormat = ACF_XYZW,
-                     .Attribute21ActiveComponentFormat = ACF_XYZW,
-                     .Attribute22ActiveComponentFormat = ACF_XYZW,
-                     .Attribute23ActiveComponentFormat = ACF_XYZW,
-                     .Attribute24ActiveComponentFormat = ACF_XYZW,
-                     .Attribute25ActiveComponentFormat = ACF_XYZW,
-                     .Attribute26ActiveComponentFormat = ACF_XYZW,
-                     .Attribute27ActiveComponentFormat = ACF_XYZW,
-                     .Attribute28ActiveComponentFormat = ACF_XYZW,
-                     .Attribute29ActiveComponentFormat = ACF_XYZW,
-                     .Attribute28ActiveComponentFormat = ACF_XYZW,
-                     .Attribute29ActiveComponentFormat = ACF_XYZW,
-                     .Attribute30ActiveComponentFormat = ACF_XYZW,
-#endif
-         );
-
-      uint32_t *dw = anv_batch_emit_dwords(&pipeline->batch,
-                                           GENX(3DSTATE_SBE_SWIZ_length));
-      GENX(3DSTATE_SBE_SWIZ_pack)(&pipeline->batch, dw, &swiz);
+      emit_3dstate_sbe(pipeline);
 
       anv_batch_emit(&pipeline->batch, GENX(3DSTATE_PS),
                      .KernelStartPointer0 = pipeline->ps_ksp0,