diff options
-rw-r--r-- | src/vulkan/anv_meta.c | 40 | ||||
-rw-r--r-- | src/vulkan/anv_pipeline.c | 137 | ||||
-rw-r--r-- | src/vulkan/anv_private.h | 1 |
3 files changed, 105 insertions, 73 deletions
diff --git a/src/vulkan/anv_meta.c b/src/vulkan/anv_meta.c index 56a0d4b9d18..8f6bc421194 100644 --- a/src/vulkan/anv_meta.c +++ b/src/vulkan/anv_meta.c @@ -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, }; diff --git a/src/vulkan/anv_pipeline.c b/src/vulkan/anv_pipeline.c index 84e023c781a..c7f0e6b1b4b 100644 --- a/src/vulkan/anv_pipeline.c +++ b/src/vulkan/anv_pipeline.c @@ -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 diff --git a/src/vulkan/anv_private.h b/src/vulkan/anv_private.h index 6bbf7c0291b..d33ca89429c 100644 --- a/src/vulkan/anv_private.h +++ b/src/vulkan/anv_private.h @@ -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) |