anv/pipeline: Rework dynamic state handling
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 16 Oct 2015 19:04:13 +0000 (12:04 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 16 Oct 2015 23:30:02 +0000 (16:30 -0700)
Aparently, we had the dynamic state array in the pipeline backwards.
Instead of enabling the bits in the pipeline, it disables them and marks
them as "dynamic".

src/vulkan/anv_meta.c
src/vulkan/anv_pipeline.c
src/vulkan/anv_private.h

index 56a0d4b9d1858fe62ab1c7f818d76b296317c8d9..8f6bc421194c7fa4312773c883702532b9c26efd 100644 (file)
@@ -240,6 +240,11 @@ anv_device_init_meta_clear_state(struct anv_device *device)
             .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
             .primitiveRestartEnable = false,
          },
+         .pViewportState = &(VkPipelineViewportStateCreateInfo) {
+            .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
+            .viewportCount = 1,
+            .scissorCount = 1,
+         },
          .pRasterState = &(VkPipelineRasterStateCreateInfo) {
             .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO,
             .depthClipEnable = true,
@@ -272,6 +277,21 @@ anv_device_init_meta_clear_state(struct anv_device *device)
                     VK_CHANNEL_R_BIT | VK_CHANNEL_G_BIT | VK_CHANNEL_B_BIT },
             }
          },
+         .pDynamicState = &(VkPipelineDynamicStateCreateInfo) {
+            .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
+            .dynamicStateCount = 9,
+            .pDynamicStates = (VkDynamicState[]) {
+               VK_DYNAMIC_STATE_VIEWPORT,
+               VK_DYNAMIC_STATE_SCISSOR,
+               VK_DYNAMIC_STATE_LINE_WIDTH,
+               VK_DYNAMIC_STATE_DEPTH_BIAS,
+               VK_DYNAMIC_STATE_BLEND_CONSTANTS,
+               VK_DYNAMIC_STATE_DEPTH_BOUNDS,
+               VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,
+               VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,
+               VK_DYNAMIC_STATE_STENCIL_REFERENCE,
+            },
+         },
          .flags = 0,
       },
       &(struct anv_graphics_pipeline_create_info) {
@@ -634,6 +654,11 @@ anv_device_init_meta_blit_state(struct anv_device *device)
          .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
          .primitiveRestartEnable = false,
       },
+      .pViewportState = &(VkPipelineViewportStateCreateInfo) {
+         .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
+         .viewportCount = 1,
+         .scissorCount = 1,
+      },
       .pRasterState = &(VkPipelineRasterStateCreateInfo) {
          .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO,
          .depthClipEnable = true,
@@ -650,6 +675,21 @@ anv_device_init_meta_blit_state(struct anv_device *device)
                  VK_CHANNEL_R_BIT | VK_CHANNEL_G_BIT | VK_CHANNEL_B_BIT },
          }
       },
+      .pDynamicState = &(VkPipelineDynamicStateCreateInfo) {
+         .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
+         .dynamicStateCount = 9,
+         .pDynamicStates = (VkDynamicState[]) {
+            VK_DYNAMIC_STATE_VIEWPORT,
+            VK_DYNAMIC_STATE_SCISSOR,
+            VK_DYNAMIC_STATE_LINE_WIDTH,
+            VK_DYNAMIC_STATE_DEPTH_BIAS,
+            VK_DYNAMIC_STATE_BLEND_CONSTANTS,
+            VK_DYNAMIC_STATE_DEPTH_BOUNDS,
+            VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,
+            VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,
+            VK_DYNAMIC_STATE_STENCIL_REFERENCE,
+         },
+      },
       .flags = 0,
       .layout = device->meta_state.blit.pipeline_layout,
    };
index 84e023c781a30ba8998e93c7dc953b2541d803a5..c7f0e6b1b4bb49c90b886eb30804c5c696179d27 100644 (file)
@@ -181,92 +181,83 @@ static void
 anv_pipeline_init_dynamic_state(struct anv_pipeline *pipeline,
                                 const VkGraphicsPipelineCreateInfo *pCreateInfo)
 {
-   pipeline->dynamic_state_mask = 0;
+   uint32_t states = ANV_DYNAMIC_STATE_DIRTY_MASK;
 
-   if (pCreateInfo->pDynamicState == NULL)
-      return;
+   if (pCreateInfo->pDynamicState) {
+      /* Remove all of the states that are marked as dynamic */
+      uint32_t count = pCreateInfo->pDynamicState->dynamicStateCount;
+      for (uint32_t s = 0; s < count; s++)
+         states &= ~(1 << pCreateInfo->pDynamicState->pDynamicStates[s]);
+   }
 
-   uint32_t count = pCreateInfo->pDynamicState->dynamicStateCount;
    struct anv_dynamic_state *dynamic = &pipeline->dynamic_state;
 
-   for (uint32_t s = 0; s < count; s++) {
-      VkDynamicState state = pCreateInfo->pDynamicState->pDynamicStates[s];
-
-      assert(state < 32);
-      pipeline->dynamic_state_mask |= (1u << state);
-
-      switch (state) {
-      case VK_DYNAMIC_STATE_VIEWPORT:
-         assert(pCreateInfo->pViewportState);
-         dynamic->viewport.count = pCreateInfo->pViewportState->viewportCount;
-         typed_memcpy(dynamic->viewport.viewports,
-                      pCreateInfo->pViewportState->pViewports,
-                      pCreateInfo->pViewportState->viewportCount);
-         break;
-
-      case VK_DYNAMIC_STATE_SCISSOR:
-         assert(pCreateInfo->pViewportState);
-         dynamic->scissor.count = pCreateInfo->pViewportState->scissorCount;
-         typed_memcpy(dynamic->scissor.scissors,
-                      pCreateInfo->pViewportState->pScissors,
-                      pCreateInfo->pViewportState->scissorCount);
-         break;
+   dynamic->viewport.count = pCreateInfo->pViewportState->viewportCount;
+   if (states & (1 << VK_DYNAMIC_STATE_VIEWPORT)) {
+      typed_memcpy(dynamic->viewport.viewports,
+                   pCreateInfo->pViewportState->pViewports,
+                   pCreateInfo->pViewportState->viewportCount);
+   }
 
-      case VK_DYNAMIC_STATE_LINE_WIDTH:
-         assert(pCreateInfo->pRasterState);
-         dynamic->line_width = pCreateInfo->pRasterState->lineWidth;
-         break;
+   dynamic->scissor.count = pCreateInfo->pViewportState->scissorCount;
+   if (states & (1 << VK_DYNAMIC_STATE_SCISSOR)) {
+      typed_memcpy(dynamic->scissor.scissors,
+                   pCreateInfo->pViewportState->pScissors,
+                   pCreateInfo->pViewportState->scissorCount);
+   }
 
-      case VK_DYNAMIC_STATE_DEPTH_BIAS:
-         assert(pCreateInfo->pRasterState);
-         dynamic->depth_bias.bias = pCreateInfo->pRasterState->depthBias;
-         dynamic->depth_bias.clamp = pCreateInfo->pRasterState->depthBiasClamp;
-         dynamic->depth_bias.slope_scaled =
-            pCreateInfo->pRasterState->slopeScaledDepthBias;
-         break;
+   if (states & (1 << VK_DYNAMIC_STATE_LINE_WIDTH)) {
+      assert(pCreateInfo->pRasterState);
+      dynamic->line_width = pCreateInfo->pRasterState->lineWidth;
+   }
 
-      case VK_DYNAMIC_STATE_BLEND_CONSTANTS:
-         assert(pCreateInfo->pColorBlendState);
-         typed_memcpy(dynamic->blend_constants,
-                      pCreateInfo->pColorBlendState->blendConst, 4);
-         break;
+   if (states & (1 << VK_DYNAMIC_STATE_DEPTH_BIAS)) {
+      assert(pCreateInfo->pRasterState);
+      dynamic->depth_bias.bias = pCreateInfo->pRasterState->depthBias;
+      dynamic->depth_bias.clamp = pCreateInfo->pRasterState->depthBiasClamp;
+      dynamic->depth_bias.slope_scaled =
+         pCreateInfo->pRasterState->slopeScaledDepthBias;
+   }
 
-      case VK_DYNAMIC_STATE_DEPTH_BOUNDS:
-         assert(pCreateInfo->pDepthStencilState);
-         dynamic->depth_bounds.min =
-            pCreateInfo->pDepthStencilState->minDepthBounds;
-         dynamic->depth_bounds.max =
-            pCreateInfo->pDepthStencilState->maxDepthBounds;
-         break;
+   if (states & (1 << VK_DYNAMIC_STATE_BLEND_CONSTANTS)) {
+      assert(pCreateInfo->pColorBlendState);
+      typed_memcpy(dynamic->blend_constants,
+                   pCreateInfo->pColorBlendState->blendConst, 4);
+   }
 
-      case VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK:
-         assert(pCreateInfo->pDepthStencilState);
-         dynamic->stencil_compare_mask.front =
-            pCreateInfo->pDepthStencilState->front.stencilCompareMask;
-         dynamic->stencil_compare_mask.back =
-            pCreateInfo->pDepthStencilState->back.stencilCompareMask;
-         break;
+   if (states & (1 << VK_DYNAMIC_STATE_DEPTH_BOUNDS)) {
+      assert(pCreateInfo->pDepthStencilState);
+      dynamic->depth_bounds.min =
+         pCreateInfo->pDepthStencilState->minDepthBounds;
+      dynamic->depth_bounds.max =
+         pCreateInfo->pDepthStencilState->maxDepthBounds;
+   }
 
-      case VK_DYNAMIC_STATE_STENCIL_WRITE_MASK:
-         assert(pCreateInfo->pDepthStencilState);
-         dynamic->stencil_write_mask.front =
-            pCreateInfo->pDepthStencilState->front.stencilWriteMask;
-         dynamic->stencil_write_mask.back =
-            pCreateInfo->pDepthStencilState->back.stencilWriteMask;
-         break;
+   if (states & (1 << VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK)) {
+      assert(pCreateInfo->pDepthStencilState);
+      dynamic->stencil_compare_mask.front =
+         pCreateInfo->pDepthStencilState->front.stencilCompareMask;
+      dynamic->stencil_compare_mask.back =
+         pCreateInfo->pDepthStencilState->back.stencilCompareMask;
+   }
 
-      case VK_DYNAMIC_STATE_STENCIL_REFERENCE:
-         assert(pCreateInfo->pDepthStencilState);
-         dynamic->stencil_reference.front =
-            pCreateInfo->pDepthStencilState->front.stencilReference;
-         dynamic->stencil_reference.back =
-            pCreateInfo->pDepthStencilState->back.stencilReference;
-         break;
+   if (states & (1 << VK_DYNAMIC_STATE_STENCIL_WRITE_MASK)) {
+      assert(pCreateInfo->pDepthStencilState);
+      dynamic->stencil_write_mask.front =
+         pCreateInfo->pDepthStencilState->front.stencilWriteMask;
+      dynamic->stencil_write_mask.back =
+         pCreateInfo->pDepthStencilState->back.stencilWriteMask;
+   }
 
-      default:
-         assert(!"Invalid dynamic state");
-      }
+   if (states & (1 << VK_DYNAMIC_STATE_STENCIL_REFERENCE)) {
+      assert(pCreateInfo->pDepthStencilState);
+      dynamic->stencil_reference.front =
+         pCreateInfo->pDepthStencilState->front.stencilReference;
+      dynamic->stencil_reference.back =
+         pCreateInfo->pDepthStencilState->back.stencilReference;
    }
+
+   pipeline->dynamic_state_mask = states;
 }
 
 VkResult
index 6bbf7c0291ba87b24075c684378c8e7a785c2250..d33ca89429c2cde9598b4672fcbfd9e7a26fa482 100644 (file)
@@ -794,6 +794,7 @@ struct anv_buffer {
 #define ANV_DYNAMIC_STENCIL_COMPARE_MASK_DIRTY  (1 << 6)
 #define ANV_DYNAMIC_STENCIL_WRITE_MASK_DIRTY    (1 << 7)
 #define ANV_DYNAMIC_STENCIL_REFERENCE_DIRTY     (1 << 8)
+#define ANV_DYNAMIC_STATE_DIRTY_MASK            ((1 << 9) - 1)
 #define ANV_CMD_BUFFER_PIPELINE_DIRTY           (1 << 9)
 #define ANV_CMD_BUFFER_INDEX_BUFFER_DIRTY       (1 << 10)