anv: Add a basic implementation of VK_KHX_external_semaphore
[mesa.git] / src / intel / vulkan / genX_state.c
index 900f6dc8eecf7d836593f31b74e36b96551e2e2e..3e6583289b67c6a339e94a3df42ce377017ebb35 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "anv_private.h"
 
+#include "common/gen_sample_positions.h"
 #include "genxml/gen_macros.h"
 #include "genxml/genX_pack.h"
 
@@ -44,97 +45,56 @@ genX(init_device_state)(struct anv_device *device)
    batch.start = batch.next = cmds;
    batch.end = (void *) cmds + sizeof(cmds);
 
-   anv_batch_emit(&batch, GENX(PIPELINE_SELECT),
+   anv_batch_emit(&batch, GENX(PIPELINE_SELECT), ps) {
 #if GEN_GEN >= 9
-                  .MaskBits = 3,
+      ps.MaskBits = 3;
 #endif
-                  .PipelineSelection = _3D);
+      ps.PipelineSelection = _3D;
+   }
 
-   anv_batch_emit(&batch, GENX(3DSTATE_VF_STATISTICS),
-                  .StatisticsEnable = true);
-   anv_batch_emit(&batch, GENX(3DSTATE_HS));
-   anv_batch_emit(&batch, GENX(3DSTATE_TE));
-   anv_batch_emit(&batch, GENX(3DSTATE_DS));
+#if GEN_GEN == 9
+   uint32_t cache_mode_1;
+   anv_pack_struct(&cache_mode_1, GENX(CACHE_MODE_1),
+                   .FloatBlendOptimizationEnable = true,
+                   .FloatBlendOptimizationEnableMask = true,
+                   .PartialResolveDisableInVC = true,
+                   .PartialResolveDisableInVCMask = true);
+
+   anv_batch_emit(&batch, GENX(MI_LOAD_REGISTER_IMM), lri) {
+      lri.RegisterOffset = GENX(CACHE_MODE_1_num);
+      lri.DataDWord      = cache_mode_1;
+   }
+#endif
 
-   anv_batch_emit(&batch, GENX(3DSTATE_STREAMOUT), .SOFunctionEnable = false);
-   anv_batch_emit(&batch, GENX(3DSTATE_AA_LINE_PARAMETERS));
+   anv_batch_emit(&batch, GENX(3DSTATE_AA_LINE_PARAMETERS), aa);
+
+   anv_batch_emit(&batch, GENX(3DSTATE_DRAWING_RECTANGLE), rect) {
+      rect.ClippedDrawingRectangleYMin = 0;
+      rect.ClippedDrawingRectangleXMin = 0;
+      rect.ClippedDrawingRectangleYMax = UINT16_MAX;
+      rect.ClippedDrawingRectangleXMax = UINT16_MAX;
+      rect.DrawingRectangleOriginY = 0;
+      rect.DrawingRectangleOriginX = 0;
+   }
 
 #if GEN_GEN >= 8
-   anv_batch_emit(&batch, GENX(3DSTATE_WM_CHROMAKEY),
-                  .ChromaKeyKillEnable = false);
+   anv_batch_emit(&batch, GENX(3DSTATE_WM_CHROMAKEY), ck);
 
    /* See the Vulkan 1.0 spec Table 24.1 "Standard sample locations" and
     * VkPhysicalDeviceFeatures::standardSampleLocations.
     */
-   anv_batch_emit(&batch, GENX(3DSTATE_SAMPLE_PATTERN),
-      ._1xSample0XOffset      = 0.5,
-      ._1xSample0YOffset      = 0.5,
-      ._2xSample0XOffset      = 0.25,
-      ._2xSample0YOffset      = 0.25,
-      ._2xSample1XOffset      = 0.75,
-      ._2xSample1YOffset      = 0.75,
-      ._4xSample0XOffset      = 0.375,
-      ._4xSample0YOffset      = 0.125,
-      ._4xSample1XOffset      = 0.875,
-      ._4xSample1YOffset      = 0.375,
-      ._4xSample2XOffset      = 0.125,
-      ._4xSample2YOffset      = 0.625,
-      ._4xSample3XOffset      = 0.625,
-      ._4xSample3YOffset      = 0.875,
-      ._8xSample0XOffset      = 0.5625,
-      ._8xSample0YOffset      = 0.3125,
-      ._8xSample1XOffset      = 0.4375,
-      ._8xSample1YOffset      = 0.6875,
-      ._8xSample2XOffset      = 0.8125,
-      ._8xSample2YOffset      = 0.5625,
-      ._8xSample3XOffset      = 0.3125,
-      ._8xSample3YOffset      = 0.1875,
-      ._8xSample4XOffset      = 0.1875,
-      ._8xSample4YOffset      = 0.8125,
-      ._8xSample5XOffset      = 0.0625,
-      ._8xSample5YOffset      = 0.4375,
-      ._8xSample6XOffset      = 0.6875,
-      ._8xSample6YOffset      = 0.9375,
-      ._8xSample7XOffset      = 0.9375,
-      ._8xSample7YOffset      = 0.0625,
+   anv_batch_emit(&batch, GENX(3DSTATE_SAMPLE_PATTERN), sp) {
+      GEN_SAMPLE_POS_1X(sp._1xSample);
+      GEN_SAMPLE_POS_2X(sp._2xSample);
+      GEN_SAMPLE_POS_4X(sp._4xSample);
+      GEN_SAMPLE_POS_8X(sp._8xSample);
 #if GEN_GEN >= 9
-      ._16xSample0XOffset     = 0.5625,
-      ._16xSample0YOffset     = 0.5625,
-      ._16xSample1XOffset     = 0.4375,
-      ._16xSample1YOffset     = 0.3125,
-      ._16xSample2XOffset     = 0.3125,
-      ._16xSample2YOffset     = 0.6250,
-      ._16xSample3XOffset     = 0.7500,
-      ._16xSample3YOffset     = 0.4375,
-      ._16xSample4XOffset     = 0.1875,
-      ._16xSample4YOffset     = 0.3750,
-      ._16xSample5XOffset     = 0.6250,
-      ._16xSample5YOffset     = 0.8125,
-      ._16xSample6XOffset     = 0.8125,
-      ._16xSample6YOffset     = 0.6875,
-      ._16xSample7XOffset     = 0.6875,
-      ._16xSample7YOffset     = 0.1875,
-      ._16xSample8XOffset     = 0.3750,
-      ._16xSample8YOffset     = 0.8750,
-      ._16xSample9XOffset     = 0.5000,
-      ._16xSample9YOffset     = 0.0625,
-      ._16xSample10XOffset    = 0.2500,
-      ._16xSample10YOffset    = 0.1250,
-      ._16xSample11XOffset    = 0.1250,
-      ._16xSample11YOffset    = 0.7500,
-      ._16xSample12XOffset    = 0.0000,
-      ._16xSample12YOffset    = 0.5000,
-      ._16xSample13XOffset    = 0.9375,
-      ._16xSample13YOffset    = 0.2500,
-      ._16xSample14XOffset    = 0.8750,
-      ._16xSample14YOffset    = 0.9375,
-      ._16xSample15XOffset    = 0.0625,
-      ._16xSample15YOffset    = 0.0000,
+      GEN_SAMPLE_POS_16X(sp._16xSample);
 #endif
-   );
+   }
 #endif
 
-   anv_batch_emit(&batch, GENX(MI_BATCH_BUFFER_END));
+   anv_batch_emit(&batch, GENX(MI_BATCH_BUFFER_END), bbe);
 
    assert(batch.next <= batch.end);
 
@@ -148,7 +108,7 @@ vk_to_gen_tex_filter(VkFilter filter, bool anisotropyEnable)
    default:
       assert(!"Invalid filter");
    case VK_FILTER_NEAREST:
-      return MAPFILTER_NEAREST;
+      return anisotropyEnable ? MAPFILTER_ANISOTROPIC : MAPFILTER_NEAREST;
    case VK_FILTER_LINEAR:
       return anisotropyEnable ? MAPFILTER_ANISOTROPIC : MAPFILTER_LINEAR;
    }
@@ -206,7 +166,7 @@ VkResult genX(CreateSampler)(
 
    assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO);
 
-   sampler = anv_alloc2(&device->alloc, pAllocator, sizeof(*sampler), 8,
+   sampler = vk_alloc2(&device->alloc, pAllocator, sizeof(*sampler), 8,
                         VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
    if (!sampler)
       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
@@ -214,6 +174,11 @@ VkResult genX(CreateSampler)(
    uint32_t border_color_offset = device->border_colors.offset +
                                   pCreateInfo->borderColor * 64;
 
+   bool enable_min_filter_addr_rounding =
+      pCreateInfo->minFilter != VK_FILTER_NEAREST;
+   bool enable_mag_filter_addr_rounding =
+      pCreateInfo->magFilter != VK_FILTER_NEAREST;
+
    struct GENX(SAMPLER_STATE) sampler_state = {
       .SamplerDisable = false,
       .TextureBorderColorMode = DX10OGL,
@@ -249,12 +214,12 @@ VkResult genX(CreateSampler)(
 #endif
 
       .MaximumAnisotropy = vk_to_gen_max_anisotropy(pCreateInfo->maxAnisotropy),
-      .RAddressMinFilterRoundingEnable = 0,
-      .RAddressMagFilterRoundingEnable = 0,
-      .VAddressMinFilterRoundingEnable = 0,
-      .VAddressMagFilterRoundingEnable = 0,
-      .UAddressMinFilterRoundingEnable = 0,
-      .UAddressMagFilterRoundingEnable = 0,
+      .RAddressMinFilterRoundingEnable = enable_min_filter_addr_rounding,
+      .RAddressMagFilterRoundingEnable = enable_mag_filter_addr_rounding,
+      .VAddressMinFilterRoundingEnable = enable_min_filter_addr_rounding,
+      .VAddressMagFilterRoundingEnable = enable_mag_filter_addr_rounding,
+      .UAddressMinFilterRoundingEnable = enable_min_filter_addr_rounding,
+      .UAddressMagFilterRoundingEnable = enable_mag_filter_addr_rounding,
       .TrilinearFilterQuality = 0,
       .NonnormalizedCoordinateEnable = pCreateInfo->unnormalizedCoordinates,
       .TCXAddressControlMode = vk_to_gen_tex_address[pCreateInfo->addressModeU],